查询性能悖论:唯一群集与非唯一非群集索引

时间:2014-09-10 18:25:23

标签: sql-server indexing sql-server-2012 query-performance sql-server-performance

我有一张表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

1 个答案:

答案 0 :(得分:2)

SQL Server有一些关于如何执行此查询的选择。 可以开始排序所有项目,利用您提到的索引,然后通过过滤掉与WHERE子句不匹配的任何项目来跟进。但是,减少使用首先的数据集的大小通常会更快,因此您不必对任何项目进行排序。

因此,SQL Server最有可能选择首先执行WHERE过滤器。当它执行此操作时,很可能首先使用RECORD_CREATED上的非唯一非聚集索引跳过RECORD_CREATED小于'20140801'的所有项目,然后在此之后获取所有项目。

此时,所有项目都按照在RECORD_CREATED索引中找到它们的顺序进行预排序,因此第二个查询不需要额外的工作,但第一个查询则必须对记录执行排序已被选中。