diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index 6f9084ce52c3ae2caac867c73f23f40b95bff95f..5707c7cde08b7cdb636924feb87b057160b8102b 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -30,6 +30,8 @@ static void destroyLastrowScanOperator(void* param); static int32_t extractCacheScanSlotId(const SArray* pColMatchInfo, SExecTaskInfo* pTaskInfo, int32_t** pSlotIds); static int32_t removeRedundantTsCol(SLastRowScanPhysiNode* pScanNode, SColMatchInfo* pColMatchInfo); +#define SCAN_ROW_TYPE(_t) ((_t)? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW) + SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo) { int32_t code = TSDB_CODE_SUCCESS; @@ -61,14 +63,14 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe STableListInfo* pTableList = pTaskInfo->pTableInfoList; - initResultSizeInfo(&pOperator->resultInfo, 4096); - blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); + int32_t totalTables = tableListGetSize(pTableList); + int32_t capacity = 0; + pInfo->pUidList = taosArrayInit(4, sizeof(int64_t)); - // partition by tbname, todo opt perf - if (oneTableForEachGroup(pTableList) || (tableListGetSize(pTableList) == 1)) { - pInfo->retrieveType = - CACHESCAN_RETRIEVE_TYPE_ALL | (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW); + // partition by tbname + if (oneTableForEachGroup(pTableList) || (totalTables == 1)) { + pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_ALL | SCAN_ROW_TYPE(pScanNode->ignoreNull); STableKeyInfo* pList = tableListGetInfo(pTableList, 0); @@ -80,13 +82,18 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe goto _error; } + capacity = TMIN(totalTables, 4096); + pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false); - blockDataEnsureCapacity(pInfo->pBufferredRes, pOperator->resultInfo.capacity); + blockDataEnsureCapacity(pInfo->pBufferredRes, capacity); } else { // by tags - pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE | - (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW); + pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE | SCAN_ROW_TYPE(pScanNode->ignoreNull); + capacity = 1; // only one row output } + initResultSizeInfo(&pOperator->resultInfo, capacity); + blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); + if (pScanNode->scan.pScanPseudoCols != NULL) { SExprSupp* p = &pInfo->pseudoExprSup; p->pExprInfo = createExprInfo(pScanNode->scan.pScanPseudoCols, NULL, &p->numOfExprs);