设为首页 收藏本站
查看: 1414|回复: 0

[经验分享] SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题

[复制链接]

尚未签到

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82607-1-1.html 上篇帖子: SQL Server 2008 Analysis Services 多维数据库一步一步从入门到精通(一)--- 创建 Analysis Services 项目( 下篇帖子: SQL Server 2005中为大型表创建索引
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表