ob执行计划索引

【 使用环境 】 测试环境
【 OB or 其他组件 】ob
【 使用版本 】4.2.1
【问题描述】 create table temp(key varchar(256) not null, cny_amt varchar(26) null, country_cd varchar(3) null, name varchar(20) null,id varchar(32) null,pay_cd varchar(2) null)
create index idx_cny_amt on temp(cny_amt)
create index idx_name on temp(name )
create index idx_pay_cd on temp(pay_cd )

select id,count()
from temp
where cny_amt>10000
and cny_amt<=1000000
and pay_cd =‘1’
group by id
having count(
)>30

伪代码如上,查询sql的执行计划只走了索引idx_cny_amt ,其他索引像idx_pay_cd 就没走。是因为什么?有什么办法可以让两个索引都用上?

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(系统巡检和诊断信息收集)

不太清楚ob是否支持index merge,或者index merge的使用方法跟mysql不一样,我不会用;
不过你可以考虑两种方法:

  1. 创建联合索引
  2. 使用hint

另外,优化器只选择了一个索引,也可能跟你的数据分布有关

  1. 优化器会选择用过滤性更高的过滤条件在索引上进行过滤,它认为
    cny_amt > 10000 and cny_amt<=1000000 比 pay_cd =‘1’ 过滤性高,所以选择了 idx_cny_amt 这个索引。
  2. 从实现原理上,一个 table scan 不能同时走上多个索引。
  3. 推荐建一个类似于 create index better_idx on temp (pay_cd, cny_amt); 的联合索引。
  4. 推荐看一眼这篇博客:OceanBase 社区
2 个赞

OB支持index merge吗?

建联合索引啊,试试能不能走上

不支持的

文档中 ‘如果数据库从这个列表中扫描多个索引并合的访问路径成本最低,数据库讲选用这种扫描方案’ 是什么意思?

这个是啥链接?
这句感觉是个病句,不必细究。
整段大意应该就是:你可以通过 hint 指定几个你觉得好的索引让优化器去选,优化器会从你指定的几个索引里面选择它认为最好的那个索引,其他你没在 hint 里指定的索引它就肯定不会选到了。

讲hint的,链接如下:(‘多个索引并合’ 我理解成了类似index merge功能)
与访问路径相关的 Hint-OceanBase 数据库-OceanBase文档中心-分布式数据库使用文档

官网写的东西有问题,不用纠结那句话到底是啥意思,领会整段话的精神就好~ :yawning_face:

1 个赞

好的 多谢
另外,有计划支持 index merge吗?

暂时没有这个计划。

index merge 理论上是不难实现的,先拿到两个索引各自过滤的结果,然后做一次交集,最后拿交集的结果进行回表就好了。

但是从原理上来讲,这样做很可能比只使用单个索引的代价还要更高,所以 OB 暂时还没有对此进行规划。

个人理解选择创建一个联合索引应该才是最优的选择~

1 个赞

了解了 多谢
确实联合索引会是最优选择,但是好多时候并不是一个联合索引能解决所有问题