enh: ins_tables optimize
This commit is contained in:
parent
8b9691ddbf
commit
bc180e39c9
|
@ -315,7 +315,6 @@ typedef struct SScanPhysiNode {
|
||||||
|
|
||||||
typedef SScanPhysiNode STagScanPhysiNode;
|
typedef SScanPhysiNode STagScanPhysiNode;
|
||||||
typedef SScanPhysiNode SBlockDistScanPhysiNode;
|
typedef SScanPhysiNode SBlockDistScanPhysiNode;
|
||||||
typedef SScanPhysiNode STableCountScanPhysiNode;
|
|
||||||
|
|
||||||
typedef struct SLastRowScanPhysiNode {
|
typedef struct SLastRowScanPhysiNode {
|
||||||
SScanPhysiNode scan;
|
SScanPhysiNode scan;
|
||||||
|
@ -324,6 +323,8 @@ typedef struct SLastRowScanPhysiNode {
|
||||||
bool ignoreNull;
|
bool ignoreNull;
|
||||||
} SLastRowScanPhysiNode;
|
} SLastRowScanPhysiNode;
|
||||||
|
|
||||||
|
typedef SLastRowScanPhysiNode STableCountScanPhysiNode;
|
||||||
|
|
||||||
typedef struct SSystemTableScanPhysiNode {
|
typedef struct SSystemTableScanPhysiNode {
|
||||||
SScanPhysiNode scan;
|
SScanPhysiNode scan;
|
||||||
SEpSet mgmtEpSet;
|
SEpSet mgmtEpSet;
|
||||||
|
|
|
@ -4632,9 +4632,9 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return logicPlanToJson(pObj, pJson);
|
return logicPlanToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
|
|
||||||
return physiScanNodeToJson(pObj, pJson);
|
return physiScanNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
|
||||||
return physiLastRowScanNodeToJson(pObj, pJson);
|
return physiLastRowScanNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
|
||||||
|
|
|
@ -2461,17 +2461,51 @@ typedef struct STbCntScanOptInfo {
|
||||||
SName table;
|
SName table;
|
||||||
} STbCntScanOptInfo;
|
} STbCntScanOptInfo;
|
||||||
|
|
||||||
static bool tbCntScanOptIsEligibleAgg(SAggLogicNode* pAgg) {
|
static bool tbCntScanOptIsEligibleGroupKeys(SNodeList* pGroupKeys) {
|
||||||
if (1 != LIST_LENGTH(pAgg->pAggFuncs) || NULL != pAgg->pGroupKeys) {
|
if (NULL == pGroupKeys) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SNode* pGroupKey = NULL;
|
||||||
|
FOREACH(pGroupKey, pGroupKeys) {
|
||||||
|
SNode* pKey = nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0);
|
||||||
|
if (QUERY_NODE_COLUMN != nodeType(pKey)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SFunctionNode* pFunc = (SFunctionNode*)nodesListGetNode(pAgg->pAggFuncs, 0);
|
SColumnNode* pCol = (SColumnNode*)pKey;
|
||||||
if (FUNCTION_TYPE_COUNT != pFunc->funcType) {
|
if (0 != strcmp(pCol->colName, "db_name") && 0 != strcmp(pCol->colName, "stable_name")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool tbCntScanOptNotNullableExpr(SNode* pNode) {
|
||||||
|
if (QUERY_NODE_COLUMN != nodeType(pNode)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const char* pColName = ((SColumnNode*)pNode)->colName;
|
||||||
|
return 0 == strcmp(pColName, "*") || 0 == strcmp(pColName, "db_name") || 0 == strcmp(pColName, "stable_name") ||
|
||||||
|
0 == strcmp(pColName, "table_name");
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool tbCntScanOptIsEligibleAggFuncs(SNodeList* pAggFuncs) {
|
||||||
|
SNode* pNode = NULL;
|
||||||
|
FOREACH(pNode, pAggFuncs) {
|
||||||
|
SFunctionNode* pFunc = (SFunctionNode*)nodesListGetNode(pAggFuncs, 0);
|
||||||
|
if (FUNCTION_TYPE_COUNT != pFunc->funcType ||
|
||||||
|
!tbCntScanOptNotNullableExpr(nodesListGetNode(pFunc->pParameterList, 0))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tbCntScanOptIsEligibleAgg(SAggLogicNode* pAgg) {
|
||||||
|
return tbCntScanOptIsEligibleGroupKeys(pAgg->pGroupKeys) && tbCntScanOptIsEligibleAggFuncs(pAgg->pAggFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
static bool tbCntScanOptGetColValFromCond(SOperatorNode* pOper, SColumnNode** pCol, SValueNode** pVal) {
|
static bool tbCntScanOptGetColValFromCond(SOperatorNode* pOper, SColumnNode** pCol, SValueNode** pVal) {
|
||||||
if (OP_TYPE_EQUAL != pOper->opType) {
|
if (OP_TYPE_EQUAL != pOper->opType) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -2578,17 +2612,25 @@ static SNode* tbCntScanOptCreateTableCountFunc() {
|
||||||
return (SNode*)pFunc;
|
return (SNode*)pFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tbCntScanOptRewriteScan(STbCntScanOptInfo* pInfo, SScanLogicNode* pScan) {
|
static int32_t tbCntScanOptRewriteScan(STbCntScanOptInfo* pInfo) {
|
||||||
pScan->scanType = SCAN_TYPE_TABLE_COUNT;
|
pInfo->pScan->scanType = SCAN_TYPE_TABLE_COUNT;
|
||||||
strcpy(pScan->tableName.dbname, pInfo->table.dbname);
|
strcpy(pInfo->pScan->tableName.dbname, pInfo->table.dbname);
|
||||||
strcpy(pScan->tableName.tname, pInfo->table.tname);
|
strcpy(pInfo->pScan->tableName.tname, pInfo->table.tname);
|
||||||
NODES_DESTORY_LIST(pScan->node.pTargets);
|
NODES_DESTORY_LIST(pInfo->pScan->node.pTargets);
|
||||||
NODES_DESTORY_NODE(pScan->node.pConditions);
|
NODES_DESTORY_NODE(pInfo->pScan->node.pConditions);
|
||||||
NODES_DESTORY_LIST(pScan->pScanCols);
|
NODES_DESTORY_LIST(pInfo->pScan->pScanCols);
|
||||||
NODES_DESTORY_LIST(pScan->pScanPseudoCols);
|
NODES_DESTORY_LIST(pInfo->pScan->pScanPseudoCols);
|
||||||
int32_t code = nodesListMakeStrictAppend(&pScan->pScanPseudoCols, tbCntScanOptCreateTableCountFunc());
|
int32_t code = nodesListMakeStrictAppend(&pInfo->pScan->pScanPseudoCols, tbCntScanOptCreateTableCountFunc());
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = createColumnByRewriteExpr(nodesListGetNode(pScan->pScanPseudoCols, 0), &pScan->node.pTargets);
|
code = createColumnByRewriteExpr(nodesListGetNode(pInfo->pScan->pScanPseudoCols, 0), &pInfo->pScan->node.pTargets);
|
||||||
|
}
|
||||||
|
SNode* pGroupKey = NULL;
|
||||||
|
FOREACH(pGroupKey, pInfo->pAgg->pGroupKeys) {
|
||||||
|
code = nodesListMakeStrictAppend(
|
||||||
|
&pInfo->pScan->pGroupTags, nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0)));
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2621,6 +2663,7 @@ static int32_t tbCntScanOptRewriteAgg(SAggLogicNode* pAgg) {
|
||||||
NODES_DESTORY_LIST(pAgg->pAggFuncs);
|
NODES_DESTORY_LIST(pAgg->pAggFuncs);
|
||||||
code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pSum);
|
code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pSum);
|
||||||
}
|
}
|
||||||
|
NODES_DESTORY_LIST(pAgg->pGroupKeys);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2630,7 +2673,7 @@ static int32_t tableCountScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLo
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = tbCntScanOptRewriteScan(&info, info.pScan);
|
int32_t code = tbCntScanOptRewriteScan(&info);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tbCntScanOptRewriteAgg(info.pAgg);
|
code = tbCntScanOptRewriteAgg(info.pAgg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -526,6 +526,24 @@ static int32_t createLastRowScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSu
|
||||||
pScan->ignoreNull = pScanLogicNode->igLastNull;
|
pScan->ignoreNull = pScanLogicNode->igLastNull;
|
||||||
vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode);
|
vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode);
|
||||||
|
|
||||||
|
return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t createTableCountScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan,
|
||||||
|
SScanLogicNode* pScanLogicNode, SPhysiNode** pPhyNode) {
|
||||||
|
STableCountScanPhysiNode* pScan = (STableCountScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN);
|
||||||
|
if (NULL == pScan) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags);
|
||||||
|
if (NULL != pScanLogicNode->pGroupTags && NULL == pScan->pGroupTags) {
|
||||||
|
nodesDestroyNode((SNode*)pScan);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pScan->groupSort = pScanLogicNode->groupSort;
|
||||||
vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode);
|
vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode);
|
||||||
|
|
||||||
return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode);
|
return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode);
|
||||||
|
@ -624,8 +642,9 @@ static int32_t createScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubplan,
|
||||||
switch (pScanLogicNode->scanType) {
|
switch (pScanLogicNode->scanType) {
|
||||||
case SCAN_TYPE_TAG:
|
case SCAN_TYPE_TAG:
|
||||||
case SCAN_TYPE_BLOCK_INFO:
|
case SCAN_TYPE_BLOCK_INFO:
|
||||||
case SCAN_TYPE_TABLE_COUNT:
|
|
||||||
return createSimpleScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
|
return createSimpleScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
|
||||||
|
case SCAN_TYPE_TABLE_COUNT:
|
||||||
|
return createTableCountScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
|
||||||
case SCAN_TYPE_LAST_ROW:
|
case SCAN_TYPE_LAST_ROW:
|
||||||
return createLastRowScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
|
return createLastRowScanPhysiNode(pCxt, pSubplan, pScanLogicNode, pPhyNode);
|
||||||
case SCAN_TYPE_TABLE:
|
case SCAN_TYPE_TABLE:
|
||||||
|
|
Loading…
Reference in New Issue