【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.2.0
【问题描述】清晰明确描述问题
我想咨询一下,OceanBase 是否支持获悉类似 pg_hint_plan插件外部注入真实基数或者实际执行 SQL 得到根据真实运行的基数计算出来的 cost model 的计算代价,不是基于预估的基数的,这样可以便于了解到底是基数预估的问题,还是代价模型本身的问题。像 TiDB 是支持把代价模型的公式也在执行计划中显示出来。
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手 ] 即可召唤小助手,欢迎试用!
论坛小助手
2024 年8 月 23 日 12:22
#3
您的问题非常合理且具有技术深度。目前,OceanBase 数据库并没有直接提供类似于 PostgreSQL 的 pg_hint_plan
插件的功能,即允许用户通过 hint 注入真实基数来重新计算执行计划的代价。不过,我们可以探讨一些间接的方法来帮助您更好地理解执行计划的成本计算,并判断是基数预估的问题还是代价模型本身的问题。
间接方法
查看执行计划 (Explain Plan)
分析实际执行情况
监控执行计划
计划缓存视图
使用 GV$OB_PLAN_CACHE_PLAN_EXPLAIN
视图来查询某条 SQL 在计划缓存中的物理执行计划,这可以提供更详细的执行计划信息。
示例查询:SELECT plan_line_id, operator, name, rows, cost
FROM oceanbase.gv$plan_cache_plan_explain
WHERE ip = 'your_ip'
AND port = your_port
AND tenant_id = your_tenant_id
AND plan_id = your_plan_id;
分析思路
对比预估与实际成本
比较 EXPLAIN
输出的预估成本与 GV$SQL_PLAN_MONITOR
中的实际成本,以此判断预估成本是否准确。
观察计划变化
如果发现计划在不同时间点发生变化,可以通过 DBMS_XPLAN.DISPLAY_CURSOR
来观察这些变化,进一步判断是否因为基数预估的变化导致了计划的选择差异。
使用计划绑定
如果确定了某个执行计划更为稳定且高效,可以考虑使用计划绑定来固定这个计划,避免因代价模型的波动而影响性能。
结论
虽然 OceanBase 目前没有直接提供基于真实基数的代价计算显示功能,但通过上述方法您可以较为全面地了解执行计划的成本计算情况,并判断问题所在。如果在实践中遇到具体问题,建议联系 OceanBase 的技术支持团队获取更深入的帮助。
希望以上信息对您有所帮助!如果有更具体的需求或疑问,请随时告知。
具体信息可参考以下文档:
论坛小助手:
ELECT plan_line_id, operator, name, rows, cost
FROM oceanbase.gv$plan_cache_plan_explain
WHERE ip = 'your_ip'
AND port = your_port
AND tenant_id = your_tenant_id
AND plan_id = your_plan_id;
SELECT plan_line_id, operator, name, rows, cost
FROM oceanbase.gv$plan_cache_plan_explain
WHERE ip = ‘your_ip’
AND port = your_port
AND tenant_id = your_tenant_id
AND plan_id = your_plan_id; 这里得到的 cost 就是基于真实基数实际计算的 cost 吗? rows 就是实际扫描出来的真实基数。
论坛小助手:
GV$SQL_PLAN_MONITOR
社区版也支持吗?DBMS_XPLAN是默认都有的嘛
以及这里如何获取这么多 id 的流程可否也详细介绍一下。
论坛小助手
2024 年8 月 23 日 12:35
#7
针对您的问题,我们将逐一进行解答:
如何获取 GV$SQL_PLAN_MONITOR
中的 SQL_ID
和其他 ID
获取 SQL_ID
获取 PLAN_ID
获取 IP
和 PORT
关于 GV$SQL_PLAN_MONITOR
关于 DBMS_XPLAN
关于 GV$OB_PLAN_CACHE_PLAN_EXPLAIN
GV$OB_PLAN_CACHE_PLAN_EXPLAIN
视图提供了存储在计划缓存中的执行计划的详细信息。
获取 COST
和 ROWS
COST
字段表示物理算子预估的代价,它基于统计信息进行计算,并非基于实际运行时的数据。
ROWS
字段表示物理算子预估的结果行数,同样基于统计信息而非实际运行时的数据。
因此,这里的 COST
和 ROWS
并不是基于实际运行时的真实基数计算得出的,而是基于预估的基数进行计算的。
总结
GV$SQL_PLAN_MONITOR
和 DBMS_XPLAN
提供了 SQL 语句执行过程中的实时监控数据和执行计划详情,这些信息可以帮助您了解 SQL 语句的实际执行情况。
GV$OB_PLAN_CACHE_PLAN_EXPLAIN
中的 COST
和 ROWS
基于统计信息进行计算,而不是基于实际运行时的真实基数。
如果您有更具体的需求或疑问,请随时告知。
具体信息可参考以下文档:
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)
zmix
2024 年8 月 23 日 13:46
#9
论坛小助手:
DBMS_XPLAN
有这种方法,修改统计信息基数,应该要企业版也支持,Oracle也是这样
Gone222:
SELECT plan_line_id, operator, name, rows, cost
FROM oceanbase.gv$plan_cache_plan_explain
WHERE ip = ‘your_ip’
AND port = your_port
AND tenant_id = your_tenant_id
AND plan_id = your_plan_id; 这里得到的 cost 就是基于真实基数实际计算的 cost 吗? rows 就是实际扫描出来的真实基数。
SELECT plan_line_id, operator, name, rows, cost
FROM oceanbase.gv$plan_cache_plan_explain
WHERE ip = ‘your_ip’
AND port = your_port
AND tenant_id = your_tenant_id
AND plan_id = your_plan_id; 这里得到的 cost 就是基于真实基数实际计算的 cost 吗? rows 就是实际扫描出来的真实基数。这个问题可以补充回复一下吗?
zmix
2024 年8 月 23 日 14:27
#12
辞霜
2024 年8 月 23 日 14:58
#13
gv$plan_cache_plan_explain 该表获取的信息都是跟进统计信息预估出来的,楼上小助手也回答出来了
COST
字段表示物理算子预估的代价,它基于统计信息进行计算,并非基于实际运行时的数据。
ROWS
字段表示物理算子预估的结果行数,同样基于统计信息而非实际运行时的数据。
你好,我想再补充确认一下,这里的 real_cost就是 OB 基于 real_cardinality和 cost model 的公式计算出来的值对吗?