From c00ff3ff9677191f529410787bccd5864f4336f0 Mon Sep 17 00:00:00 2001 From: wpan Date: Thu, 5 Aug 2021 18:28:58 +0800 Subject: [PATCH] improve performance --- src/query/inc/qFilter.h | 10 ++-- src/query/src/qFilter.c | 123 +++++++++++++++++++++++++++++++++------- src/util/inc/tcompare.h | 32 +++++++++++ src/util/src/tcompare.c | 6 +- 4 files changed, 143 insertions(+), 28 deletions(-) diff --git a/src/query/inc/qFilter.h b/src/query/inc/qFilter.h index ba65360624..7a7b3157ea 100644 --- a/src/query/inc/qFilter.h +++ b/src/query/inc/qFilter.h @@ -181,7 +181,7 @@ typedef struct SFilterColCtx { } SFilterColCtx; typedef struct SFilterCompare { - int32_t type; + uint8_t type; uint8_t optr; uint8_t optr2; } SFilterCompare; @@ -194,14 +194,14 @@ typedef struct SFilterUnit { } SFilterUnit; typedef struct SFilterComUnit { - __compar_fn_t func; - rangeCompFunc rfunc; void *colData; void *valData; void *valData2; - int32_t dataType; uint16_t dataSize; - uint16_t optr; + uint8_t dataType; + uint8_t optr; + int8_t func; + int8_t rfunc; } SFilterComUnit; typedef struct SFilterPCtx { diff --git a/src/query/src/qFilter.c b/src/query/src/qFilter.c index d6e69bb480..1171bb0896 100644 --- a/src/query/src/qFilter.c +++ b/src/query/src/qFilter.c @@ -114,41 +114,123 @@ rangeCompFunc filterGetRangeCompFunc(char sflag, char eflag) { return filterRangeCompii; } -rangeCompFunc filterGetRangeCompFuncFromOptrs(uint8_t optr, uint8_t optr2) { +rangeCompFunc gRangeCompare[] = {filterRangeCompee, filterRangeCompei, filterRangeCompie, filterRangeCompii, filterRangeCompGe, + filterRangeCompGi, filterRangeCompLe, filterRangeCompLi}; + + +int8_t filterGetRangeCompFuncFromOptrs(uint8_t optr, uint8_t optr2) { if (optr2) { assert(optr2 == TSDB_RELATION_LESS || optr2 == TSDB_RELATION_LESS_EQUAL); if (optr == TSDB_RELATION_GREATER) { if (optr2 == TSDB_RELATION_LESS) { - return filterRangeCompee; + return 0; } - return filterRangeCompei; + return 1; } if (optr2 == TSDB_RELATION_LESS) { - return filterRangeCompie; + return 2; } - return filterRangeCompii; + return 3; } else { switch (optr) { case TSDB_RELATION_GREATER: - return filterRangeCompGe; + return 4; case TSDB_RELATION_GREATER_EQUAL: - return filterRangeCompGi; + return 5; case TSDB_RELATION_LESS: - return filterRangeCompLe; + return 6; case TSDB_RELATION_LESS_EQUAL: - return filterRangeCompLi; + return 7; default: break; } } - return NULL; + return -1; } +__compar_fn_t gDataCompare[] = {compareInt32Val, compareInt8Val, compareInt16Val, compareInt64Val, compareFloatVal, + compareDoubleVal, compareLenPrefixedStr, compareStrPatternComp, compareFindItemInSet, compareWStrPatternComp, + compareLenPrefixedWStr, compareUint8Val, compareUint16Val, compareUint32Val, compareUint64Val, + setCompareBytes1, setCompareBytes2, setCompareBytes4, setCompareBytes8 +}; + +int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) { + int8_t comparFn = 0; + + if (optr == TSDB_RELATION_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) { + switch (type) { + case TSDB_DATA_TYPE_BOOL: + case TSDB_DATA_TYPE_TINYINT: + case TSDB_DATA_TYPE_UTINYINT: + return 15; + case TSDB_DATA_TYPE_SMALLINT: + case TSDB_DATA_TYPE_USMALLINT: + return 16; + case TSDB_DATA_TYPE_INT: + case TSDB_DATA_TYPE_UINT: + case TSDB_DATA_TYPE_FLOAT: + return 17; + case TSDB_DATA_TYPE_BIGINT: + case TSDB_DATA_TYPE_UBIGINT: + case TSDB_DATA_TYPE_DOUBLE: + case TSDB_DATA_TYPE_TIMESTAMP: + return 18; + default: + assert(0); + } + } + + switch (type) { + case TSDB_DATA_TYPE_BOOL: + case TSDB_DATA_TYPE_TINYINT: comparFn = 1; break; + case TSDB_DATA_TYPE_SMALLINT: comparFn = 2; break; + case TSDB_DATA_TYPE_INT: comparFn = 0; break; + case TSDB_DATA_TYPE_BIGINT: + case TSDB_DATA_TYPE_TIMESTAMP: comparFn = 3; break; + case TSDB_DATA_TYPE_FLOAT: comparFn = 4; break; + case TSDB_DATA_TYPE_DOUBLE: comparFn = 5; break; + case TSDB_DATA_TYPE_BINARY: { + if (optr == TSDB_RELATION_LIKE) { /* wildcard query using like operator */ + comparFn = 7; + } else if (optr == TSDB_RELATION_IN) { + comparFn = 8; + } else { /* normal relational comparFn */ + comparFn = 6; + } + + break; + } + + case TSDB_DATA_TYPE_NCHAR: { + if (optr == TSDB_RELATION_LIKE) { + comparFn = 9; + } else if (optr == TSDB_RELATION_IN) { + comparFn = 8; + } else { + comparFn = 10; + } + break; + } + + case TSDB_DATA_TYPE_UTINYINT: comparFn = 11; break; + case TSDB_DATA_TYPE_USMALLINT: comparFn = 12;break; + case TSDB_DATA_TYPE_UINT: comparFn = 13;break; + case TSDB_DATA_TYPE_UBIGINT: comparFn = 14;break; + + default: + comparFn = 0; + break; + } + + return comparFn; +} + + static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) { SFilterGroupCtx *left = *((SFilterGroupCtx**)pLeft), *right = *((SFilterGroupCtx**)pRight); if (left->colNum > right->colNum) return 1; @@ -1392,6 +1474,7 @@ _return: return code; } +#if 0 int32_t filterInitUnitFunc(SFilterInfo *info) { for (uint16_t i = 0; i < info->unitNum; ++i) { SFilterUnit* unit = &info->units[i]; @@ -1401,7 +1484,7 @@ int32_t filterInitUnitFunc(SFilterInfo *info) { return TSDB_CODE_SUCCESS; } - +#endif void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options) { @@ -2406,7 +2489,7 @@ int32_t filterGenerateComInfo(SFilterInfo *info) { for (uint16_t i = 0; i < info->unitNum; ++i) { SFilterUnit *unit = &info->units[i]; - info->cunits[i].func = getComparFunc(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr); + info->cunits[i].func = filterGetCompFuncIdx(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr); info->cunits[i].rfunc = filterGetRangeCompFuncFromOptrs(unit->compare.optr, unit->compare.optr2); info->cunits[i].optr = FILTER_UNIT_OPTR(unit); info->cunits[i].colData = NULL; @@ -2500,10 +2583,10 @@ bool filterExecuteImplRange(void *pinfo, int32_t numOfRows, int8_t* p) { bool all = true; uint16_t dataSize = info->cunits[0].dataSize; char *colData = (char *)info->cunits[0].colData; - rangeCompFunc rfunc = info->cunits[0].rfunc; + rangeCompFunc rfunc = gRangeCompare[info->cunits[0].rfunc]; void *valData = info->cunits[0].valData; void *valData2 = info->cunits[0].valData2; - __compar_fn_t func = info->cunits[0].func; + __compar_fn_t func = gDataCompare[info->cunits[0].func]; for (int32_t i = 0; i < numOfRows; ++i) { if (isNull(colData, info->cunits[0].dataType)) { @@ -2536,7 +2619,7 @@ bool filterExecuteImplMisc(void *pinfo, int32_t numOfRows, int8_t* p) { continue; } - p[i] = filterDoCompare(info->cunits[uidx].func, info->cunits[uidx].optr, colData, info->cunits[uidx].valData); + p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, colData, info->cunits[uidx].valData); if (p[i] == 0) { all = false; @@ -2573,10 +2656,10 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, int8_t* p) { p[i] = 1; } else if (optr == TSDB_RELATION_ISNULL) { p[i] = 0; - } else if (cunit->rfunc) { - p[i] = (*cunit->rfunc)(colData, colData, cunit->valData, cunit->valData2, cunit->func); + } else if (cunit->rfunc >= 0) { + p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2, gDataCompare[cunit->func]); } else { - p[i] = filterDoCompare(cunit->func, cunit->optr, colData, cunit->valData); + p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData); } //FILTER_UNIT_SET_R(info, uidx, p[i]); @@ -2631,7 +2714,7 @@ int32_t filterSetExecFunc(SFilterInfo *info) { return TSDB_CODE_SUCCESS; } - if (info->cunits[0].rfunc) { + if (info->cunits[0].rfunc >= 0) { info->func = filterExecuteImplRange; return TSDB_CODE_SUCCESS; } @@ -2746,7 +2829,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option return code; } - ERR_JRET(filterInitUnitFunc(info)); + //ERR_JRET(filterInitUnitFunc(info)); } info->unitRes = malloc(info->unitNum * sizeof(*info->unitRes)); diff --git a/src/util/inc/tcompare.h b/src/util/inc/tcompare.h index 612ce7ede0..baa09bfde6 100644 --- a/src/util/inc/tcompare.h +++ b/src/util/inc/tcompare.h @@ -53,6 +53,38 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr); int32_t taosArrayCompareString(const void* a, const void* b); +int32_t setCompareBytes1(const void *pLeft, const void *pRight); + +int32_t setCompareBytes2(const void *pLeft, const void *pRight); + +int32_t setCompareBytes4(const void *pLeft, const void *pRight); +int32_t setCompareBytes8(const void *pLeft, const void *pRight); + +int32_t compareInt32Val(const void *pLeft, const void *pRight); +int32_t compareInt64Val(const void *pLeft, const void *pRight); + +int32_t compareInt16Val(const void *pLeft, const void *pRight); + +int32_t compareInt8Val(const void *pLeft, const void *pRight); + +int32_t compareUint32Val(const void *pLeft, const void *pRight); +int32_t compareUint64Val(const void *pLeft, const void *pRight); + +int32_t compareUint16Val(const void *pLeft, const void *pRight); + +int32_t compareUint8Val(const void* pLeft, const void* pRight); + +int32_t compareFloatVal(const void *pLeft, const void *pRight); + +int32_t compareDoubleVal(const void *pLeft, const void *pRight); + +int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight); + +int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight); +int32_t compareStrPatternComp(const void* pLeft, const void* pRight); +int32_t compareFindItemInSet(const void *pLeft, const void* pRight); +int32_t compareWStrPatternComp(const void* pLeft, const void* pRight); + #ifdef __cplusplus } #endif diff --git a/src/util/src/tcompare.c b/src/util/src/tcompare.c index 6d4d6dc0b8..7577451f88 100644 --- a/src/util/src/tcompare.c +++ b/src/util/src/tcompare.c @@ -278,7 +278,7 @@ int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, c return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH; } -static int32_t compareStrPatternComp(const void* pLeft, const void* pRight) { +int32_t compareStrPatternComp(const void* pLeft, const void* pRight) { SPatternCompareInfo pInfo = {'%', '_'}; char pattern[128] = {0}; @@ -306,11 +306,11 @@ int32_t taosArrayCompareString(const void* a, const void* b) { // const SArray* arr = (const SArray*) pRight; // return taosArraySearchString(arr, pLeft, taosArrayCompareString, TD_EQ) == NULL ? 0 : 1; //} -static int32_t compareFindItemInSet(const void *pLeft, const void* pRight) { +int32_t compareFindItemInSet(const void *pLeft, const void* pRight) { return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0; } -static int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) { +int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) { SPatternCompareInfo pInfo = {'%', '_'}; wchar_t pattern[128] = {0};