Sql-Server

如何優化這個 Select MAX() SQL 查詢?

  • February 3, 2020

在下面的選擇查詢中,返回結果大約需要 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。

引用自:https://dba.stackexchange.com/questions/255525