【问题标题】:T-SQL - why INNER MERGE JOIN makes several joins definitons to executed more fasterT-SQL - 为什么 INNER MERGE JOIN 使多个连接定义执行得更快
【发布时间】:2012-08-07 18:22:41
【问题描述】:

我对此感到非常困惑。我无法提供示例,因为最终的 SQL 语句是动态构建的,并且很多函数和过程都在其中发挥作用......

一般来说,我有五个联接。我注意到当我删除其中一个时,语句执行 0 秒,否则超过 4 分钟。然后,我查看了实际的执行计划,并注意到“合并连接”需要很多成本。在 Google 中搜索时,我会使用“INNER MERGE JOIN”或“OPTION (MERGE JOIN)”以及语句的结尾。

这非常好,因为查询现在执行了 0 秒。但我的问题是为什么?

我做了一些研究,发现要使用 MERGE 连接,必须对两个语句进行排序 - 这不是我的情况,它们不是,我仍然在 0 秒内得到正确的结果。

有没有人在 T-SQL 想法方面取得进展,为什么会导致这种情况?

我知道我已经有了解决方案,但我想知道为什么它会起作用以及发生了什么。

【问题讨论】:

    标签: tsql merge inner-join join-hints


    【解决方案1】:

    可能发生这种情况的一个原因是,如果在慢速计划中,它使用嵌套循环连接,并且在内侧评估查询的成本很高(由于成本估算不准确而选择了计划)

    给出合并连接提示将导致昂贵的查询仅被评估一次(作为您描述中的排序运算符的输入)而不是重复(合并连接会遍历其每个输入)。

    您需要捕获慢速和快速版本的执行计划,看看是否是这种情况。

    【讨论】:

    • 我什么时候应该使用“合并”选项 - 每次我有一个包含高成本操作的嵌套循环时?
    • @Joro 所有查询提示只能在查看执行计划并确定 SQL Server 没有为您提供最佳计划的确切原因后作为最后的手段使用。
    【解决方案2】:

    查询优化器在制定计划时会考虑连接数。我已经看到了同样的场景,在 5 个连接时它采用了不同的方法。您可以使用表提示来强制执行查询计划。您还可以重新构造查询以使用联合或相交而不是连接。

    【讨论】:

    • 谢谢,但我无法对其进行重构,因为它是由不允许更改的存储过程动态生成的。
    猜你喜欢
    • 2011-05-24
    • 2019-10-09
    • 2013-02-07
    • 2023-01-30
    • 2019-04-22
    • 2020-01-09
    • 2011-07-29
    • 2011-03-03
    • 2014-01-22
    相关资源
    最近更新 更多