SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题

     以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下

下面这个表格是摘自:http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.html

动作描述    使用聚集索引 使用非聚集索引
外键列   应 
主键列 
列经常被分组排序(order by)   应
返回某范围内的数据 不应
小数目的不同值 不应
大数目的不同值  不应
频繁更新的列   不应
频繁修改索引列 不应
一个或极少不同值 不应 不应

     首先看看索引是怎么创建的,我比较菜,喜欢用管理工具

创建聚焦索引

image         

选择为那个字段创建索引是通过选择的

image

非聚焦索引只需要改一下类型即可

创建了两个一个聚焦索引一个非聚焦索引

image               

书上是这么解释聚焦索引和非聚焦索引的区别

表有两种组织形式,堆或B树

当在一个表上创建聚集索引时,表组织为一个B树(平衡树),否则组织为一个堆

还有sqlserver的存储单位

页:是sqlserver存储数据的最小单位,大小为8kb

区:是由8个物理上连续的页组织成的单位

页sqlserver最小的i/o读写单位,而i/o读写中开销最大的部分是磁盘臂(disk arm)的移动,

也就是说某个查询如果需要频繁的移动磁盘臂,那查询效率就低了,

什么原因会导致磁盘臂的移动?书商还没总结完。。。。。

书还没看完,感觉索引的碎片是会触发磁盘臂移动的一个关键因素

     不同于分配顺序扫描(非聚焦索引),索引有序扫描(聚焦索引)的性能取决于索引的碎片级别,如果没有任何碎片,索引的顺序扫描的性能非常接近分配顺序扫描的性能

分配顺序扫描是按照文件进行扫描,不受逻辑碎片的影响

     任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,这些操作的开销可能非常高。

碎片,什么是碎片?书翻N页后发现了

      碎片是指逻辑扫描碎片、平均碎片百分比或外部碎片,这类碎片表示索引中无序页所占的百分比,无序页是根据页的物理顺序和页在索引链表中的逻辑顺序来确定的,碎片对索引有序扫描影响非常严重

有一些sql语句可以查看当前数据库中每个表包含碎片的百分比,常用与索引优化

如果需要修复碎片,就需要重建索引

所以我的理解是

任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,从而产生碎片

     对与聚焦索引和非聚焦索引的区别使用

动作描述    使用聚集索引 使用非聚集索引
外键列   应 
主键列 
列经常被分组排序(order by)
返回某范围内的数据 不应
小数目的不同值 不应
大数目的不同值  不应 
频繁更新的列   不应
频繁修改索引列 不应
一个或极少不同值 不应 不应

不应使用聚焦索引的两种情况(红色部分),就是因为产生了大量的碎片

那绿色的是为什么呢?我又查了一下

sqlserver 查询优化器里面

如果该查询的【选择性】足够高,优化器会会使用这个索引。

选择性是指返回行数占表总行数的百分比,高选择性是指地百分比,低选择性是指搞百分比

所以我猜绿色部分和这个【选择性】密切相关,可能低选择性会导致整表扫描

关乎非聚焦索引 在粗体字那几个环境下,为什么不建议使用,还没找到原因

尤其是一个或极少不同值 两个索引都不让用表示非常费解,那该用啥呢?用户id不就是这种情况

test
原文地址:https://www.cnblogs.com/qqloving/p/2300882.html