2016-06-22 108 views
-4

我有一個很大的查詢,以便從40個表中獲取數據;該查詢包含(40表選擇),每個選擇包含案例和多聯接和條件,我也有UNION每個表選擇後。數據加載性能(SQL Server 2008)

從這些表中選擇這些選項存在於CTE中,然後從CTE中選擇最終選項。

主要的問題是性能問題,因爲我在每個表中都有大量的數據。

您能否提供給我您的主要想法或提示以提高查詢性能?

+1

這是一個非常廣泛的問題。爲什麼你爲此使用CTE,爲什麼要在一個大查詢中結合所有數據?你的索引是否正確? –

+0

將問題分解成更小的部分。單獨檢查每個SELECT。哪些是問題查詢? – jarlh

+0

當然,這些索引是正確的。 另外我使用聯合爲了從很多表中返回確切的數據! – Jons

回答

0
  1. 查看所有40個表的大小並在查詢計劃中查看SQL是否掃描這些表或尋找。如果它掃描它,那顯然是及時的I/O操作。
  2. 在查詢計劃中檢查您的統計信息和預估與實際行的表格。這可能會導致TempDB中沒有有效的計劃和溢出。
  3. 由於存在大量數據,因此可能存儲空間不足,而且頁面預期壽命較低,甚至無法交換文件活動。
  4. 由於有40個表,SQL Server可能無法達到最佳執行計劃。然後你必須查看它失敗的地方並修復它。

最好的做法是遵循先前的建議,並儘可能將您的查詢分成較小的部分。

舉例來說,如果你有這樣的:

;WITH CTE as (SELECT a FROM A UNION SELECT b FROM B) 
SELECT * FROM CTE 
INNER JOIN C on CTE.a = C.c 

嘗試通過這種替換:

SELECT * FROM A 
INNER JOIN C on A.a = C.c 
UNION 
SELECT * FROM B 
INNER JOIN C on B.b = C.c 

甚至做這樣的事情:

SELECT * INTO #t 
FROM A INNER JOIN C on A.a = C.c 
GO 
INSERT INTO #t 
SELECT * FROM B INNER JOIN C on B.b = C.c 
GO 
SELECT * FROM #t;