倒排索引在部分查询中索引失效

Viewed 146

版本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

  1. 请问为什么第3个查询无法利用倒排索引加速?按逻辑来说应该是可以通过(A or B)构建docid List尽而直接过滤掉绝大部分数据的。但是从Query Profile来看,RawRowRead非常大且RowsInvertedIndexFiltered为0,希望优化器可以完成这样的逻辑推断
1 Answers

【问题状态】已经修复
【问题处理】当前倒排索引处理 (A or B) and (C or D)这种compound查询的时候,会对(A or B)生成索引结果,但不会提前过滤,后续执行expr的时候会根据索引结果进行快路径优化。