日期:2012-08-03 12:48:00 来源:本站整理
sqlserver索引的原理及索引成立的注意事项小结[MSSQL防范]
本文“sqlserver索引的原理及索引成立的注意事项小结[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
堆积索引,数据实际上是按次序存储的,数据页就在索引页上.就仿佛参考手册将全部主题按次序编排一样.一旦找到了所要搜索的数据,就完成了这次搜索,关于非堆积索引,索引是安全独立于数据本身构造的,在索引中找到了探求的数据,然后通过指针定位到实际的数据.
SQL Server中的索引利用尺度的B-树来存储他们的信息,以下图所示,B-树通过查找索引中的一个关键之来供应关于数据的快速拜候,B-树以类似的键记录聚合在一同,B不代表二叉(binary),而是代表balanced(均衡的),而B-树的一个核心作用就是保持树的均衡.同伙向下遍历这棵树以找到一个数值并定位记录.因为树是均衡的,所以探求任何记录都只需求等量的资源,并且获得的速度老是一致的—因为从根索引叶索引都具有相同的深度.
索引的中间层次是按照表的行数一级索引行的大小而改变的,假如利用一个较长的键(KEY)来成立索引,一个分页上就只包容较少的条目,因而索引就需求更多分页(大概说更多层),页越多那么查找就需求话费相对较长的时间来找到所需求的信息,索引便大概不太有效了.
堆积索引
堆积索引的叶级别不但包含了索引键,还包含了数据页.另一种说法数据本身也是堆积索引的一部份,堆积索引基于键值保持表中的数占据序,表中的数据页是通过一个被称作页链(page chain)的双向链接表来保护的,由于实际的数据页的页链只能按一种方法排序,因此一张表只能拥有一个堆积索引.
这里大概有一个误区,有很多介绍SQL Server索引的文档会奉告读者:堆积索引按照排序次序(sorted order)物理地存储数据.假如认为物理存储就是磁盘本身的话就会产生曲解.试想假如堆积索引需求按照特定次序在实际的磁盘上保护数据的话,那么任何改正操作都将会产生相当昂扬的代价.当一个页变满了需求一分为二的时刻,全部后续页面上的数据都必须向后移动.堆积索引中的排序次序(sorted order)仅仅表示数据页链在逻辑上是有序的.
大大都表都应当需求一个堆积索引.优化器非常偏向于采取堆积索引,因为堆积索引可以直接在叶级别找到数据.由于定义了数据的逻辑次序,堆积索引可以分外快的拜候针对范围值的查询,查询优化器可以发现只有某一段范围的数据页需求扫描.
非堆积索引
关于非堆积索引,叶级别不包含全部的数据.除了键值之外,每个叶级别(树的最底层)中的索引行包含了一个书签(bookmark),奉告SQL Server可以在那边找到与索引键呼应的数据行.一个书签大概有两种情势.假如表上存在堆积索引,书签就是呼应的数据行的堆积索引键.假如彪是堆(heap)构造,书签就是一个行表示(row identifier,RID),以"文件号:页号:槽号"的格局来定位实际的行.
主键(PRIMARY KEY)与堆积索引(CLUSTER INDEX)
严峻来说,主键与堆积索引没有任何干系,假如要说有话,那就是表中没有堆积索引的时刻,成立的主键默许就是堆积索引(除非有分外设置为NOCLUSTER).
在主键与堆积索引的处理方面,注意以下事项:
1、主键不与堆积索引别离
2、堆积索引键列尽大概避免利用int之外的数据范例
3、尽大概避免利用复合主键
成立索引时的注意事项
1、始终包含堆积索引
当表中不包含堆积索引时,表中的数据是无序的,这会降低数据检索效率.即便通过索引缩小了数据检索的范围,但由于数据本身是无序的,当从表中提取实际数据时,会产生频繁的定位问题,这也使得SQL Server基本上不会利用无堆积索引表中的索引来检索数据.
2、保证堆积索引唯一
由于堆积索引是非堆积索引的行定位器,假如它不惟一,则会使行定位器中包含帮助数据,同时也招致从表中提取数据时,需求借助行定位器中的帮助数据来定位,这会降低处理效率.
3、保证堆积索引最小
每个堆积键值都是全部非堆积索引的叶结点记录,它越小,意味着每个非堆积索引的索引叶包含的有效数据越多,这关于晋升索引效率很有好处.
4、覆盖索引
覆盖索引是指索引中的列包含了数据处理中触及的全部列,覆盖索引相当原始表的一个子集,由于这个子集合包含了数据处理触及的全部列,因此操作这个子集便可以满意数据处理需求.普通而言,假如大大都处理都只触及某个大表的某些列,可以考虑为这些列成立覆盖索引.
覆盖索引的成立办法是将要包含的列中的关键列做为索引键列,将其他列做为索引的包含列(利用索引成立语句中的INCLUDE子句).
5、适当的索引
当数据发生改变时,SQL Server会同步保护相关索引中的数据,过量的索引会加影响数据变更的处理效率.因此,只应当在常常利用的列上成立索引.
适当的索引还表目前对索引列的组合方法的掌握上.比方,假若有两个列col1和col2,这两个列的组合会产生三种利用情形:单独利用col1、单独利用col2及同时利用col1和col2.假若有为每种情形都成立索引,则需求成立三个索引.但也可以只成立一个复合索引(col1, col2),这样可以顺次满意col1+col2、col1、col2这三种方法的查询,此中,col2操纵这个查询会对比委曲(还要配合单独的统计),可以视实际情形肯定能否需求为col2成立单独的索引.
分外注意:
不要成立反复索引,目前最常见的反复索引是单独为某个列成立主键和堆积索引
与直接从表中提取数据相比,按照索引检索数据,多了一个索引检索的历程,这个历程要求可以尽大概缩小数据检索范围,并且利用最少的时间,这样才能真正保证可以通过索引提高数据检索效率.
实现上述目的,关于索引键列的挑选,应当遵守以下原则:
挑选性原则
挑选性是满意条件的记录占总记录数的百分比,这个比率应当尽大概低,这样才能保证通过索引扫描后,只需求从底子表提取很少的数据.
假如这个比率偏高,则不该该考虑在此列上成立索引.
数据密度原则
数据密度是指列值唯一的记录占总记录数的百分比,这个比率越高,则阐明此列越合适成立索引.
在考虑数据密度的时刻,还要注意数据分布的问题,只有常常检索的密度高时,才合适成立索引.比方,假如一张表有10万记录,固然某个列不反复的记录有9万条,但假如常常检索的2万条记录,其不反复的列值才几十条的话,这个列是不太合适成立索引的.另一种情形是,整体数据密度不大,但常常检索的数据的密度大,比方订单的状况,普通来说,订单的状况就几种,但已经Close的订单常常占整个数据的绝大部份,但数据处理的时刻,基本上都是检索未Close的订单,这种情形下,为订单的状况列成立索引还是对比有效的(SQL Server 2008中,可认为这种列成立具有更佳效果的挑选索引).
6、索引键列大小
普通不宜为超越100Byte的列成立索引.
7、复合索引键列次序
在索引中,索引的次序主要由索引中的每一个键列肯定,因此,关于复合索引,索引中的列次序是很重要的,应当优先把数据密度大,挑选性列,存储空间小的列放在索引键列的前面.
链接:http://topic.csdn.net/u/20120721/10/b057fc3b-4304-44ee-b7b5-16160f30bacc.html?seed=656570155&r=79190463#r_79190463
作者 Beirut(小爱)
以上是“sqlserver索引的原理及索引成立的注意事项小结[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论