2012-09-11 33 views
0

我的表格裏面大約有365百萬行,我們每天在數據一年後添加額外的百萬行,並將其移動到另一個存檔我們數據的表中。MSSQL加速查詢365 Millon行

我在DataCollectionID上有一個PK聚簇索引。

我有另外一個指標:在由assetid,DataPointID一個獨特的Nonclusted指數和DatapointDate

我需要對錶很快運行多個選擇查詢......這是我的選擇查詢:

SELECT [DataPointID] 
    ,[SourceTag] 
    ,[DatapointDate] 
    ,[DataPointValue] 
FROM DataCollection 
Where 
    DatapointDate >= '2012-09-07' AND 
    DatapointDate < '2012-09-08' AND 
    DataPointID = 1100 
ORDER BY DatapointDate 

該查詢應該返回8,640行,但它需要執行00:00:08(8秒)。即使我說過給我前10名,仍然需要8秒。有人可以幫助我加快這個過程嗎?

+0

難道這只是表現慢嗎? – Arran

+3

我已投票結束此問題,將其遷移到dba.stackexchange.com,我相信這更適合那裏 – Lamak

+0

一旦我們確定它是配置問題,應該移動它。如果他沒有把它放到存儲過程中,它仍然是一個編碼/設計問題。 – egrunin

回答

3

我認爲一個更有效的索引來幫助這個查詢將是在DataPointID,DataPointDate,按順序。這將允許優化器在第一個索引列上用等號運算符快速縮小字段範圍,然後在該集合內找到日期範圍。

有索引和相似的查詢的一些很好的例子在這裏:

http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order

+0

男人,超級簡單的響應!謝謝你,這很好 –

0

如果這是動態SQL,則應將其放入存儲過程中,並記住使用SET NOCOUNT ON

否則,它聽起來像一個硬件問題:在這種情況下,更多的內存可能會有所幫助。

+0

好吧,讓我試着把它放到一個SP –

+0

我創建了一個存儲過程,它仍然需要8秒來執行 –

0

你需要一個更好的覆蓋指數,是這樣的:

create index _idx ON DataCollection (DataPointDate, DataPointId) 
include (SourceTag, DataPointValue) 

通常你最想要的選擇性(即最獨特的)列,因此這可能是dataPointDate或dataPointId,具體取決於您的數據。