2012-10-22 115 views
0

我遇到了SQL子查詢的性能問題。SQL子查詢性能問題

作爲硬編碼的查詢時,它需要約1秒至運行:

SELECT ColumnA 
     ,ColumnB 
     ,ColumnC 
FROM [LinkedServer].[Database].[Schema].[View] 
WHERE ColumnA IN 
    (
     'ABC', 
     'DEF', 
     'HIJ', 
     'KLM' 
    ) 

但是,下面的代碼需要花費一分鐘來運行:

SELECT ColumnA 
     ,ColumnB 
     ,ColumnC 
FROM [LinkedServer].[Database].[Schema].[View] 
WHERE ColumnA IN 
    (
     SELECT ColumnA FROM #TempTable 
    ) 

的臨時表中包含與硬編碼示例相同的4行。鏈接服務器上的視圖包含約。 700,000行(不幸的是,這超出了我的控制範圍)。 ColumnA數據類型相同,並且兩個表都被索引。

有關如何提高此查詢性能的任何想法?

非常感謝。

+0

'ColumnA'從#TempTable varchar類型或nvarchar? –

+0

嗨,蘭迪,這是一個varchar字段。 – chut319

+0

您可以請發佈查詢的執行計劃,這可能會揭示問題,另一件事情如果鏈接服務器登錄沒有足夠的權限,它可能沒有檢索到統計信息。 – Farfarak

回答

0

鏈接的服務器供應商爲我提供了不同的來源。而不是連接到一個視圖(它本身分佈在多個服務器上),現在我連接到一個表。這與Brian的INNER REMOTE JOIN建議相結合幾乎可以立即返回完整的數據集。

雖然我無法遵循增強的特權/鏈接服務器選項有點令人沮喪,但至少此查詢運行良好。

非常感謝大家的幫忙!

1

嘗試JOIN來代替:

SELECT V.ColumnA 
     ,V.ColumnB 
     ,V.ColumnC 
FROM [LinkedServer].[Database].[Schema].[View] V 
INNER JOIN #TempTable T ON V.ColumnA = T.ColumnA 
+0

嗨RedFilter,我已經試過這個,但是性能還是一樣糟糕,如果不是更糟。 – chut319

+0

連接將與IN類似。但是,您可以嘗試遠程提示(即:INNER REMOTE JOIN #TempTable),特別是如果臨時表所包含的行數遠遠少於鏈接的服務器視圖。看到這裏:http://www.sqlmag.com/article/quering/speeding-up-the-query – brian

+0

謝謝,布賴恩。我現在已經嘗試了INNER REMOTE JOIN,它確實提高了性能。查詢大約需要。運行10秒鐘,從一分鐘以下,這是更好,但仍然不是很好。我已經聯繫了鏈接服務器的所有者,根據您的其他帖子討論權限。 – chut319

0

它可能涉及到如何創建查詢計劃。在一種情況下,SQL服務器知道它將在比較中使用什麼值,在它估計的第二個值中。 單擊「包括實際執行計劃」後,在單獨的Management Studio窗口中運行每個查詢。你可能會看到不同的計劃。 我要檢查的第一件事是將鼠標懸停在鏈接操作的箭頭上(從胖子開始),並將預計行數與實際行數進行比較。這些值的差異很大(10?)會導致SQL服務器做出錯誤的決定(表掃描與索引等)。如果你看到這個,你可能會考慮提示讓SQL改變它的計劃 - 如果你需要使用慢速查詢!提示的一大問題是,隨着數據量的變化,提示很容易成爲一種障礙,而不是一種好處,所以它們被認爲是最後的手段。

+0

這可能與鏈接的服務器登錄沒有足夠的遠程權限來獲取必要的統計信息來構建體面的計劃有關。 「對錶中任何列具有有限權限的用戶可能沒有足夠的權限來獲取所有有用的統計信息,並且可能會收到效率較低的查詢計劃並且體驗不佳的性能。」 http://msdn.microsoft.com/en-us/library/ms175537%28v=sql.105%29.aspx – brian

+0

我完全錯過了「鏈接」服務器的參考:( – PatFromCanada

+0

謝謝,帕特/布賴恩 - 我'與聯繫服務器供應商聯繫,看看我能否獲得增強的權限 – chut319