From 632f5fbe8f17d02c6bc04cd7bb28824c2a00e2ad Mon Sep 17 00:00:00 2001 From: wangjiaming0909 <604227650@qq.com> Date: Thu, 3 Aug 2023 11:10:43 +0800 Subject: [PATCH] feat: optimize table merge scan when 1 child table --- source/libs/executor/inc/tsort.h | 2 ++ source/libs/executor/src/scanoperator.c | 17 +++++++++----- source/libs/executor/src/tsort.c | 30 ++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/source/libs/executor/inc/tsort.h b/source/libs/executor/inc/tsort.h index 538a9f18f6..57c8bce275 100644 --- a/source/libs/executor/inc/tsort.h +++ b/source/libs/executor/inc/tsort.h @@ -191,6 +191,8 @@ int32_t getProperSortPageSize(size_t rowSize, uint32_t numOfCols); bool tsortIsClosed(SSortHandle* pHandle); void tsortSetClosed(SSortHandle* pHandle); +void setSingleTableMerge(SSortHandle* pHandle); + #ifdef __cplusplus } #endif diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index da4bd1e23c..399bbbf6d0 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2938,17 +2938,22 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) { // one table has one data block int32_t numOfTable = tableEndIdx - tableStartIdx + 1; - STableMergeScanSortSourceParam param = {0}; - param.pOperator = pOperator; + STableMergeScanSortSourceParam *param = taosMemoryCalloc(1, sizeof(STableMergeScanSortSourceParam)); + param->pOperator = pOperator; STableKeyInfo* startKeyInfo = tableListGetInfo(pInfo->base.pTableListInfo, tableStartIdx); pAPI->tsdReader.tsdReaderOpen(pHandle->vnode, &pInfo->base.cond, startKeyInfo, numOfTable, pInfo->pReaderBlock, (void**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo), false, NULL); SSortSource* ps = taosMemoryCalloc(1, sizeof(SSortSource)); - ps->param = ¶m; - ps->onlyRef = true; + ps->param = param; + ps->onlyRef = false; tsortAddSource(pInfo->pSortHandle, ps); - int32_t code = tsortOpen(pInfo->pSortHandle); + int32_t code = TSDB_CODE_SUCCESS; + if (numOfTable == 1) { + setSingleTableMerge(pInfo->pSortHandle); + } else { + code = tsortOpen(pInfo->pSortHandle); + } if (code != TSDB_CODE_SUCCESS) { T_LONG_JMP(pTaskInfo->env, terrno); @@ -3587,4 +3592,4 @@ static void destoryTableCountScanOperator(void* param) { taosArrayDestroy(pTableCountScanInfo->stbUidList); taosMemoryFreeClear(param); -} \ No newline at end of file +} diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 0a8d7ee376..b3e562a141 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -69,8 +69,14 @@ struct SSortHandle { _sort_fetch_block_fn_t fetchfp; _sort_merge_compar_fn_t comparFn; SMultiwayMergeTreeInfo* pMergeTree; + + bool singleTableMerge; }; +void setSingleTableMerge(SSortHandle* pHandle) { + pHandle->singleTableMerge = true; +} + static int32_t msortComparFn(const void* pLeft, const void* pRight, void* param); // | offset[0] | offset[1] |....| nullbitmap | data |...| @@ -1453,6 +1459,26 @@ static STupleHandle* tsortPQSortNextTuple(SSortHandle* pHandle) { return &pHandle->tupleHandle; } +static STupleHandle* tsortSingleTableMergeNextTuple(SSortHandle* pHandle) { + if (1 == pHandle->numOfCompletedSources) return NULL; + if (pHandle->tupleHandle.pBlock && pHandle->tupleHandle.rowIndex + 1 < pHandle->tupleHandle.pBlock->info.rows) { + pHandle->tupleHandle.rowIndex++; + } else { + if (pHandle->tupleHandle.rowIndex == -1) return NULL; + SSortSource** pSource = taosArrayGet(pHandle->pOrderedSource, 0); + SSortSource* source = *pSource; + SSDataBlock* pBlock = pHandle->fetchfp(source->param); + if (!pBlock || pBlock->info.rows == 0) { + setCurrentSourceDone(source, pHandle); + pHandle->tupleHandle.pBlock = NULL; + return NULL; + } + pHandle->tupleHandle.pBlock = pBlock; + pHandle->tupleHandle.rowIndex = 0; + } + return &pHandle->tupleHandle; +} + int32_t tsortOpen(SSortHandle* pHandle) { if (pHandle->opened) { return 0; @@ -1470,7 +1496,9 @@ int32_t tsortOpen(SSortHandle* pHandle) { } STupleHandle* tsortNextTuple(SSortHandle* pHandle) { - if (pHandle->pBoundedQueue) + if (pHandle->singleTableMerge) + return tsortSingleTableMergeNextTuple(pHandle); + else if (pHandle->pBoundedQueue) return tsortPQSortNextTuple(pHandle); else return tsortBufMergeSortNextTuple(pHandle);