Sql-Server
如何優化這個 Select MAX() SQL 查詢?
在下面的選擇查詢中,返回結果大約需要 1 分鐘,似乎該表有超過 200 萬條記錄並且還在增長。表中沒有我可以使用的索引。如何優化此查詢?
SELECT MAX(StartDate) AS Expr1 FROM [MYSERVER].MYDB.dbo.ProductActivity AS ProductActivity_1
我已經嘗試過以下方法,這也需要 1 分鐘才能得到結果
SELECT TOP(1) * FROM [MYSERVER].MYDB.dbo.ProductActivity AS ProductActivity_1 ORDER BY StartDate DESC
還有另一種優化查詢的方法嗎?
正如評論中提到的,一個索引
StartDate
會讓你的查詢直接找到它需要的行,而不是掃描整個表或另一個索引(這可能是它現在正在做的事情):CREATE NONCLUSTERED INDEX IX_StartDate ON dbo.ProductActivity (StartDate DESC);
與任何其他索引一樣,只要將行插入表中或從表中刪除,就需要維護該索引
ProductActivity
。並且隨時StartDate
更新列(儘管僅基於名稱似乎不太可能)。這似乎不會增加很多成本,但您應該使用您的工作量進行測試以確定。如果
MAX(StartDate)
經常需要,則保留此索引可能是值得的。如果對該表有大量寫入(每秒數百或數千次),並且
MAX(StartDate)
不需要經常寫入,那麼您最好定期等待 1 分鐘左右以完成該查詢,而不是支付每次寫入的成本。
另一種可能性是使用您已有的與 StartDate 相關的索引。
例如,如果您有一個 IDENTITY 列作為主鍵,並且 StartDate 在添加新行且從不更新時填充為 GETDATE() ,那麼您可以獲得幾乎相同的結果,如下所示:
SELECT StartDate AS Expr1 FROM [MYSERVER].MYDB.dbo.ProductActivity AS ProductActivity_1 WHERE ID = ( SELECT MAX(ID) FROM [MYSERVER].MYDB.dbo.ProductActivity AS ProductActivity_1 )
或者,您可以抓取一小部分行,您可以確信其中包含正確答案,然後查看其中的 MAX StartDate。