版本v2.1.5
假设表中有A,B,C,D共4个字段,对A和B建立了倒排索引,C和D未建立倒排索引
以下查询已省略具体的过滤条件,新老优化器测试结果一致
No.1 select * from table where (A and B) and (C or D) -- 可以命中倒排
No.2 select * from table where (A or B) and (C and D) -- 可以命中倒排
No.3 select * from table where (A or B) and (C or D) -- 无法命中倒排
业务的查询模型是No.3查询
对于No.3查询,目前发现两种改写方式可以使其命中倒排索引:
1. (A or B)使用Union代替
select * from table where A and not B and (C or D)
union all
select * from table where not A and B and (C or D)
union all
select * from table where A and B and (C or D)
2. (C or D)使用CASE WHEN代替
select * from table where A or B and (
case when C then 1 when D then 1 else 0 end
) = 1
Question
- 请问为什么第3个查询无法利用倒排索引加速?按逻辑来说应该是可以通过(A or B)构建docid List尽而直接过滤掉绝大部分数据的。但是从Query Profile来看,RawRowRead非常大且RowsInvertedIndexFiltered为0,希望优化器可以完成这样的逻辑推断