我有一张表MY_TABLE
,大约有900万行。
此表中共有38列。与我的问题相关的列是:
RECORD_ID
:identity,bigint,具有唯一聚簇索引RECORD_CREATED
:datetime,非独特&非聚集索引现在我运行以下两个查询,并且自然希望第一个查询执行得更快,因为数据按照具有唯一聚簇索引的列进行排序,但不知怎的,它执行的速度要慢271倍(!)。
SELECT TOP 1
RECORD_ID
FROM
MY_TABLE
WHERE
RECORD_CREATED >= '20140801'
ORDER BY
RECORD_ID
SELECT TOP 1
RECORD_ID
FROM
MY_TABLE
WHERE
RECORD_CREATED >= '20140801'
ORDER BY
RECORD_CREATED
执行时间分别为1630 ms和6 ms。
请告知。
P.S。:由于环境的安全策略,我看不到执行计划或使用SQL Profiler
。
答案 0 :(得分:2)
SQL Server有一些关于如何执行此查询的选择。 可以开始排序所有项目,利用您提到的索引,然后通过过滤掉与WHERE子句不匹配的任何项目来跟进。但是,减少使用首先的数据集的大小通常会更快,因此您不必对任何项目进行排序。
因此,SQL Server最有可能选择首先执行WHERE
过滤器。当它执行此操作时,很可能首先使用RECORD_CREATED上的非唯一非聚集索引跳过RECORD_CREATED小于'20140801'的所有项目,然后在此之后获取所有项目。
此时,所有项目都按照在RECORD_CREATED索引中找到它们的顺序进行预排序,因此第二个查询不需要额外的工作,但第一个查询则必须对记录执行排序已被选中。