为什么聚簇索引加快选择顶部

时间:2018-07-03 18:48:59

标签: sql-server tsql

我有一张桌子

id, name, date

它有3亿行。

当我跑步时:

select top 100000 * from table

运行需要30秒钟以上的时间(SQL Server 2016最新的sp / su 24核和148GB Ram,均具有闪存RAID)

我在id上添加了聚集索引,运行相同的查询,它几乎立即返回。

为什么PK更快?为什么SQL Server不能只从数据文件中获取前N行并在没有索引的情况下返回它们?

这使我认为它在进行某种排序或排序,但我无法确定其用途。

更多有关此问题的解答。

这里的应用程序是我们的存档器,基本上可以执行此操作(伪代码)

while @@rowcount <> 0
    insert into z.archive
        select from (delete top 100000 from dbo.maintable output deleted.*)
CHECKPOINT

与拥有索引相关的速度有了非常显着的提高。

我没有两个方便的计划,但是在索引之前,它确实是一个表扫描。但是为什么那比索引慢呢?鉴于缺少谓词,我不明白为什么它不只是从数据文件中获取前N条记录并将其发送回去

1 个答案:

答案 0 :(得分:0)

在一个3亿行的表中,我假设您显然在表中有很多碎片。

创建聚簇索引将消除碎片,减少要读取和排序的页面数,以便查询优化器可以对表执行查找而不是扫描。区别在于SQL Server需要执行的读取次数才能返回要求的行数