我有一个表格MY_TABLE
约900万行。查询性能悖论:独特的群集与非唯一的非群集索引
该表共有38列。这是有关我的问题的列有:
RECORD_ID
:身份,BIGINT,具有独特的聚集索引RECORD_CREATED
:日期时间,与非唯一&非聚集索引现在
我运行以下两个查询,自然期望第一个执行速度更快,因为数据按具有唯一聚簇索引的列进行排序,但它以某种方式执行了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
执行时间分别为1630ms和6ms。
请指教。
P.S.:由于环境的安全策略,我看不到执行计划或使用SQL Profiler
。
第二个只是一个直接索引寻求。如果索引不覆盖,则读取第一行大于或等于查找点以及可能的单个查找。在你的情况下,索引将被覆盖,因为NCI总是包含CI密钥,因此不需要查找。 – 2014-09-10 18:39:26
@马丁史密斯,我真的很抱歉,但我完全不理解你的评论。你能解释一下吗?答案也是受欢迎的。 – 2014-09-10 19:26:28
我不会在PC上提交答案,因为我不在PC上。通常'RECORD_CREATED> ='20140801'可以通过范围寻找来满足。找到索引中的相关点,然后一起扫描。因为您只想索引顺序中的前1位,SQL Server可以在读取第一行时立即停止范围查找。您的选择列表实际上位于不同的列'record_id'上,但它也静默地包含在非聚集索引中,因为它是聚簇索引键。 – 2014-09-10 19:32:43