SQL Server 2008中的循环连接

14

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

具体来说,我不确定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);

第三种方法:在这里,我不清楚查询如何使用loop join并包含OPTION!?

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

能否有人解释一下它们之间的区别、工作方式和彼此之间的优势?

注意:这些不是嵌套或哈希循环!


1
文档:查询提示连接提示 - Tanner
你认为第一种方法为什么比以下所有方法都“更昂贵”? - Magnus
我使用我的本地服务器进行了测试,并且获得了最高的差异!当然,差异只有 +2 到 +3 秒。 - Vikrant
3
如果不指定提示,你让SQL服务器决定使用什么类型的联接,这通常是最好的。有时候如果统计信息过期,可能会使用错误的执行计划。 - Magnus
1个回答

9
来自查询提示(Transact-SQL) FORCE ORDER表示在查询优化期间保留查询语法指示的连接顺序。使用FORCE ORDER不会影响查询优化器可能的角色翻转行为。
另外,
{ LOOP|MERGE|HASH } JOIN表示整个查询中所有连接操作都由LOOP JOIN、MERGE JOIN或HASH JOIN执行。 如果指定了多个连接提示,则优化器从允许的提示中选择成本最低的连接策略。
来自高级查询优化概念 如果一个连接输入很小(少于10行)且另一个连接输入相当大并且索引在其连接列上,那么索引嵌套循环连接是最快的连接操作,因为它们需要最少的I / O和最少的比较。
如果两个连接输入不小但已按其连接列排序(例如,如果它们是通过扫描排序索引获得的),则合并连接是最快的连接操作。
哈希连接可以有效地处理大型,未排序的,未索引的输入。
以及连接提示(Transact-SQL) 连接提示指定查询优化器在两个表之间强制执行连接策略
选项1告诉优化器保持连接顺序不变。因此,JOIN类型可以由优化器决定,所以可能是MERGE JOIN。
您的选项2告诉优化器在特定的连接中使用LOOP JOIN。如果FROM部分中有任何其他连接,则优化器将能够为它们做出决定。此外,您指定了优化器采取的连接顺序。
您的最后一个选项OPTION(LOOP JOIN)将在查询中强制使用LOOP JOIN处理所有连接。
所有这些都说明,很少情况下优化器会选择错误的计划,并且这可能表明更大的潜在问题,例如过时的统计信息或碎片化的索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接