【问题标题】:Have merge Cartesian Join with high Cost以高成本合并笛卡尔连接
【发布时间】:2019-02-25 06:52:59
【问题描述】:

以高成本合并笛卡尔连接。

我们正在查询数据库以填充一些已记录的票证,但查询形成导致上述问题并由我们的绩效团队进行沟通。

在这里,我对 Java 编程很感兴趣,但我对这些连接没有太多想法。有人可以帮我解决一下如何重新构建下面的查询以避免合并笛卡尔连接的高成本。

FROM
    SERVICE_REQ SR,
    SR_COBRAND_DATA SR_COB_DATA,
    REPOSITORY rep,
    SR_ASSIGNEE_INFO ASSIGNEE_INFO 
WHERE
    SR.SR_COBRAND_ID=rep.COBRAND_ID 
    AND SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID (+) 
    AND SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID (+) 
    AND SR.SR_COBRAND_ID = 99  

【问题讨论】:

标签: sql database oracle sql-tuning


【解决方案1】:

只是一个建议

你不应该使用旧的隐式连接sintax,而应该使用显式连接sintax

SELECT * 
FROM  SERVICE_REQ SR 
LEFT JOIN  SR_COBRAND_DATA SR_COB_DATA ON SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID
INNER JOIN REPOSITORY rep  ON SR.SR_COBRAND_ID=rep.COBRAND_ID 
LEFT JOIN SR_ASSIGNEE_INFO ASSIGNEE_INFO  ON SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID
WHERE SR.SR_COBRAND_ID = 99  

无论如何,基于此条件,您在表之间没有笛卡尔积,而是 SERVICE_REQ 与 SR_COBRAND_DATA 和 SR_ASSIGNEE_INFO 的左连接通过与 REPOSITORY 的内连接来减少

可能是为了解释你的目标,你应该添加适当的数据样本预期结果和你的实际结果

【讨论】:

  • 这不是问题的答案。无论您发现 ANSI 89 语法多么令人讨厌,将语句转换为使用显式连接都不会改变查询的性能。 @MarmiteBomber 不久前发布了 a self-answered question on asking Oracle tuning questions。我对此发表评论并将其推荐给 OP。这比在 Oracle 调优问题中完成所有我们需要的事情要容易。
【解决方案2】:

在 SERVICE_REQ 表的 SR_COBRAND_ID 和 SERVICE_REQ_ID 列上创建复合索引

-- 在 SERVICE_REQ (SR_COBRAND_ID , SERVICE_REQ_ID) 上创建索引 [indexname];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多