据我所知,堆表是没有聚集索引的表,没有物理顺序。
我有一个包含 120k 行的堆表“扫描”,我正在使用此选择:
SELECT id FROM scan
如果我为“id”列创建非聚集索引,我得到223 物理读取。
如果我删除非聚集索引并更改表以使“id”成为我的主键(以及我的聚集索引),我得到515 物理读取.
如果聚集索引表是这样的图:
为什么聚集索引扫描像表扫描一样工作? (或者在检索所有行的情况下更糟)。为什么它不使用块较少且已经具有我需要的ID的“聚集索引表”?
SQL Server 索引是 B 树。非聚集索引仅包含索引列,b 树的叶节点是指向适当数据页的指针。聚集索引则不同:它的叶节点是数据页本身,聚集索引的 B 树成为表本身的后备存储;该表的堆不再存在。
您的非聚集索引包含一个可能是整数的列。首先,它是一个小而紧凑的索引。您的查询select id from scan
has a 覆盖指数:只需检查索引即可满足查询,这就是正在发生的情况。但是,如果您的查询包含不在索引中的列,假设优化器选择使用非聚集索引,则需要进行额外的查找来从聚集索引或堆中获取所需的数据页。
要了解发生了什么,您需要检查优化器选择的执行计划:
- See 显示图形执行计划 http://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx
- 参见红门SQL Server 执行计划 http://download.red-gate.com/ebooks/SQL/eBOOK_SQLServerExecutionPlans_2Ed_G_Fritchey.pdf,格兰特·弗里奇
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)