2015-04-22 122 views
11

我不清楚下面提到的查詢之間的工作差異。循環加入SQL Server 2008中

具體而言,我不清楚OPTION(LOOP JOIN)的概念。

1的方法:這是一個傳統的連接使用,這是比所有的低於最昂貴的。

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); 

3的方法:在這裏,我不清楚,查詢是如何工作的,幷包括OPTIONloop join!?

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

任何人都可以解釋區別,工作方式和每個人的優勢比其他?

注意:這些是不是嵌套或散列循環!

+1

文檔:[查詢提示](https://msdn.microsoft.com/en-us/library/ms181714.aspx)和[加入提示](https://msdn.microsoft.com/en-GB /library/ms173815.aspx) – Tanner

+0

爲什麼你認爲第一種方法是「最昂貴的比以下所有」? – Magnus

+0

我用我的本地服務器測試過它,並獲得最高的差異!當然,差異僅爲+2到+3秒 – Vikrant

回答

7

Query Hints (Transact-SQL)

FORCE ORDER指定查詢優化過程中由查詢 語法指示的聯接順序。使用FORCE ORDER確實不影響查詢優化器的可能的角色反轉行爲 。

{LOOP | MERGE | HASH} JOIN指定在整個查詢中由LOOP JOIN,MERGE JOIN或HASH JOIN執行的所有連接操作均爲 。 如果指定了多個聯接提示,優化程序將從允許的聯接策略中選擇最便宜的聯接策略 。

Advanced Query Tuning Concepts

如果一個連接輸入是小的(少於10行),另加入 輸入是相當大的和索引在其連接列,索引嵌套 循環連接是最快的加入操作,因爲它們至少需要I/O和最少的比較。

如果兩個連接投入不小,但他們的加入 列進行排序(例如,如果他們被掃描的排序 索引),合併聯接是最快的聯接操作。

散列連接可以高效地處理大型未排序的非索引輸入。

而且Join Hints (Transact-SQL)

聯接提示指定查詢優化器執行聯接策略表

兩者之間

你的選項1告訴優化,以保持連接順序不變。所以JOIN類型可以由優化器決定,因此可能是MERGE JOIN

您的選項2告訴優化器使用LOOP JOIN作爲此特定的JOIN。如果FROM部分中還有其他聯接,優化程序將能夠爲他們做出決定。此外,您正在指定優化器的JOINS順序。

最後一個選項OPTION (LOOP JOIN)將在查詢中的所有連接上強制執行LOOP JOIN

這就是說,很少有優化器會選擇一個不正確的計劃,這可能意味着更大的潛在問題,比如過時的統計信息或碎片化的索引。