2008-11-27 37 views
1

我無法嘗試優化以下查詢sql server 2005.有誰知道我該如何改進它。這裏使用的每個表格都有大約4000萬行。我盡了最大的努力來優化它,但我設法做到完全相反。優化工會

感謝

SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2005 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2006 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2007 
    UNION ALL 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2008 

也許我應該說其他有關架構的東西,這裏使用的所有表都歷史表,他們不參考任何其他表。這些已經是cos和SIN的索引了。我只是想知道是否有任何其他方式來優化查詢......你可以想象160millon記錄很難得到:s

+0

如果不知道架構以及要實現的目標,通常無法優化查詢。 – Rowan 2008-11-27 14:17:18

+0

什麼樣的報告可能需要1.6億行,沒有總計,沒有組,沒有排序 - 它可能會有什麼用處? – dkretz 2008-11-28 05:39:02

+0

你有/需要重複輸入嗎?也許你可以過濾得到更少的行? – Fredou 2008-11-27 14:39:44

回答

2

似乎查詢只是將分離的歷史表合併到包含所有數據的單個結果集。在這種情況下,查詢已經是最優的。

1

在每個表上放置一個cos和sin的複合索引。這與您在不重新設計表格設計時一樣好(在這個例子中,它看起來應該只有一張表格)

+0

索引如何幫助,因爲他沒有被任何東西過濾。 – Rowan 2008-11-27 14:19:50

+0

既然你只選擇了那兩列,那麼SQL服務器就可以直接從組合索引中獲取數據,而不必實際記錄數據。只有在表格中有其他列的情況下才會有所改進。 – 2008-11-27 14:23:00

1

由於沒有WHERE子句,我不相信你可以做任何事情來提高這個PoV的性能。

你已經正確使用了UNION ALL,所以這裏沒有幫助。

我能想到的唯一的其他事情是表格上是否有更多列?如果是這樣,您可能會從磁盤獲取比您需要更多的數據,從而減慢查詢速度。

2

另一種方法是解決你爲什麼需要全部1.6億行的問題?如果您正在進行某種報告,則可以創建單獨的報告表格,這些報告表格已經彙總了一些數據。或者您是否真的需要數據倉庫來支持您的報告需求。

1

這可能值得嘗試索引視圖。你可以把上面的語句放到Dave建議的索引的視圖中。這需要一點時間才能開始構建,但會更快地返回結果(這是假設數據集變化不大,因此您可以承擔額外的事務開銷)。

0

您可能會考慮使用帶有年份指示符的單個分區表。

我還是好奇 - 這個代碼是在一個視圖中還是SP在160m行上運行,或者它實際上是否會沿着導線返回160m行。如果是這樣,這是一個非常多的數據返回,這是一個有效的提取,它只是需要一段時間才能走下線。

0

沒有優化要完成。由於您要從所有表中選擇所有記錄,根據定義,您可以從一個結果集中的所有表中獲取所有記錄。

這樣做的原因是什麼?