2011-09-08 80 views
1

我有一個需要4分鐘的報告查詢,並且在我們的最大允許限制下應用了30秒。我應該使用臨時表嗎?

我注意到它有很多內部連接。其中一個,我看,它是加入到一個Person表格中,該表格有數百萬行。我想知道如果分解查詢會更有效率。這樣做效率會更高:

假設所有密鑰都已編入索引。 表C有800萬條記錄,表B有600萬條記錄,表A有40萬條記錄。

SELECT Fields 
FROM TableA A 
INNER JOIN TableB B 
ON b.key = a.key 
INNER JOIN Table C 
ON C.key = b.CKey 
WHERE A.id = AnInput 

或者

SELECT * 
INTO TempTableC 
FROM TableC 
WHERE id = AnInput 

- TempTableC現在有1000條記錄 然後

SELECT Fields 
FROM TableA A 
INNER JOIN TableB B --Maybe put this into a filtered temp table? 
ON b.key = a.key 
INNER JOIN TempTableC c 
ON c.AField = b.aField 
WHERE a.id = AnInput 

基本上,帶來的結果集到臨時表,然後再加入。

+4

如果可能,請發佈緩慢查詢的執行計劃。 – Tony

+1

6-8百萬條記錄不是那麼大,並且不會在正確編制索引的表上造成問題。我經常處理4億個記錄表,這些記錄表對查詢來說表現很好。 – Jamiec

+0

提供的執行計劃將提供洞察實際性能開銷發生的位置,以及驗證正確的索引使用情況。請分享。 –

回答

3

如果您的Person表正確索引,那麼INNER JOIN不應該導致這樣的問題。檢查您是否在所有表中加入的列上創建了索引。對於似乎是一個相對簡單的查詢,使用臨時表似乎是在數據庫設計不完善的問題上進行討論。

正如其他人所說,唯一確定的方法是發佈您的查詢計劃。

+0

您可以通過獲取查詢計劃來做到這一點。 –

+0

它歸結爲一個非常愚蠢的子查詢,這是每行的運行....感謝您的幫助。 – Craig