本文介绍了sqlserver索引的原理和建立索引时的注意事项。内容简洁易懂,一定会让你大放异彩。希望通过这篇文章的详细介绍,你能有所收获。
聚集索引,数据实际上是按顺序存储的,数据页在索引页上。就像参考手册按顺序排列所有主题一样。一旦找到要搜索的数据,搜索就完成了。对于非聚集索引,该索引安全地独立于数据本身的结构。要搜索的数据在索引中找到,然后通过指针定位实际数据。
SQL Server中的索引使用标准的B树来存储它们的信息。通过在索引中查找关键字,b树提供了对数据的快速访问。b树与相似的关键记录聚合在一起。b不代表二进制,而是代表平衡。B树的核心功能之一就是保持树的平衡。合作伙伴沿着树往下走,找到一个值并找到记录。因为树是平衡的,所以它只需要相同数量的资源来查找任何记录,并且获取的速度总是相同的——因为根索引的叶索引都具有相同的深度。索引的中间级别根据表中的行数和第一级索引行的大小而变化。如果使用一个长KEY来创建索引,那么一个页面中只能容纳几个条目,因此索引需要更多的页面(或更多的级别)。页面越多,搜索成本越长,索引的用处就越小。
聚集索引
聚集索引的叶级不仅包含索引键,还包含数据页。另一方面,数据本身也是聚集索引的一部分。聚集索引根据键值保持表中数据的顺序。表中的数据页由称为页链的双向链接表维护。因为实际数据页的页链只能以一种方式排序,所以一个表只能有一个聚集索引。这里可能有误会。许多关于SQL Server索引的文档会告诉读者,聚集索引以排序顺序物理存储数据。如果认为物理存储就是磁盘本身,就会有误解。想象一下,如果聚集索引需要以特定的顺序维护实际磁盘上的数据,任何修改操作都会花费很多。当一页变满并需要一分为二时,所有后续页面上的数据都必须向后移动。聚集索引中的排序顺序仅意味着数据页链在逻辑上是有序的。
大多数表应该需要聚集索引。优化器非常倾向于采用聚集索引,因为聚集索引可以直接在叶级别查找数据。因为定义了数据的逻辑顺序,所以聚集索引可以非常快速地访问范围值查询,并且查询优化器可以发现只需要扫描特定范围的数据页。
非聚集索引
对于非聚集索引,叶级不包含所有数据。除了键值之外,每个叶级别(树的底部)中的索引行还包含一个书签,该书签告诉SQL Server在哪里可以找到与键值对应的数据行。书签可以有两种形式。如果表上有聚集索引,则书签是相应数据行的聚集索引键。如果表是一个堆结构,那么书签就是一个行标识符(RID),它以“文件号:页码:槽号”的格式定位实际的行。
主键(PRIMARY KEY)与聚集索引(CLUSTER INDEX)
严格来说,主键与聚集索引无关。如果有,这意味着当表中没有聚集索引时,默认情况下创建的主键是聚集索引(除非它被特别设置为无聚集)。在处理主键和聚集索引时,要注意以下事项:1。主键没有与聚集索引2分开。聚集索引键列应尽量避免使用int 3以外的数据类型。尽量避免使用复合主键。
创建索引时的注意事项
1、始终包含聚集索引
当表中不包含聚集索引时,表中的数据会出现混乱,这将降低数据检索的效率。即使通过索引来缩小数据检索的范围,由于数据本身是无序的,从表中提取实际数据时也会出现频繁的定位问题,这也使得SQL Server基本不使用非聚集索引表中的索引来检索数据。
2、保证聚集索引唯一
因为聚集索引是非聚集索引的行定位符,如果不是唯一的,就会在行定位符中包含辅助数据,同时从表中提取数据时,需要通过行定位符中的辅助数据来定位,这样会降低处理效率。
3、保证聚集索引最小
每个聚集键值都是所有非聚集索引的叶节点记录。越小,每个非聚集索引叶包含的有效数据越多,这对于提高索引效率非常有利。
4、覆盖索引
覆盖索引意味着索引中的列包含数据处理中涉及的所有列。覆盖索引是原始表的子集。因为这个子集包含数据处理涉及的所有列,操作这个子集可以满足数据处理的需要。一般来说,如果大部分处理只涉及大型表的某些列,可以考虑为这些列构建一个覆盖索引。建立覆盖索引的方法是使用要包含的列的键列作为索引键列,其他列作为索引的包含列(在索引创建语句中使用include子句)。
5、适量的索引
当数据发生变化时,SQL Server会同步维护相关索引中的数据,索引过多会影响数据变化的处理效率。因此,索引应该只建立在经常使用的列上。适当的索引也体现在对索引列组合的控制上。例如,如果有两列col1和co
l2,这两个列的组合会产生三种使用情况:单独使用col1、单独使用col2及同时使用col1和col2。如果有为每种情况都建立索引,则需要建立三个索引。但也可以只建立一个复合索引(col1, col2),这样能够依次满足col1+col2、col1、col2这三种方式的查询,其中,col2利用这个查询会比较勉强(还要配合单独的统计),可以视实际情况确定是否需要为col2建立单独的索引。特别注意:不要建立重复索引,目前最常见的重复索引是单独为某个列建立主键和聚集索引与直接从表中提取数据相比,根据索引检索数据,多了一个索引检索的过程,这个过程要求能够尽量缩小数据检索范围,并且使用最少的时间,这样才能真正保证能够通过索引提高数据检索效率。实现上述目的,对于索引键列的选择,应该遵循如下原则:
选择性原则
选择性是满足条件的记录占总记录数的百分比,这个比率应该尽可能低,这样才能保证通过索引扫描后,只需要从基础表提取很少的数据。如果这个比率偏高,则不应该考虑在此列上建立索引。
数据密度原则
数据密度是指列值唯一的记录占总记录数的百分比,这个比率越高,则说明此列越适合建立索引。在考虑数据密度的时候,还要注意数据分布的问题,只有经常检索的密度高时,才适合建立索引。例如,如果一张表有10万记录,虽然某个列不重复的记录有9万条,但如果经常检索的2万条记录,其不重复的列值才几十条的话,这个列是不太适合建立索引的。另一种情况是,整体数据密度不大,但经常检索的数据的密度大,例如订单的状态,一般来说,订单的状态就几种,但已经Close的订单往往占整个数据的绝大部分,但数据处理的时候,基本上都是检索未Close的订单,这种情况下,为订单的状态列建立索引还是比较有效的(SQL Server 2008中,可以为这种列建立具有更佳效果的筛选索引)。
6、索引键列大小
一般不宜为超过100Byte的列建立索引。
7、复合索引键列顺序
在索引中,索引的顺序主要由索引中的每一个键列确定,因此,对于复合索引,索引中的列顺序是很重要的,应该优先把数据密度大,选择性列,存储空间小的列放在索引键列的前面。
上述内容就是sqlserver索引的原理及索引建立的注意事项有哪些,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/128950.html