12

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

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

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

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

任何人都可以解释彼此之间的区别和工作方式以及优势吗?

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

4

1 回答 1

6

查询提示 (Transact-SQL)

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

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

高级查询调优概念

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

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

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

加入提示 (Transact-SQL)

连接提示指定查询优化器在两个表之间强制执行连接策略

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

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

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

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

于 2015-04-22T11:20:25.583 回答