fanybupt

日出而作,日入而息,凿井而饮,耕田而食,帝力于我何有哉?

导航

学习SQLServer - 索引

Posted on 2012-05-04 17:57  fanybupt  阅读(210)  评论(0)    收藏  举报

1、索引扫描和表扫描

索引扫描就是先查找索引,然后再读取索引对应的数据

表扫描则是直接在数据页上面查找数据

在查找数据占表中总数据量百分比很小的情况下,索引的优势是很大的,然而,如果需要取出表中绝大部分的数据,那索引将会消耗更多的资源

简单的理解就是:如果我们只想知道某个单词的意思,那么我们使用目录找到那个单词就行了,如果我们想要顺着词典背诵单词,再通过目录那就是在犯傻了。

2、聚集索引和非聚集索引

聚集索引在一个表中只能建立一个,其顺序与数据库表中顺序一致

非聚集索引在一个表中可以建立多个,其顺序和数据表存储顺序不一样

简单的理解就是:一本词典可以按照拼音进行查找,也可以按照部首进行查找,

拼音查找就扮演了聚集索引的角色,而部首查找则扮演了非聚集查找的角色

3、全表扫描

全表扫描和表扫描可能还是有一些区别的,表扫描一定是全表扫描,而全表扫描不一定是通过表扫描实现的。

比如在一个建立了聚集索引的表上,全表扫描通过聚集索引进行,这种情况下,将会读取所有的索引页和数据页。

4、组织结构

堆结构

堆是不包含聚集索引的表

堆内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的信息。

聚集索引结构

非聚集索引结构

通过这几幅图我们可以得出一些结论

对于堆结构,数据是无序存放的,我们只能通过IAM页的记录查找数据,问题: 执行计划中的表扫描指的是不是使用IAM进行扫描?

对于聚集索引结构和非聚集索引结构,我们可以看到,它们的区别在于树的底部,聚集索引的树的底部就是数据页,而非聚集索引树的底部还是一个索引页,所以聚集索引会占用更少的空间和拥有更快的查询速度。

问题:

聚集索引要求数据必须按照聚集索引的顺序进行存储,是不是意味着如果我修改聚集索引,已有数据必须重新排序与重新存储?

由于聚集索引有序,如果我在聚集索引列ID上加了一个间隔很大的偏移,是否意味着数据库将为这个偏移预留足够的空间?还是数据库会在必要的时候移动数据,而不是预留那么多的空间?还是数据库直接把偏移很大的数据放置到下一个数据页?

5、索引的数据构成

聚集索引

索引行:每个索引行包括一个键值和一个指针,该指针指向 B 树上的某一中间级页或叶级索引中的某个数据行

索引页:索引中的页均被链接在双向链接列表中,数据页可看做最后一级索引页,因此也存在双向链表。索引页包含索引行。

非聚集索引

索引行:非聚集键值和行定位符,此定位符指向聚集索引或堆中包含该键值的数据行

表是堆(表没有聚集索引):行定位器是指向行的指针,该指针由文件标识符 (ID)、页码和页上的行数生成。问题:对于中间级,结构是否和聚集索引一致,区别只在于叶节点?

表有聚集索引:行定位器是行的聚集索引键。问题:这里指向的聚集索引键是否应该是聚集索引叶节点中的聚集索引键?