2013-08-20 15 views
3

我使用的是SQL Server 2008中爲什麼這兩個查詢得到類似的時間(大約52秒超過2 milions行)

我需要你爲什麼這兩個查詢得到類似的時間(大約52秒徵求意見超過2百萬行):

查詢1:

DBCC DROPCLEANBUFFERS 

DECLARE @curr INT 
SET @curr = YEAR(GETDATE()) 

SELECT MAX([Date]) 
FROM DB_Item 
WHERE YEAR([Date]) = @curr 

問題2:

DBCC DROPCLEANBUFFERS 

SELECT MAX([Date]) 
FROM DB_Item 

隨着使用實際執行計劃,我看到它與Clustered Index scan掃描。

那麼,爲什麼它和我們有另一種方法快速獲得Date的最大值?

非常感謝您的幫助。

謝謝。

回答

6

對於第二個查詢,您可以通過在日期列上添加索引來加速它。

對於第一個查詢,您需要進行兩項更改。首先在日期列上創建一個索引,然後將查詢更改爲使用between而不是equals的左側的函數。搜索目標年1月1日12:00至12月31日11:59:59之間的日期。這樣SQL Server可以使用索引。

+1

是的,這聽起來很合理。我明白爲什麼Query1很慢,但我不明白爲什麼Query2速度很慢。是否因爲聚集索引僅在索引中的所有字段上提供最大值時才起作用? –

+1

@RobertHarvey,聚集索引只會在掃描索引字段(主鍵)時有所幫助。 –

+2

默認掃描策略將使用聚簇索引進行掃描。但是,這並不意味着提供了索引功能。確保你有一個索引,聚簇或非聚簇,這是在你請求的最大值(這被稱爲覆蓋索引)在同一列上 –

1

聚簇索引掃描是表掃描,因爲實際數據是聚簇索引的最低級別。所以在這種情況下,兩個查詢都在查看所有行。

因此,日期列上非聚集索引將有助於第二查詢

在這種情況下,它也將有助於第一查詢,因爲今年是優化搜索(?找不到在哪裏我讀這一點)。這在SQL Server中很少見:usually functions on predicate columns means indexes won't be used

+0

感謝您的解釋。我現在知道了。 –

相關問題