Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
421c8eaf
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
421c8eaf
编写于
7月 28, 2022
作者:
X
Xiaoyu Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: last function optimize
上级
7788bcb1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
74 addition
and
10 deletion
+74
-10
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+72
-10
source/libs/planner/test/planOptimizeTest.cpp
source/libs/planner/test/planOptimizeTest.cpp
+2
-0
未找到文件。
source/libs/planner/src/planOptimizer.c
浏览文件 @
421c8eaf
...
...
@@ -38,10 +38,13 @@ typedef struct SOptimizeRule {
FOptimize
optimizeFunc
;
}
SOptimizeRule
;
typedef
enum
EScanOrder
{
SCAN_ORDER_ASC
=
1
,
SCAN_ORDER_DESC
,
SCAN_ORDER_BOTH
}
EScanOrder
;
typedef
struct
SOsdInfo
{
SScanLogicNode
*
pScan
;
SNodeList
*
pSdrFuncs
;
SNodeList
*
pDsoFuncs
;
EScanOrder
scanOrder
;
}
SOsdInfo
;
typedef
struct
SCpdIsMultiTableCondCxt
{
...
...
@@ -179,16 +182,18 @@ static int32_t scanPathOptGetRelatedFuncs(SScanLogicNode* pScan, SNodeList** pSd
SNodeList
*
pAllFuncs
=
scanPathOptGetAllFuncs
(
pScan
->
node
.
pParent
);
SNodeList
*
pTmpSdrFuncs
=
NULL
;
SNodeList
*
pTmpDsoFuncs
=
NULL
;
SNode
*
p
Func
=
NULL
;
SNode
*
p
Node
=
NULL
;
bool
otherFunc
=
false
;
FOREACH
(
pFunc
,
pAllFuncs
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
scanPathOptNeedOptimizeDataRequire
((
SFunctionNode
*
)
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpSdrFuncs
,
nodesCloneNode
(
pFunc
));
}
else
if
(
scanPathOptNeedDynOptimize
((
SFunctionNode
*
)
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpDsoFuncs
,
nodesCloneNode
(
pFunc
));
FOREACH
(
pNode
,
pAllFuncs
)
{
SFunctionNode
*
pFunc
=
(
SFunctionNode
*
)
pNode
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
scanPathOptNeedOptimizeDataRequire
(
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpSdrFuncs
,
nodesCloneNode
(
pNode
));
}
else
if
(
scanPathOptNeedDynOptimize
(
pFunc
))
{
code
=
nodesListMakeStrictAppend
(
&
pTmpDsoFuncs
,
nodesCloneNode
(
pNode
));
}
else
{
otherFunc
=
true
;
break
;
}
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
nodesDestroyList
(
pTmpSdrFuncs
);
...
...
@@ -206,12 +211,46 @@ static int32_t scanPathOptGetRelatedFuncs(SScanLogicNode* pScan, SNodeList** pSd
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
scanPathOptGetScanOrder
(
SScanLogicNode
*
pScan
,
EScanOrder
*
pScanOrder
)
{
SNodeList
*
pAllFuncs
=
scanPathOptGetAllFuncs
(
pScan
->
node
.
pParent
);
SNode
*
pNode
=
NULL
;
bool
hasFirst
=
false
;
bool
hasLast
=
false
;
bool
otherFunc
=
false
;
FOREACH
(
pNode
,
pAllFuncs
)
{
SFunctionNode
*
pFunc
=
(
SFunctionNode
*
)
pNode
;
if
(
FUNCTION_TYPE_FIRST
==
pFunc
->
funcType
)
{
hasFirst
=
true
;
}
else
if
(
FUNCTION_TYPE_LAST
==
pFunc
->
funcType
)
{
hasLast
=
true
;
}
else
if
(
FUNCTION_TYPE_SELECT_VALUE
!=
pFunc
->
funcType
)
{
otherFunc
=
true
;
}
}
if
(
hasFirst
&&
hasLast
&&
!
otherFunc
)
{
*
pScanOrder
=
SCAN_ORDER_BOTH
;
}
else
if
(
hasLast
)
{
*
pScanOrder
=
SCAN_ORDER_DESC
;
}
else
{
*
pScanOrder
=
SCAN_ORDER_ASC
;
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
scanPathOptSetOsdInfo
(
SOsdInfo
*
pInfo
)
{
int32_t
code
=
scanPathOptGetRelatedFuncs
(
pInfo
->
pScan
,
&
pInfo
->
pSdrFuncs
,
&
pInfo
->
pDsoFuncs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
scanPathOptGetScanOrder
(
pInfo
->
pScan
,
&
pInfo
->
scanOrder
);
}
return
code
;
}
static
int32_t
scanPathOptMatch
(
SOptimizeContext
*
pCxt
,
SLogicNode
*
pLogicNode
,
SOsdInfo
*
pInfo
)
{
pInfo
->
pScan
=
(
SScanLogicNode
*
)
optFindPossibleNode
(
pLogicNode
,
scanPathOptMayBeOptimized
);
if
(
NULL
==
pInfo
->
pScan
)
{
return
TSDB_CODE_SUCCESS
;
}
return
scanPathOpt
GetRelatedFuncs
(
pInfo
->
pScan
,
&
pInfo
->
pSdrFuncs
,
&
pInfo
->
pDsoFuncs
);
return
scanPathOpt
SetOsdInfo
(
pInfo
);
}
static
EFuncDataRequired
scanPathOptPromoteDataRequired
(
EFuncDataRequired
l
,
EFuncDataRequired
r
)
{
...
...
@@ -258,11 +297,34 @@ static void scanPathOptSetScanWin(SScanLogicNode* pScan) {
}
}
static
void
scanPathOptSetScanOrder
(
EScanOrder
scanOrder
,
SScanLogicNode
*
pScan
)
{
if
(
pScan
->
scanSeq
[
0
]
>
1
||
pScan
->
scanSeq
[
1
]
>
1
)
{
return
;
}
switch
(
scanOrder
)
{
case
SCAN_ORDER_ASC
:
pScan
->
scanSeq
[
0
]
=
1
;
pScan
->
scanSeq
[
1
]
=
0
;
break
;
case
SCAN_ORDER_DESC
:
pScan
->
scanSeq
[
0
]
=
0
;
pScan
->
scanSeq
[
1
]
=
1
;
break
;
case
SCAN_ORDER_BOTH
:
pScan
->
scanSeq
[
0
]
=
1
;
pScan
->
scanSeq
[
1
]
=
1
;
break
;
default:
break
;
}
}
static
int32_t
scanPathOptimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
SOsdInfo
info
=
{
0
};
SOsdInfo
info
=
{
.
scanOrder
=
SCAN_ORDER_ASC
};
int32_t
code
=
scanPathOptMatch
(
pCxt
,
pLogicSubplan
->
pNode
,
&
info
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
info
.
pScan
)
{
scanPathOptSetScanWin
((
SScanLogicNode
*
)
info
.
pScan
);
scanPathOptSetScanWin
(
info
.
pScan
);
scanPathOptSetScanOrder
(
info
.
scanOrder
,
info
.
pScan
);
}
if
(
TSDB_CODE_SUCCESS
==
code
&&
(
NULL
!=
info
.
pDsoFuncs
||
NULL
!=
info
.
pSdrFuncs
))
{
info
.
pScan
->
dataRequired
=
scanPathOptGetDataRequired
(
info
.
pSdrFuncs
);
...
...
source/libs/planner/test/planOptimizeTest.cpp
浏览文件 @
421c8eaf
...
...
@@ -30,6 +30,8 @@ TEST_F(PlanOptimizeTest, scanPath) {
run
(
"SELECT COUNT(CAST(c1 AS BIGINT)) FROM t1"
);
run
(
"SELECT PERCENTILE(c1, 40), COUNT(*) FROM t1"
);
run
(
"SELECT LAST(c1) FROM t1"
);
}
TEST_F
(
PlanOptimizeTest
,
pushDownCondition
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录