行业知识
在OceanBase使用中,如何优化因Join估算不准导致执行计划选错的问题
2026-11-02 02:51:31
来源:互联网转载
作者:胡呈���,爱可生公司旗下的DBA团队成员,擅长故障分析和性能优化。爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。本文约 1600 字,预计阅读需要 15 分钟。 数据库版本:OceanBase3.2.3.3
案例问题的描述
在关联字段包含组合主键的第1、2、4个字段的一个join查询中。如果执行Nested-Loop Join ,由于被驱动表仅匹配主键的第一、二个字段,虽然成本 cost1 较低,但实际效率不高。此外,驱动表的扇出 n(即输出行数)的估算值远小于实际值。在计算总成本时:
()Join 总成本 ≈(驱动表成本 + n*cost1)
在本文所举的例子中,驱动表的成本是不变的,执行计划中 n 的估算值为 5000,但实际值为 60 万,cost1=154。n*cost1 在计算成本时远小于实际值。因此,优化器基于低估的n值选择了 Nested-Loop Join,由于被驱动表只能匹配主键的前两个字段,效率较低,导致整个查询时间耗费较多,但如果被驱动表能匹配主键的全部字段,效率会很高。
()分析过程
1. 分析执行计划
问题 SQL 如下(执行耗时 500s+):
select count(*) from ( SELECT JGBM AS QYDJID, SEGMENT3 AS FNUMBER, PERIOD_NAME AS SSQJ, ... FROM ( SELECT ... FROM DC_ACCOUNTBALANCE_TEMP A, DEF_ACCOUNTCONFIG B, DC_ACCOUNT C, NVAT_ACCANDTAXIDMAPFORP07 D, BI_CHOICEOFUNIT E WHERE A.SEGMENT1 = D.ZTJGBM AND D.SBDWID = E.SBDWID AND B.JGBM = E.DEPTCODE AND B.YXQSNY
上一篇:五笔输入法中武字的打法详解