Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么聚集索引加快了选择顶部_Sql Server_Tsql - Fatal编程技术网

Sql server 为什么聚集索引加快了选择顶部

Sql server 为什么聚集索引加快了选择顶部,sql-server,tsql,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行,并在没有索引的情况下返回它们 这让我觉得它在做某种排序,但我不知道它会用什么 关于这一点,请回答一些问题 这里的应用程

我有一张桌子

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
插入到z.archive中
从中选择(从dbo.maintable输出中删除前100000个已删除。*)
检查站
与索引相关的速度有了非常显著的提高


我手头没有这两个计划,但在索引之前,它确实是一个表扫描。但为什么这比指数还要慢呢?由于缺少谓词,我不明白为什么它不只是从数据文件中抓取前N条记录并将它们发送回一个3亿行表中,我假设表中显然存在大量碎片


创建聚集索引将删除碎片,减少要读取和排序的页面数,以便查询优化器可以对表执行搜索而不是扫描。不同之处在于SQL Server返回请求的行数所需的读取量

检查执行计划以了解实际情况如果您背靠背执行这些运行,第二次,100K行可能都在缓存中。没有磁盘i/O执行计划可能会泄露这些信息,可以吗?如果这是一个单列表,它将导致表扫描和索引扫描,但其他列在这里也很重要。我很好奇,如果你删除聚集索引,时间是否会回到30秒。也许可以在索引上查找?不过我还是希望在这里进行索引扫描。
while @@rowcount <> 0
    insert into z.archive
        select from (delete top 100000 from dbo.maintable output deleted.*)
CHECKPOINT