3

我正在使用 SQL Server 2008。

我需要您的建议,说明为什么这两个查询的时间相似(超过 200 万行大约需要 52 秒):

查询一:

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快速获得 1 个表中的最大值?

非常感谢您的帮助。

谢谢。

4

2 回答 2

6

对于第二个查询,您可以通过在日期列上添加索引来加快速度。

对于第一个查询,您需要进行两项更改。首先在日期列上创建索引,然后将查询更改为使用介于而不是等号左侧的函数。搜索目标年份的 1 月 1 日上午 12:00 到 12 月 31 日晚上 11:59:59 之间的日期。这样 SQL Server 就可以使用索引了。

于 2013-08-20T04:01:08.357 回答
1

聚集索引扫描是表扫描,因为实际数据是聚集索引的最低级别。所以在这种情况下,两个查询都在查看所有行。

因此,日期列上的非聚集索引将有助于第二次查询

在这种情况下,它也将有助于第一个查询,因为 YEAR 是 SARGable (?找不到我在哪里读到的)。这在 SQL Server 中非常罕见:通常谓词列上的函数意味着不会使用索引

于 2013-08-20T07:05:59.323 回答