执行计划如何强制使用统计信息而非存储层的预估行数

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.0.0
【问题描述】我们现在有一个特殊的数据库环境,这个OB数据库里面存储层是没有数据的,但是里面的统计信息是从别的环境(如生产环境)导入进来的,我们希望此时可以强制使用统计信息的数据生成执行计划,这样就可以基于执行计划对SQL进行性能判定。这个使用场景之前在Oracle数据库上是可以的。
【复现路径】
当前测试了一下,即使导入了其他环境的统计信息,OB依然使用的是存储层的预估行数,而非统计信息中的行数。
【问题现象及影响】

我已经看了OB的社区文档,没有办法实现这个功能

数据统计信息不准确

查询优化过程依赖数据统计信息的准确性,OceanBase 数据库的优化器默认会在数据合并过程中收集一些统计信息,当用对数据进行了大量修改时,可能会导致统计信息落后于真实数据的特征,用户可以通过发起每日合并,主动更新统计信息。

除了优化器收集的统计信息以外,优化器还会根据查询条件对存储层进行采样,用以后续的优化选择。OceanBase 数据库目前仅支持对本地存储进行采样,对于数据分区在远程节点上的情况,只能使用默认收集的统计信息进行代价估计,可能会引入代价偏差。

【附件】

按照生产数据量这些统计信息,执行计划是使用了什么索引,或者什么样的执行计划,可以直接创建outline绑定执行计划,强制走这个执行计划就行。

感谢你的回答,我们的使用场景比较特殊,我可能没有描述清楚我的意思

  1. 我们现在有一个类生产数据库环境,这个数据库里面没有数据,但是统计信息是来自于生产环境的。
  2. 我们的假设是数据库的执行计划主要依赖于统计信息,这样的话我们在类生产数据库上获取到的执行计划基本就与生产环境的相同了。
  3. 这样就可以在类生产数据库上分析一些SQL语句的执行计划,来判断SQL是否存在性能问题,起到一个SQL提前检测的作用。
  4. 由于行业的特殊性,我们不能直接在生产环境获取执行计划。

但是我们在测试过程中OB的执行计划更多是依赖于存储层的预估行数,而非统计信息。

那为什么不能脱敏,将数据导入模拟环境呢?
或者造数工具造相同数据量的数据。

优化器并不是完全依赖统计信息吧,你只管统计信息这样复现是不是本来就不严谨

脱敏或者造数的话,需要准备与生产环境相同的资源配置,成本太高。

优化器并不是完全依赖统计信息,这个的确是的,只不过我们并不要求严格的准确性,可以达到90%或者95以上的准确率就可以。

create one github issue to track this requirement.

非常感谢创建了专门的issue处理这个问题,我看github上issue的status已经是confirmed了,不知道这个功能有计划什么时候实现吗?

再次感谢。