760176104 发表于 2015-7-2 14:51:36

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

     以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下
  下面这个表格是摘自:http://www.iyunv.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不就是这种情况
  
  
  
  
  
  
  
  
  
  
页: [1]
查看完整版本: SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题