【问题标题】:Loop Join in SQL Server 2008SQL Server 2008 中的循环连接
【发布时间】:2015-06-29 23:35:48
【问题描述】:

我不清楚下面提到的查询之间的工作差异。

具体我不清楚OPTION(LOOP JOIN)的概念。

第一种方法:这是使用的传统连接,比以下所有方法都最昂贵。

SELECT * 
FROM [Item Detail] a
LEFT JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER);

第二种方法:它在带有排序数据的语句中包含OPTION,只是经过优化。

SELECT * 
FROM [Item Detail] a
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER);

第三种方法:在这里,我不清楚查询是如何工作的,包括OPTIONloop join!!?

SELECT * 
FROM [Item Detail] a
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (LOOP JOIN);

谁能解释一下彼此之间的区别和工作方式以及优势?

注意:这些是不是嵌套的 OR Hash 循环!

【问题讨论】:

  • 文档:Query HintsJoin Hints
  • 为什么您认为第一种方法“比以下所有方法最昂贵”?
  • 我用我的本地服务器对其进行了测试,并获得了最大的差异!当然,差异只是 +2 到 +3 秒
  • 通过不指定任何提示,您可以让 SQL Server 确定使用哪种连接类型,这通常是最好的。有时,如果统计信息过时,可能会使用错误的计划。

标签: sql-server sql-server-2008 left-join join-hints


【解决方案1】:

来自Query Hints (Transact-SQL)

FORCE ORDER 指定查询所指示的连接顺序 在查询优化期间保留语法。使用 FORCE ORDER 确实 不会影响查询优化器可能的角色反转行为。

还有

{ 循环 |合并 | HASH } JOIN 指定所有的连接操作都是 在整个查询中由 LOOP JOIN、MERGE JOIN 或 HASH JOIN 执行。 如果指定了多个连接提示,优化器将选择 允许的最便宜的加入策略。

Advanced Query Tuning Concepts

如果一个连接输入很小(少于 10 行)而另一个连接 输入相当大并且在它的连接列上被索引,一个嵌套的索引 loops join 是最快的连接操作,因为它们需要 最少的 I/O 和最少的比较。

如果两个连接输入不小但按连接排序 列(例如,如果它们是通过扫描排序的 索引),合并连接是最快的连接操作。

哈希连接可以有效地处理大型、未排序、非索引的输入。

还有Join Hints (Transact-SQL)

连接提示指定查询优化器强制执行连接策略 两张桌子之间

您的选项 1 告诉优化器保持连接顺序不变。所以JOIN类型可以由优化器决定,所以可能是MERGE JOIN

您的选项 2 是告诉优化器对这个特定的JOIN 使用LOOP JOIN。如果FROM 部分中有任何其他联接,优化器将能够为它们做出决定。此外,您正在指定优化器的 JOINS 顺序。

您的最后一个选项 OPTION (LOOP JOIN) 将在查询中的所有联接中强制执行 LOOP JOIN

总而言之,优化器很少会选择不正确的计划,这可能表明更大的潜在问题,例如过时的统计信息或碎片索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2016-11-22
    • 2013-12-21
    • 2010-12-25
    • 1970-01-01
    • 2014-02-10
    • 2012-10-18
    • 2011-07-26
    相关资源
    最近更新 更多