我有一张桌子
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条记录并将其发送回去
答案 0 :(得分:0)
在一个3亿行的表中,我假设您显然在表中有很多碎片。
创建聚簇索引将消除碎片,减少要读取和排序的页面数,以便查询优化器可以对表执行查找而不是扫描。区别在于SQL Server需要执行的读取次数才能返回要求的行数