为什么ob的执行计划里无法看到表扫描行数

【 使用环境 】测试环境
【 OB or 其他组件 】OceanBase
【 使用版本 】3.x
【问题描述】同样的表和sql ,一个在ob环境下执行,一个在mysql里执行
执行计划如下 为什么ob的执行计划里无法看到表扫描行数,mysql可以看到s表扫描40w,但是ob却什么都没有 s表估算为啥是1????????,以后怎么能够通过执行计划准确判断sql执行情况?????


手动加hint hash join 后执行计划如下

【复现路径】问题出现前后相关操作
【问题现象及影响】

【附件】

有的话,EST. ROWS就是影响行数啊

执行计划相关文档见下链接

https://www.oceanbase.com/docs/community-observer-cn-10000000000449833

为什么第一个图中s表估算的是1行?同样都是nl,s表不应该只扫描1行吧,sql耗时可是1s多

ob的explain看到的是估计的行数,是为了生成更好的计划的一个考虑因素,如果要知道真正执行sql扫表的行数,直接执行sql后去查sql_plan_monitor 表,


sql_plan_monitor 表中有一个output_row的字段。

1 个赞

如果这样的话,其实这点对于运维人员不是很有好的,本来是可以直接在执行计划可以看到的,还要去查其他的视图,每次explain一下还需要看别的视图,这个设计真的很不友好

发一下表结构和数据量信息。此外,OB里表数据初始化后需要发起一次全量合并后才更新表的统计信息。

1 个赞

TABLE GET 直接用主键拿数据,可不就输出0行或1行么。

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 个赞

主要是不是理解ob 执行计划 给出估算是1 行。

估算 1 行是估算取出的只有一行数据,并不是只扫描了一行数据。比如一个表100w,谓词条件是5000,但是优化器估计的是300,他这里估算是300,但是不影响实际执行是走索引取数的。

目前来看应该这样的,不过感觉这种执行计划的输出设计不是很理解,而且同样的其他的sql 在mysql里扫描估值还是比较准的比如 扫描了45,但是到ob里直接就是8了