End
#1
【 使用环境 】测试环境
【 OB or 其他组件 】OceanBase
【 使用版本 】3.x
【问题描述】同样的表和sql ,一个在ob环境下执行,一个在mysql里执行
执行计划如下 为什么ob的执行计划里无法看到表扫描行数,mysql可以看到s表扫描40w,但是ob却什么都没有 s表估算为啥是1????????,以后怎么能够通过执行计划准确判断sql执行情况?????
手动加hint hash join 后执行计划如下
【复现路径】问题出现前后相关操作
【问题现象及影响】
【附件】
张雨齐
#3
End
#4
为什么第一个图中s表估算的是1行?同样都是nl,s表不应该只扫描1行吧,sql耗时可是1s多
阿绿
#5
ob的explain看到的是估计的行数,是为了生成更好的计划的一个考虑因素,如果要知道真正执行sql扫表的行数,直接执行sql后去查sql_plan_monitor 表,
sql_plan_monitor 表中有一个output_row的字段。
1 个赞
End
#6
如果这样的话,其实这点对于运维人员不是很有好的,本来是可以直接在执行计划可以看到的,还要去查其他的视图,每次explain一下还需要看别的视图,这个设计真的很不友好
发一下表结构和数据量信息。此外,OB里表数据初始化后需要发起一次全量合并后才更新表的统计信息。
1 个赞
TABLE GET 直接用主键拿数据,可不就输出0行或1行么。
End
#10
table.txt (15.4 KB)
你要的信息我整理成txt了 ,请查收
看这一段
is_index_back=true, filter_before_indexback[false,false,false],
range_key([s.tenant_id(0x7fb1fb73ac50)], [s.student_id(0x7fb1fb73b2c0)]), range(1586c6c99a5c4bd1b12bd0d602c8e637,MIN ; 1586c6c99a5c4bd1b12bd0d602c8e637,MAX),
range_cond([s.tenant_id(0x7fb1fb73ac50) = '1586c6c99a5c4bd1b12bd0d602c8e637'(0x7fb1fb73a560)])
推测tenant_id条件在索引 s(idx_tenantid) 上应用后只返回一行索引记录然后到主表返回该行记录,其他三个 s 的条件是此后再过滤。
可以针对表一点点下条件,观察执行计划变化。
详细方法参考 https://mp.weixin.qq.com/s/gmLDbJkMS1Zarc1kKSSreQ
1 个赞
估算 1 行是估算取出的只有一行数据,并不是只扫描了一行数据。比如一个表100w,谓词条件是5000,但是优化器估计的是300,他这里估算是300,但是不影响实际执行是走索引取数的。
End
#14
目前来看应该这样的,不过感觉这种执行计划的输出设计不是很理解,而且同样的其他的sql 在mysql里扫描估值还是比较准的比如 扫描了45,但是到ob里直接就是8了