2012-01-27 118 views
0

我在我的一張表中有4百萬條記錄。我需要獲取最近1周內添加的最後25條記錄。SQL Server最後25條記錄查詢優化

這是我當前查詢的外觀

SELECT TOP(25) [t].[EId], 
       [t].[DateCreated], 
       [t].[Message] 
FROM [dbo].[tblEvent] AS [t] 
WHERE ([t].[DateCreated] >= Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 7, 0) 
     AND [t].[EId] = 1) 
ORDER BY [t].[DateCreated] DESC 

現在我沒有這個表上執行任何索引,並且不打算生一個。這個查詢需要大約10-15秒來運行,我的應用程序超時,現在有辦法改善它嗎?

+6

爲什麼你不想要一張桌子上的索引? – 2012-01-27 12:58:31

+0

這是一個客戶端驅動的調用,他們不需要索引,我不會與它們爭論更多! – Vivek 2012-01-27 13:02:07

+5

該告訴他們與之共處或獲得更快的光盤子系統。點。當客戶與現實矛盾時,現實會獲勝,並不在乎客戶的妄想。在Sql級別上你可以做的很多優化都沒有擺脫你強制執行的表掃描的IO。 – TomTom 2012-01-27 13:03:43

回答

3

如果表中有一個自動增量的ID(不是開齋節,但是是一個單獨的PK),則可以通過ID desc而不是DateCreated進行訂購,這可能會使您的訂單更快。

否則你確實需要一個索引(但你的問題說你不需要)。

+0

它不會沒有索引 - 仍然是全表掃描。 – TomTom 2012-01-27 13:03:57

+0

嗯,你是對的 - 我隱含地把這個問題解釋爲「沒有額外的索引」到PK – Pleun 2012-01-27 13:06:13

4

您應該EId, DateCreated或至少DateCreated

創建一個索引沒有,我能想到的是通過insert觸發器保持在一個單獨的表中的最後25(也可能是update優化本的這個唯一的出路以及delete觸發器)。

2

如果表沒有索引來支持查詢,您將被迫執行表掃描。

您將努力避開表格掃描方面 - 隨着表的增長,響應時間會變慢。

你將不得不努力教育你的客戶關於他們面臨的問題,他們應該考慮索引。他們可能會說不,你需要顯示支持推理的證據,向他們展示有/沒有的時間,並且確保對插入記錄的影響也被顯示出來,這對添加記錄來說是相對簡單的成本/收益/損失索引/不添加它。如果他們堅持沒有索引,那麼你別無選擇,只能延長你的超時時間。

0

你也應該嘗試查詢提示: http://msdn.microsoft.com/en-us/library/ms181714.aspx

使用選項FAST n - 行數。

+0

上的聚集索引這不會有幫助。沒有任何索引,SQL Server將需要掃描所有400萬行來評估'[EId] = 1'謂詞並執行'TOP N'排序。 – 2012-01-27 14:40:34