SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题
以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下
下面这个表格是摘自:http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.html
动作描述 | 使用聚集索引 | 使用非聚集索引 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
列经常被分组排序(order by) | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
频繁修改索引列 | 不应 | 应 |
一个或极少不同值 | 不应 | 不应 |
首先看看索引是怎么创建的,我比较菜,喜欢用管理工具
创建聚焦索引
选择为那个字段创建索引是通过选择的
非聚焦索引只需要改一下类型即可
创建了两个一个聚焦索引一个非聚焦索引
书上是这么解释聚焦索引和非聚焦索引的区别
表有两种组织形式,堆或B树
当在一个表上创建聚集索引时,表组织为一个B树(平衡树),否则组织为一个堆
还有sqlserver的存储单位
页:是sqlserver存储数据的最小单位,大小为8kb
区:是由8个物理上连续的页组织成的单位
页sqlserver最小的i/o读写单位,而i/o读写中开销最大的部分是磁盘臂(disk arm)的移动,
也就是说某个查询如果需要频繁的移动磁盘臂,那查询效率就低了,
什么原因会导致磁盘臂的移动?书商还没总结完。。。。。
书还没看完,感觉索引的碎片是会触发磁盘臂移动的一个关键因素
不同于分配顺序扫描(非聚焦索引),索引有序扫描(聚焦索引)的性能取决于索引的碎片级别,如果没有任何碎片,索引的顺序扫描的性能非常接近分配顺序扫描的性能
分配顺序扫描是按照文件进行扫描,不受逻辑碎片的影响
任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,这些操作的开销可能非常高。
碎片,什么是碎片?书翻N页后发现了
碎片是指逻辑扫描碎片、平均碎片百分比或外部碎片,这类碎片表示索引中无序页所占的百分比,无序页是根据页的物理顺序和页在索引链表中的逻辑顺序来确定的,碎片对索引有序扫描影响非常严重
有一些sql语句可以查看当前数据库中每个表包含碎片的百分比,常用与索引优化
如果需要修复碎片,就需要重建索引
所以我的理解是
任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,从而产生碎片
对与聚焦索引和非聚焦索引的区别使用
动作描述 | 使用聚集索引 | 使用非聚集索引 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
列经常被分组排序(order by) | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
频繁修改索引列 | 不应 | 应 |
一个或极少不同值 | 不应 | 不应 |
不应使用聚焦索引的两种情况(红色部分),就是因为产生了大量的碎片
那绿色的是为什么呢?我又查了一下
sqlserver 查询优化器里面
如果该查询的【选择性】足够高,优化器会会使用这个索引。
选择性是指返回行数占表总行数的百分比,高选择性是指地百分比,低选择性是指搞百分比
所以我猜绿色部分和这个【选择性】密切相关,可能低选择性会导致整表扫描
关乎非聚焦索引 在粗体字那几个环境下,为什么不建议使用,还没找到原因
尤其是一个或极少不同值 两个索引都不让用表示非常费解,那该用啥呢?用户id不就是这种情况