相同的 SQL 但不同的解释计划
Posted
技术标签:
【中文标题】相同的 SQL 但不同的解释计划【英文标题】:same SQL but different explain plan 【发布时间】:2011-02-10 04:16:25 【问题描述】:我在 2 个具有相同索引集和表大小的不同环境中运行相同的 SQL(如下)。 但是他们给了我两个不同的解释计划 (attached)
-
使用 Merge Join Cartesian -- 非常慢
使用 PX Coordinator / PX Send / PX RECEIVE -- 非常快
查询:
SELECT *
FROM SIEBEL.S_PARTY PRTY, SIEBEL.S_CONTACT CONT, HPQ_IF_ENTERPRISE_DIRECTORY ED,SIEBEL.S_BU BU
WHERE PRTY.ROW_ID = CONT.PAR_ROW_ID
AND BU.ROW_ID(+)=CONT.BU_ID
AND CONT.EMP_NUM IS NOT NULL
AND ED.HPSTATUS NOT IN ('Terminated', 'Retired', 'Deceased')
AND ED.EMPLOYEENUMBER = UPPER (LPAD (CONT.EMP_NUM, 8, '0'))
AND (SUBSTR(ED.MODIFYTIMESTAMP,1,14) >= '19800101' OR ED.MODIFYTIMESTAMP IS NULL)
知道导致这种差异的可能原因是什么吗? 2nd explain plan with (PX things) 是什么意思?
请注意,我不是在寻找更改 SQL 查询(在生产中冻结)。
非常感谢。
【问题讨论】:
【参考方案1】:PX 表示parallel processing。由于会话设置(或者如果其他数据库是不同的版本或版本),这可能在其他数据库上不可用。
【讨论】:
谢谢加里,你是对的。我发现问题是由具有默认程度的“索引”引起的。我猜它会从可能不同的 DB 会话级别获取学位值。在将索引级别的度数强制为 4 后,我能够解决它。谢谢。【参考方案2】:查询计划不仅取决于表大小或索引,还取决于许多其他因素,主要是表、列和索引的统计信息。这些统计数据包括诸如聚类因子之类的东西,这会对计算的成本产生很大的影响。
此外,不同的系统统计信息、优化器参数、表结构(例如分区与非分区)和数据库块大小都会发挥作用,环境之间最细微的差异都会导致不同的计划受到青睐。
【讨论】:
【参考方案3】:这些表是否有不同的 DEGREE?在两种环境中检查此查询:
select table_name, degree from all_tables where table_name in ('S_PARTY', 'S_CONTACT', 'HPQ_IF_ENTERPRISE_DIRECTORY','S_BU');
【讨论】:
感谢 Jonearles,感谢您接近正确的答案 - 在我的情况下。我很困惑我应该接受哪些答案,因为它们都是正确的:) 没关系,iwan,只需对有帮助的答案投票,将最有帮助的答案标记为“正确”,我们都会很高兴 :)以上是关于相同的 SQL 但不同的解释计划的主要内容,如果未能解决你的问题,请参考以下文章