夜里无星
2024 年7 月 1 日 21:01
#1
【 使用环境 】生产环境
【 OB or 其他组件 】Oceanbase
【 使用版本 】4.2.1.6
【问题描述】使用select语句查询ob,同一条sql,表结构也相同,但是在3.1.1版本上可以默认走索引,4.2.1不行
【SQL语句】select * from tableA where a >= xx and a <= yy ; , 其中a是主键也有自己的索引
【备注】这个是用4.2.1版本查询的执行计划,没有显示索引
这个是3.1.1版本查询的执行计划,显示用到索引,
而且很奇怪的是执行计划显示用时高版本更快一些,但实际上高版本更慢,而且如果不加force index就是不会走索引 ,并且!server节点的cpu使用率会标高!
shiyh
2024 年7 月 1 日 21:28
#3
怀疑是升级后,优化器的某些默认参数值发生了变化 。
将两个版本中所有的系统配置项的当前值进行对比,看哪些系统配置项的默认值发生了变化?
将两个版本中所有的系统变量的当前值进行对比,看哪些系统变量的默认值发生了变化?
皇甫侯
2024 年7 月 1 日 22:56
#5
估行差那么多,一个24W 一个2500W,先把统计信息对比下呢
1 个赞
辞霜
2024 年7 月 2 日 10:16
#6
rows估行差很多,建议先收集统计信息
– 收集 TEST 库中表 T_SUBPART1 所有的统计信息,只收集 50% 的数据
call dbms_stats.gather_table_stats(‘TEST’, ‘T_SUBPART1’, estimate_percent=> ‘50’, granularity=>‘ALL’);
1 个赞
夜里无星
2024 年7 月 2 日 10:51
#7
banjin:
统计信息
ob凌晨会有merge操作,刚刚同样的sql查询预估行数已经降到一个量级了,这个是4.2.1.6版本,我修改了tenant_freeze_trigger_percentage(4.2.1原先是20 我调成了50,3.1.1是60)
夜里无星
2024 年7 月 2 日 10:52
#8
感谢 我这边尝试收集一下统计信息,目前新旧ob都没有更新统计信息的操作
夜里无星
2024 年7 月 2 日 10:52
#9
我修改了tenant_freeze_trigger_percentage(4.2.1原先是20 我调成了50,3.1.1是60),还有昨天不打印info的操作,会不会是这个变量导致的呢
淇铭
2024 年7 月 2 日 11:27
#10
夜里无星
2024 年7 月 2 日 13:38
#11
淇铭:
文档有说明 不支持force index
嗯嗯 感谢大佬回答,但之前我用4.2.1版本加上force index 确实会走索引,而且查询效率也会变快不少
淇铭
2024 年7 月 2 日 13:40
#12
夜里无星
2024 年7 月 2 日 15:21
#13
哦哦好的大佬,还是想请教一下,目前使用了force index没有报错可以批量查询,但是是会存在一些未知的风险嘛
淇铭
2024 年7 月 2 日 16:01
#14
会的 因为不是ob标准的语法 都是有风险的 不建议生产环境
1 个赞
夜里无星
2024 年7 月 2 日 18:04
#15
感谢,不过目前我生产环境需要批量查询多个sql,可能qps大概是500左右每秒,刚我用不强制索引的方式执行sql,发现cpu使用率拉满然后差不到数据,加上force index后没有该问题可以查到数据
淇铭
2024 年7 月 2 日 18:12
#16
那使用index(table index)使用这种方式呢 ob使用index的方式呢
库的统计信息有收集么?
夜里无星
2024 年7 月 2 日 18:46
#17
index(table index)是指use index(idxxx)这样的形式嘛,刚刚我尝试用use index 可以正常执行,没有上述异常,库里的统计信息目前不太能查到,也没有设置过自动更新统计信息
chwei
2024 年7 月 3 日 09:15
#18
这个参数是合并转储的参数,和执行计划没关系,预估行数差这么多,应该还是统计信息的问题,还有就是ob不支持force index
淇铭
2024 年7 月 3 日 09:26
#19
index(table index)这个和mysql的force index 类似和use index不一样 如果指定了强制走索引
旭辉
2024 年7 月 3 日 10:06
#20
1.这里提供的统计信息数据确实差别较大,可以和表的实际数据量对比上,看统计信息是否准确?哪个准确?
2.可以使用obdiag工具
a)一键场景化信息收集,搜集下报告,例如:
obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}” [SQL performance problem] [SQL性能问题]
b)使用obdiag一键诊断分析,分析sql耗时详情,例如
obdiag analyze flt_trace --flt_trace_id 000605b1-28bb-c15f-8ba0-1206bcc08aa3
obdiag具体使用可参考 OceanBase分布式数据库-海量数据 笔笔算数
夜里无星
2024 年7 月 3 日 10:29
#21
哦哦了解,不过确实是修改这个参数后查询性能有改善,还会默认走索引了,统计信息每天ob 做merge的时候会更新一下