2010-03-15 89 views
3

最近,我試圖優化這個查詢SQL SERVER 2008聯接提示

UPDATE Analytics 
SET UserID = x.UserID 
FROM Analytics z 
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID 

估計的執行計劃顯示在一個哈希匹配(聚合)上表更新57%和40%。我做了一些窺探,並找到了JOIN提示的主題。所以我給我的內部連接和WA-ZHAM添加了LOOP提示!新的執行計劃在Table Update上顯示38%,在Index Search上顯示58%。

所以我打算將LOOP提示應用到我的所有查詢中,直到審慎情況變得更好。經過一些Google搜索之後,我意識到JOIN提示在BOL中並沒有很好涵蓋。因此...

  1. 有人可以告訴我爲什麼對所有查詢應用LOOP提示是一個壞主意。我在某處讀取LOOP JOIN是查詢優化器的默認JOIN方法,但無法驗證語句的有效性?
  2. 何時使用JOIN提示?當sh * t擊中球迷並且鬼城不在城裏時?
  3. LOOP,HASH和MERGE提示有什麼區別? BOL指出MERGE似乎是最慢的,但每個提示的應用是什麼?

感謝您的時間和幫助的人!

我正在運行SQL Server 2008 BTW。上面提到的統計數據是ESTIMATED執行計劃。

+0

在研究之前,您的索引和統計信息是否最新? – Paddy 2010-03-15 12:25:11

+0

是的,他們是最新的 – super9 2010-03-15 12:46:36

回答

10

有人可以告訴我爲什麼應用LOOP提示給我所有的查詢是一個壞主意。我在某處讀取LOOP JOIN是查詢優化器的默認JOIN方法,但無法驗證語句的有效性?

因爲這會搶佔優化者機會來考慮其他可以更高效的方法。

何時使用JOIN提示?當sh * t擊中球迷並且鬼城不在城裏時?

當數據分佈(優化程序在其上進行決策時)嚴重偏斜並且統計信息無法正確表示。

LOOP,HASH和MERGE提示有什麼區別? BOL指出MERGE似乎是最慢的,但每個提示的應用是什麼?

這些是不同的算法。

  1. LOOP是嵌套的循環:從外部表的每個記錄,該內部表中搜索匹配(使用可用的索引)。最快的時候,只有兩個表格的一小部分記錄滿足JOINWHERE條件。

  2. MERGE排序這兩個表按排序順序遍歷它們,跳過不匹配的記錄。最快爲FULL JOIN S和當兩個記錄集已經從表中的一個排序(從以前的排序操作或在使用索引訪問路徑)

  3. HASH構建一個哈希表在臨時存儲(存儲或tempdb)並從另一個記錄中搜索每條記錄。如果來自任一表的大部分記錄匹配WHEREJOIN條件,則最快。在表更新

+0

很好的解釋!我不認爲你可以給你2美分馬丁的答覆? – super9 2010-03-15 12:52:21

2

估計執行計劃顯示57% 和哈希 匹配(聚合)的40%。我做了一些窺探 左右,並遇到了 JOIN提示的主題。所以我加了一個LOOP提示 我的內連和WA-ZHAM!新的 執行計劃在表 更新上顯示38%,在索引搜索中顯示58%。

這是否意味着您提出的計劃會變得更糟?假設表更新需要一個固定的時間,它現在被索引活動計算出來了。

+0

這是一個公平的假設嗎?我一直認爲,索引尋求的大部分工作是要走的路。 – super9 2010-03-15 12:49:15

+0

我認爲這是一個公平的假設,儘管如果我錯了,我很樂意糾正。 Analytics.UserGUID上是否有聚集索引?如果是這樣更新GUID到一個不同的值可能會導致一個公平的IO,這可能解釋您遇到的任何性能問題。 – 2010-03-15 13:07:25

+0

我在Analytics.UserGUID上有一個非聚集索引。我正在更新UserID列而不是UserGUID。我在Analytics.UserID列上沒有索引。 – super9 2010-03-15 13:11:41