Muc*_*ida 3 sql sql-server indexing full-table-scan sql-execution-plan
据我所知,堆表是没有聚簇索引的表,没有物理顺序.我有一个堆栈表"扫描"有120k行,我使用这个选择:
SELECT id FROM scan
Run Code Online (Sandbox Code Playgroud)
如果我为列"id"创建一个非聚集索引,我会得到223个物理读取.如果我删除非聚集索引并更改表以使"id"成为我的主键(以及我的聚集索引),我将获得515个物理读取.
如果聚集索引表是这样的图片:

为什么Clustered Index Scans像表扫描一样工作?(或者在检索所有行的情况下更糟).为什么它不使用具有较少块的"聚簇索引表"并且已经具有我需要的ID?
SQL Server索引是b树.非聚集索引仅包含索引列,b树的叶节点是指向适当数据页的指针.聚簇索引是不同的:它的叶节点是数据页本身,聚簇索引的b树成为表本身的后备存储; 堆不再存在于表中.
您的非聚集索引包含一个可能是整数列.这是一个小而紧凑的索引.您的查询select id from scan具有覆盖索引:只需检查索引即可满足查询,这就是正在发生的事情.但是,如果您的查询包含不在索引中的列,假设优化程序选择使用非聚集索引,则需要额外的查找来从聚簇索引或堆中获取所需的数据页.
要了解发生了什么,您需要检查优化器选择的执行计划: