Add index filtering based on column value type

This commit is contained in:
Yihao Deng 2024-06-26 08:45:14 +00:00
parent 512671df85
commit 58b3dd7b99
2 changed files with 93 additions and 21 deletions

View File

@ -625,28 +625,21 @@ static int32_t sifSetFltParam(SIFParam *left, SIFParam *right, SDataTypeBuf *typ
return 0;
}
static int8_t sifCheckNumericTypeSame(uint8_t left, uint8_t right) {
if (left != right) {
return 0;
}
return 1;
}
static int8_t sifShouldUseIndexBasedOnType(SIFParam *left, SIFParam *right) {
if (left->colValType == TSDB_DATA_TYPE_GEOMETRY || right->colValType == TSDB_DATA_TYPE_GEOMETRY) {
// not compress
if (left->colValType == TSDB_DATA_TYPE_FLOAT) return 0;
if (left->colValType == TSDB_DATA_TYPE_GEOMETRY || right->colValType == TSDB_DATA_TYPE_GEOMETRY ||
left->colValType == TSDB_DATA_TYPE_JSON || right->colValType == TSDB_DATA_TYPE_JSON) {
return 0;
}
if (IS_VAR_DATA_TYPE(left->colValType) && !IS_VAR_DATA_TYPE(right->colValType)) {
return 0;
}
if (IS_NUMERIC_TYPE(left->colValType) && !IS_NUMERIC_TYPE(right->colValType)) {
return 0;
}
if (IS_NUMERIC_TYPE(left->colValType) && IS_NUMERIC_TYPE(right->colValType)) {
if (!sifCheckNumericTypeSame(left->colValType, right->colValType)) {
return 0;
}
}
if (IS_VAR_DATA_TYPE(left->colValType)) {
if (!IS_VAR_DATA_TYPE(right->colValType)) return 0;
} else if (IS_NUMERIC_TYPE(left->colValType)) {
if (!IS_NUMERIC_TYPE(right->colValType)) return 0;
if (left->colValType != right->colValType) return 0;
}
return 1;
}
static int32_t sifDoIndex(SIFParam *left, SIFParam *right, int8_t operType, SIFParam *output) {
@ -666,9 +659,6 @@ static int32_t sifDoIndex(SIFParam *left, SIFParam *right, int8_t operType, SIFP
ret = indexJsonSearch(arg->ivtIdx, mtm, output->result);
indexMultiTermQueryDestroy(mtm);
} else {
// if (left->colValType == TSDB_DATA_TYPE_GEOMETRY || right->colValType == TSDB_DATA_TYPE_GEOMETRY) {
// return TSDB_CODE_QRY_GEO_NOT_SUPPORT_ERROR;
// }
int8_t useIndex = sifShouldUseIndexBasedOnType(left, right);
if (!useIndex) {
output->status = SFLT_NOT_INDEX;

View File

@ -0,0 +1,82 @@
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/exec.sh -n dnode1 -s start
sql connect
print ======== step0
$dbPrefix = ta_3_db
$tbPrefix = ta_3_tb
$mtPrefix = ta_3_mt
$lastRowNum = 0
$tbNum = 100000
$rowNum = 20
$totalNum = 200
print =============== create database
sql create database $dbPrefix
sql use $dbPrefix
sql create table if not exists $mtPrefix (ts timestamp, c1 int) tags (t1 tinyint, t1c tinyint)
$i = 0
$tinyLimit = 127
$tinyTable = tinyTable
while $i < $tinyLimit
$tb = $tinyTable . $i
sql insert into $tb using $mtPrefix tags( $i , $i ) values( now , $i )
$i = $i + 1
endw
$i = 0
$maxTinyLimit = 200
# 1. compress index and no-index to verify resultset
# 2. compress resultset of index filter and scalar filter
while $i < $maxTinyLimit
sql select * from $mtPrefix where t1 <= $i
$lastRowNum = $rows
sql select * from $mtPrefix where t1c <= $i
if $lastRowNum != $rows then
return -1
endi
$i = $i + 1
endw
$tbPrefix = ta_3_tb_c
$mtPrefix = ta_3_mt_c
$colPrefix = 'col'
sql create table if not exists $mtPrefix (ts timestamp, c1 int) tags (t1 nchar(18), t1c nchar(18))
$i = 0
$tinyLimit = 127
while $i < $tinyLimit
$tb = $tbPrefix . $i
sql insert into $tb using $mtPrefix tags( $colPrefix , $colPrefix ) values( now , $i )
$i = $i + 1
endw
$i = 0
$maxTinyLimit = 200
# 1. compress index and no-index to verify resultset
# 2. compress resultset of index filter and scalar filter
while $i < $maxTinyLimit
sql select * from $mtPrefix where t1 <= $i
$lastRowNum = $rows
sql select * from $mtPrefix where t1c <= $i
if $lastRowNum != $rows then
return -1
endi
$i = $i + 1
endw
system sh/exec.sh -n dnode1 -s stop -x SIGINT