Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
e05a6ca7
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
e05a6ca7
编写于
6月 20, 2022
作者:
S
shenglian-zhou
提交者:
GitHub
6月 20, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #13973 from taosdata/szhou/feature/project-elimation
feature: eliminate projection optimization
上级
e87ae5b1
56b5ff03
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
124 addition
and
18 deletion
+124
-18
source/libs/executor/inc/executil.h
source/libs/executor/inc/executil.h
+1
-1
source/libs/executor/src/dataDispatcher.c
source/libs/executor/src/dataDispatcher.c
+9
-3
source/libs/executor/src/executil.c
source/libs/executor/src/executil.c
+15
-7
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+1
-1
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+4
-4
source/libs/function/src/tudf.c
source/libs/function/src/tudf.c
+5
-0
source/libs/planner/src/planOptimizer.c
source/libs/planner/src/planOptimizer.c
+77
-1
source/libs/planner/src/planUtil.c
source/libs/planner/src/planUtil.c
+1
-0
source/libs/planner/test/planOptimizeTest.cpp
source/libs/planner/test/planOptimizeTest.cpp
+10
-0
source/libs/qworker/src/qworker.c
source/libs/qworker/src/qworker.c
+1
-1
未找到文件。
source/libs/executor/inc/executil.h
浏览文件 @
e05a6ca7
...
...
@@ -114,7 +114,7 @@ SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
SExprInfo
*
createExprInfo
(
SNodeList
*
pNodeList
,
SNodeList
*
pGroupKeys
,
int32_t
*
numOfExprs
);
SqlFunctionCtx
*
createSqlFunctionCtx
(
SExprInfo
*
pExprInfo
,
int32_t
numOfOutput
,
int32_t
**
rowEntryInfoOffset
);
void
relocateColumnData
(
SSDataBlock
*
pBlock
,
const
SArray
*
pColMatchInfo
,
SArray
*
pCols
);
void
relocateColumnData
(
SSDataBlock
*
pBlock
,
const
SArray
*
pColMatchInfo
,
SArray
*
pCols
,
bool
outputEveryColumn
);
void
initExecTimeWindowInfo
(
SColumnInfoData
*
pColData
,
STimeWindow
*
pQueryWindow
);
SInterval
extractIntervalInfo
(
const
STableScanPhysiNode
*
pTableScanNode
);
...
...
source/libs/executor/src/dataDispatcher.c
浏览文件 @
e05a6ca7
...
...
@@ -75,12 +75,18 @@ static bool needCompress(const SSDataBlock* pData, int32_t numOfCols) {
// The length of bitmap is decided by number of rows of this data block, and the length of each column data is
// recorded in the first segment, next to the struct header
static
void
toDataCacheEntry
(
SDataDispatchHandle
*
pHandle
,
const
SInputData
*
pInput
,
SDataDispatchBuf
*
pBuf
)
{
int32_t
numOfCols
=
LIST_LENGTH
(
pHandle
->
pSchema
->
pSlots
);
int32_t
numOfCols
=
0
;
SNode
*
pNode
;
FOREACH
(
pNode
,
pHandle
->
pSchema
->
pSlots
)
{
SSlotDescNode
*
pSlotDesc
=
(
SSlotDescNode
*
)
pNode
;
if
(
pSlotDesc
->
output
)
{
++
numOfCols
;
}
}
SDataCacheEntry
*
pEntry
=
(
SDataCacheEntry
*
)
pBuf
->
pData
;
pEntry
->
compressed
=
(
int8_t
)
needCompress
(
pInput
->
pData
,
numOfCols
);
pEntry
->
numOfRows
=
pInput
->
pData
->
info
.
rows
;
pEntry
->
numOfCols
=
pInput
->
pData
->
info
.
numOfCols
;
pEntry
->
numOfCols
=
numOfCols
;
pEntry
->
dataLen
=
0
;
pBuf
->
useSize
=
sizeof
(
SDataCacheEntry
);
...
...
source/libs/executor/src/executil.c
浏览文件 @
e05a6ca7
...
...
@@ -193,9 +193,9 @@ SSDataBlock* createResDataBlock(SDataBlockDescNode* pNode) {
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumnInfoData
idata
=
{{
0
}};
SSlotDescNode
*
pDescNode
=
(
SSlotDescNode
*
)
nodesListGetNode
(
pNode
->
pSlots
,
i
);
// if (!pDescNode->output) { // todo disable it temporarily
// continue;
// }
// if (!pDescNode->output) { // todo disable it temporarily
// continue;
// }
idata
.
info
.
type
=
pDescNode
->
dataType
.
type
;
idata
.
info
.
bytes
=
pDescNode
->
dataType
.
bytes
;
...
...
@@ -235,7 +235,7 @@ int32_t getTableList(void* metaHandle, SScanPhysiNode* pScanNode, STableListInfo
terrno
=
code
;
return
code
;
}
else
{
qDebug
(
"sucess to get tableIds, size: %d, suid: %"
PRIu64
""
,
(
int
)
taosArrayGetSize
(
res
),
tableUid
);
qDebug
(
"suc
c
ess to get tableIds, size: %d, suid: %"
PRIu64
""
,
(
int
)
taosArrayGetSize
(
res
),
tableUid
);
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
res
);
i
++
)
{
...
...
@@ -319,7 +319,14 @@ SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
continue
;
}
SColMatchInfo
*
info
=
taosArrayGet
(
pList
,
pNode
->
slotId
);
SColMatchInfo
*
info
=
NULL
;
for
(
int32_t
j
=
0
;
j
<
taosArrayGetSize
(
pList
);
++
j
)
{
info
=
taosArrayGet
(
pList
,
j
);
if
(
info
->
targetSlotId
==
pNode
->
slotId
)
{
break
;
}
}
if
(
pNode
->
output
)
{
(
*
numOfOutputCols
)
+=
1
;
}
else
{
...
...
@@ -578,14 +585,15 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput,
}
// NOTE: sources columns are more than the destination SSDatablock columns.
void
relocateColumnData
(
SSDataBlock
*
pBlock
,
const
SArray
*
pColMatchInfo
,
SArray
*
pCols
)
{
// doFilter in table scan needs every column even its output is false
void
relocateColumnData
(
SSDataBlock
*
pBlock
,
const
SArray
*
pColMatchInfo
,
SArray
*
pCols
,
bool
outputEveryColumn
)
{
size_t
numOfSrcCols
=
taosArrayGetSize
(
pCols
);
int32_t
i
=
0
,
j
=
0
;
while
(
i
<
numOfSrcCols
&&
j
<
taosArrayGetSize
(
pColMatchInfo
))
{
SColumnInfoData
*
p
=
taosArrayGet
(
pCols
,
i
);
SColMatchInfo
*
pmInfo
=
taosArrayGet
(
pColMatchInfo
,
j
);
if
(
!
pmInfo
->
output
)
{
if
(
!
outputEveryColumn
&&
!
pmInfo
->
output
)
{
j
++
;
continue
;
}
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
e05a6ca7
...
...
@@ -2086,7 +2086,7 @@ int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, SLoadRemoteDataInfo* pLo
// data from mnode
pRes
->
info
.
rows
=
numOfRows
;
relocateColumnData
(
pRes
,
pColList
,
pBlock
->
pDataBlock
);
relocateColumnData
(
pRes
,
pColList
,
pBlock
->
pDataBlock
,
false
);
taosArrayDestroy
(
pBlock
->
pDataBlock
);
taosMemoryFree
(
pBlock
);
// blockDataDestroy(pBlock);
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
e05a6ca7
...
...
@@ -259,7 +259,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca
return
terrno
;
}
relocateColumnData
(
pBlock
,
pTableScanInfo
->
pColMatchInfo
,
pCols
);
relocateColumnData
(
pBlock
,
pTableScanInfo
->
pColMatchInfo
,
pCols
,
true
);
// currently only the tbname pseudo column
if
(
pTableScanInfo
->
pseudoSup
.
numOfExprs
>
0
)
{
...
...
@@ -1505,7 +1505,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) {
p
->
info
.
rows
=
numOfRows
;
pInfo
->
pRes
->
info
.
rows
=
numOfRows
;
relocateColumnData
(
pInfo
->
pRes
,
pInfo
->
scanCols
,
p
->
pDataBlock
);
relocateColumnData
(
pInfo
->
pRes
,
pInfo
->
scanCols
,
p
->
pDataBlock
,
false
);
doFilterResult
(
pInfo
);
blockDataDestroy
(
p
);
...
...
@@ -1597,7 +1597,7 @@ int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
getPerfDbMeta
(
&
pSysDbTableMeta
,
&
size
);
p
->
info
.
rows
=
buildDbTableInfoBlock
(
p
,
pSysDbTableMeta
,
size
,
TSDB_PERFORMANCE_SCHEMA_DB
);
relocateColumnData
(
pInfo
->
pRes
,
pInfo
->
scanCols
,
p
->
pDataBlock
);
relocateColumnData
(
pInfo
->
pRes
,
pInfo
->
scanCols
,
p
->
pDataBlock
,
false
);
pInfo
->
pRes
->
info
.
rows
=
p
->
info
.
rows
;
blockDataDestroy
(
p
);
...
...
@@ -2079,7 +2079,7 @@ static int32_t loadDataBlockFromOneTable(SOperatorInfo* pOperator, STableMergeSc
return
terrno
;
}
relocateColumnData
(
pBlock
,
pTableScanInfo
->
pColMatchInfo
,
pCols
);
relocateColumnData
(
pBlock
,
pTableScanInfo
->
pColMatchInfo
,
pCols
,
true
);
// currently only the tbname pseudo column
if
(
pTableScanInfo
->
numOfPseudoExpr
>
0
)
{
...
...
source/libs/function/src/tudf.c
浏览文件 @
e05a6ca7
...
...
@@ -972,6 +972,11 @@ void releaseUdfFuncHandle(char* udfName) {
}
int32_t
cleanUpUdfs
()
{
int8_t
initialized
=
atomic_load_8
(
&
gUdfdProxy
.
initialized
);
if
(
!
initialized
)
{
return
TSDB_CODE_SUCCESS
;
}
uv_mutex_lock
(
&
gUdfdProxy
.
udfStubsMutex
);
int32_t
i
=
0
;
SArray
*
udfStubs
=
taosArrayInit
(
16
,
sizeof
(
SUdfcFuncStub
));
...
...
source/libs/planner/src/planOptimizer.c
浏览文件 @
e05a6ca7
...
...
@@ -1082,13 +1082,89 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
return
code
;
}
static
bool
eliminateProjOptMayBeOptimized
(
SLogicNode
*
pNode
)
{
//TODO: enable this optimization after new mechanising that map projection and targets of project node
if
(
NULL
!=
pNode
->
pParent
)
{
return
false
;
}
if
(
QUERY_NODE_LOGIC_PLAN_PROJECT
!=
nodeType
(
pNode
)
||
1
!=
LIST_LENGTH
(
pNode
->
pChildren
))
{
return
false
;
}
SProjectLogicNode
*
pProjectNode
=
(
SProjectLogicNode
*
)
pNode
;
if
(
-
1
!=
pProjectNode
->
limit
||
-
1
!=
pProjectNode
->
slimit
||
-
1
!=
pProjectNode
->
offset
||
-
1
!=
pProjectNode
->
soffset
)
{
return
false
;
}
SHashObj
*
pProjColNameHash
=
taosHashInit
(
16
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_NO_LOCK
);
SNode
*
pProjection
;
FOREACH
(
pProjection
,
pProjectNode
->
pProjections
)
{
SExprNode
*
pExprNode
=
(
SExprNode
*
)
pProjection
;
if
(
QUERY_NODE_COLUMN
!=
nodeType
(
pExprNode
))
{
taosHashCleanup
(
pProjColNameHash
);
return
false
;
}
char
*
projColumnName
=
((
SColumnNode
*
)
pProjection
)
->
colName
;
int32_t
*
pExist
=
taosHashGet
(
pProjColNameHash
,
projColumnName
,
strlen
(
projColumnName
));
if
(
NULL
!=
pExist
)
{
taosHashCleanup
(
pProjColNameHash
);
return
false
;
}
else
{
int32_t
exist
=
1
;
taosHashPut
(
pProjColNameHash
,
projColumnName
,
strlen
(
projColumnName
),
&
exist
,
sizeof
(
exist
));
}
}
taosHashCleanup
(
pProjColNameHash
);
return
true
;
}
static
int32_t
eliminateProjOptimizeImpl
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
,
SProjectLogicNode
*
pProjectNode
)
{
SLogicNode
*
pChild
=
(
SLogicNode
*
)
nodesListGetNode
(
pProjectNode
->
node
.
pChildren
,
0
);
SNodeList
*
pNewChildTargets
=
nodesMakeList
();
SNode
*
pProjection
=
NULL
;
FOREACH
(
pProjection
,
pProjectNode
->
pProjections
)
{
SNode
*
pChildTarget
=
NULL
;
FOREACH
(
pChildTarget
,
pChild
->
pTargets
)
{
if
(
strcmp
(((
SColumnNode
*
)
pProjection
)
->
colName
,
((
SColumnNode
*
)
pChildTarget
)
->
colName
)
==
0
)
{
nodesListAppend
(
pNewChildTargets
,
nodesCloneNode
(
pChildTarget
));
break
;
}
}
}
nodesDestroyList
(
pChild
->
pTargets
);
pChild
->
pTargets
=
pNewChildTargets
;
int32_t
code
=
replaceLogicNode
(
pLogicSubplan
,
(
SLogicNode
*
)
pProjectNode
,
pChild
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
NODES_CLEAR_LIST
(
pProjectNode
->
node
.
pChildren
);
nodesDestroyNode
((
SNode
*
)
pProjectNode
);
}
return
code
;
}
static
int32_t
eliminateProjOptimize
(
SOptimizeContext
*
pCxt
,
SLogicSubplan
*
pLogicSubplan
)
{
SProjectLogicNode
*
pProjectNode
=
(
SProjectLogicNode
*
)
optFindPossibleNode
(
pLogicSubplan
->
pNode
,
eliminateProjOptMayBeOptimized
);
if
(
NULL
==
pProjectNode
)
{
return
TSDB_CODE_SUCCESS
;
}
return
eliminateProjOptimizeImpl
(
pCxt
,
pLogicSubplan
,
pProjectNode
);
}
// clang-format off
static
const
SOptimizeRule
optimizeRuleSet
[]
=
{
{.
pName
=
"OptimizeScanData"
,
.
optimizeFunc
=
osdOptimize
},
{.
pName
=
"ConditionPushDown"
,
.
optimizeFunc
=
cpdOptimize
},
{.
pName
=
"OrderByPrimaryKey"
,
.
optimizeFunc
=
opkOptimize
},
{.
pName
=
"SmaIndex"
,
.
optimizeFunc
=
smaOptimize
},
{.
pName
=
"PartitionByTags"
,
.
optimizeFunc
=
partTagsOptimize
}
{.
pName
=
"PartitionByTags"
,
.
optimizeFunc
=
partTagsOptimize
},
{.
pName
=
"EliminateProject"
,
.
optimizeFunc
=
eliminateProjOptimize
}
};
// clang-format on
...
...
source/libs/planner/src/planUtil.c
浏览文件 @
e05a6ca7
...
...
@@ -107,6 +107,7 @@ int32_t createColumnByRewriteExpr(SNode* pExpr, SNodeList** pList) {
int32_t
replaceLogicNode
(
SLogicSubplan
*
pSubplan
,
SLogicNode
*
pOld
,
SLogicNode
*
pNew
)
{
if
(
NULL
==
pOld
->
pParent
)
{
pSubplan
->
pNode
=
(
SLogicNode
*
)
pNew
;
pNew
->
pParent
=
NULL
;
return
TSDB_CODE_SUCCESS
;
}
...
...
source/libs/planner/test/planOptimizeTest.cpp
浏览文件 @
e05a6ca7
...
...
@@ -52,3 +52,13 @@ TEST_F(PlanOptimizeTest, orderByPrimaryKey) {
run
(
"SELECT COUNT(*) FROM t1 INTERVAL(10S) ORDER BY _WSTARTTS DESC"
);
}
TEST_F
(
PlanOptimizeTest
,
eliminateProjection
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT c1, sum(c3) FROM t1 GROUP BY c1"
);
run
(
"SELECT c1 FROM t1"
);
run
(
"SELECT * FROM st1"
);
run
(
"SELECT c1 FROM st1s3"
);
//run("select 1-abs(c1) from (select unique(c1) c1 from st1s3) order by 1 nulls first");
}
source/libs/qworker/src/qworker.c
浏览文件 @
e05a6ca7
...
...
@@ -533,7 +533,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType, int8_t ex
atomic_store_8
(
&
ctx
->
taskType
,
taskType
);
atomic_store_8
(
&
ctx
->
explain
,
explain
);
/*QW_TASK_DLOGL("subplan json string, len:%d, %s", qwMsg->msgLen, qwMsg->msg);*/
QW_TASK_DLOGL
(
"subplan json string, len:%d, %s"
,
qwMsg
->
msgLen
,
qwMsg
->
msg
);
code
=
qStringToSubplan
(
qwMsg
->
msg
,
&
plan
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录