1、为何要建立索引呢(优势)?
这是由于,建立索引能够大大提升系统的性能。
第一, 经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性。
第二, 能够大大加快数据的检索速度,这也是建立索引的最主要的缘由。
第三, 能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义。
第四, 在使用分组和排序子句进行数据检索时,一样能够显著减小查询中分组和排序的时间。
第五, 经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。
2、创建方向索引的不利因素(缺点)
也许会有人要问:增长索引有如此多的优势,为何不对表中的每个列建立一个索引呢?这种想法当然有其合理性,然而也有其片面性。虽然,索引有许多优势,可是,为表中的每个列都增长索引,是很是不明智的。这是由于,增长索引也有许多不利的一个方面。
第一, 建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。
第二, 索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大。
第三, 当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。
3、建立方向索引的准则
索引是创建在数据库表中的某些列的上面。所以,在建立索引的时候,应该仔细考虑在哪些列上能够建立索引,在哪些列上不能建立索引。
通常来讲,应该在这些列上建立索引。
第一, 在常常须要搜索的列上,能够加快搜索的速度;
第二, 在做为主键的列上,强制该列的惟一性和组织表中数据的排列结构;
第三, 在常常用在链接的列上,这些列主要是一些外键,能够加快链接的速度;
第四, 在常常须要根据范围进行搜索的列上建立索引,由于索引已经排序,其指定的范围是连续的;
第五, 在常常须要排序的列上建立索引,由于索引已经排序,这样查询能够利用索引的排序,加快排序查询时间;
第六, 在常用在WHERE子句中的列上面建立索引,加快条件的判断速度。
一样,对于有些列不该该建立索引。通常来讲,不该该建立索引的的这些列具备下列特色:
第一, 对于那些在查询中不多使用或者参考的列不该该建立索引。这是由于,既然这些列不多使用到,所以有索引或者无索引,并不能提升查询速度。相反,因为增长了索引,反而下降了系统的维护速度和增大了空间需求。
第二, 对于那些只有不多数据值的列也不该该增长索引。这是由于,因为这些列的取值不多,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即须要在表中搜索的数据行的比例很大。增长索引,并不能明显加快检索速度。
第三, 对于那些定义为text, image和bit数据类型的列不该该增长索引。这是由于,这些列的数据量要么至关大,要么取值不多。
第四, 当修改性能远远大于检索性能时,不该该建立索引。这是由于,修改性能和检索性能是互相矛盾的。当增长索引时,会提升检索性能,可是会下降修改性能。当减小索引时,会提升修改性能,下降检索性能。所以,当修改性能远远大于检索性能时,不该该建立索引。
4、建立索引的方法
建立索引有多种方法,这些方法包括直接建立索引的方法和间接建立索引的方法。
第一, 直接建立索引,例如使用CREATE INDEX语句或者使用建立索引向导。
第二, 间接建立索引,例如在表中定义主键约束或者惟一性键约束时,同时也建立了索引。
虽然,这两种方法均可以建立索引,可是,它们建立索引的具体内容是有区别的。
使用CREATE INDEX语句或者使用建立索引向导来建立索引,这是最基本的索引建立方式,而且这种方法最具备柔性,能够定制建立出符合本身须要的索引。在使用这种方式建立索引时,可使用许多选项,例如指定数据页的充满度、进行排序、整理统计信息等,这样能够优化索引。使用这种方法,能够指定索引的类型、惟一性和复合性,也就是说,既能够建立聚簇索引,也能够建立非聚簇索引,既能够在一个列上建立索引,也能够在两个或者两个以上的列上建立索引。
经过定义主键约束或者惟一性键约束,也能够间接建立索引。主键约束是一种保持数据完整性的逻辑,它限制表中的记录有相同的主键记录。在建立主键约束时,系统自动建立了一个惟一性的聚簇索引。虽然,在逻辑上,主键约束是一种重要的结构,可是,在物理结构上,与主键约束相对应的结构是惟一性的聚簇索引。换句话说,在物理实现上,不存在主键约束,而只存在惟一性的聚簇索引。一样,在建立惟一性键约束时,也同时建立了索引,这种索引则是惟一性的非聚簇索引。所以,当使用约束建立索引时,索引的类型和特征基本上都已经肯定了,由用户定制的余地比较小。
当在表上定义主键或者惟一性键约束时,若是表中已经有了使用CREATE INDEX语句建立的标准索引时,那么主键约束或者惟一性键约束建立的索引覆盖之前建立的标准索引。也就是说,主键约束或者惟一性键约束建立的索引的优先级高于使用CREATE INDEX语句建立的索引。
5、索引的特征
索引有两个特征,即惟一性索引和复合索引。
惟一性索引保证在索引列中的所有数据是惟一的,不会包含冗余数据。若是表中已经有一个主键约束或者惟一性键约束,那么当建立表或者修改表时,SQL Server自动建立一个惟一性索引。然而,若是必须保证惟一性,那么应该建立主键约束或者惟一性键约束,而不是建立一个惟一性索引。当建立惟一性索引时,应该认真考虑这些规则:当在表中建立主键约束或者惟一性键约束时,SQL Server自动建立一个惟一性索引;若是表中已经包含有数据,那么当建立索引时,SQL Server检查表中已有数据的冗余性;每当使用插入语句插入数据或者使用修改语句修改数据时,SQL Server检查数据的冗余性:若是有冗余值,那么SQL Server取消该语句的执行,而且返回一个错误消息;确保表中的每一行数据都有一个惟一值,这样能够确保每个实体均可以惟一确认;只能在能够保证明体完整性的列上建立惟一性索引,例如,不能在人事表中的姓名列上建立惟一性索引,由于人们能够有相同的姓名。
复合索引就是一个索引建立在两个列或者多个列上。在搜索时,当两个或者多个列做为一个关键值时,最好在这些列上建立复合索引。当建立复合索引时,应该考虑这些规则:最多能够把16个列合并成一个单独的复合索引,构成复合索引的列的总长度不能超过900字节,也就是说复合列的长度不能太长;在复合索引中,全部的列必须来自同一个表中,不能跨表创建复合列;在复合索引中,列的排列顺序是很是重要的,所以要认真排列列的顺序,原则上,应该首先定义最惟一的列,例如在(COL1,COL2)上的索引与在(COL2,COL1)上的索引是不相同的,由于两个索引的列的顺序不一样;为了使查询优化器使用复合索引,查询语句中的WHERE子句必须参考复合索引中第一个列;当表中有多个关键列时,复合索引是很是有用的;使用复合索引能够提升查询性能,减小在一个表中所建立的索引数量。
6、索引的类型
根据索引的顺序与数据表的物理顺序是否相同,能够把索引分红两种类型。一种是数据表的物理顺序与索引顺序相同的聚簇索引,另外一种是数据表的物理顺序与索引顺序不相同的非聚簇索引。
7、聚簇索引的体系结构
索引的结构相似于树状结构,树的顶部称为叶级,树的其它部分称为非叶级,树的根部在非叶级中。一样,在聚簇索引中,聚簇索引的叶级和非叶级构成了一个树状结构,索引的最低级是叶级。在聚簇索引中,表中的数据所在的数据页是叶级,在叶级之上的索引页是非叶级,索引数据所在的索引页是非叶级。在聚簇索引中,数据值的顺序老是按照升序排列。
应该在表中常常搜索的列或者按照顺序访问的列上建立聚簇索引。当建立聚簇索引时,应该考虑这些因素:每个表只能有一个聚簇索引,由于表中数据的物理顺序只能有一个;表中行的物理顺序和索引中行的物理顺序是相同的,在建立任何非聚簇索引以前建立聚簇索引,这是由于聚簇索引改变了表中行的物理顺序,数据行按照必定的顺序排列,而且自动维护这个顺序;关键值的惟一性要么使用UNIQUE关键字明确维护,要么由一个内部的惟一标识符明确维护,这些惟一性标识符是系统本身使用的,用户不能访问;聚簇索引的平均大小大约是数据表的百分之五,可是,实际的聚簇索引的大小经常根据索引列的大小变化而变化;在索引的建立过程当中,SQL Server临时使用当前数据库的磁盘空间,当建立聚簇索引时,须要1.2倍的表空间的大小,所以,必定要保证有足够的空间来建立聚簇索引。
当系统访问表中的数据时,首先肯定在相应的列上是否存在有索引和该索引是否对要检索的数据有意义。若是索引存在而且该索引很是有意义,那么系统使用该索引访问表中的记录。系统从索引开始浏览到数据,索引浏览则从树状索引的根部开始。从根部开始,搜索值与每个关键值相比较,肯定搜索值是否大于或者等于关键值。这一步重复进行,直到碰上一个比搜索值大的关键值,或者该搜索值大于或者等于索引页上全部的关键值为止。
8、非聚簇索引的体系结构
非聚簇索引的结构也是树状结构,与聚簇索引的结构很是相似,可是也有明显的不一样。
在非聚簇索引中,叶级仅包含关键值,而没有包含数据行。非聚簇索引表示行的逻辑顺序。 非聚簇索引有两种体系结构:一种体系结构是在没有聚簇索引的表上建立非聚簇索引,另外一种体系结构是在有聚簇索引的表上建立非聚簇索引。
若是一个数据表中没有聚簇索引,那么这个数据表也称为数据堆。当非聚簇索引在数据堆的顶部建立时,系统使用索引页中的行标识符指向数据页中的记录。行标识符存储了数据所在位置的信息。数据堆是经过使用索引分配图(IAM)页来维护的。IAM页包含了数据堆所在簇的存储信息。在系统表sysindexes中,有一个指针指向了与数据堆相关的第一个IAM页。系统使用IAM页在数据堆中浏览和寻找能够插入新的记录行的空间。这些数据页和在这些数据页中的记录没有任何的顺序而且也没有连接在一块儿。在这些数据页之间的惟一的链接是IAM中记录的顺序。当在数据堆上建立了非聚簇索引时,叶级中包含了指向数据页的行标识符。行标识符指定记录行的逻辑顺序,由文件ID、页号和行ID组成。这些行的标识符维持惟一性。非聚簇索引的叶级页的顺序不一样于表中数据的物理顺序。这些关键值在叶级中以升序维持。
当非聚簇索引建立在有聚簇索引的表上的时候,系统使用索引页中的指向聚簇索引的聚簇键。聚簇键存储了数据的位置信息。若是某一个表有聚簇索引,那么非聚簇索引的叶级包含了映射到聚簇键的聚簇键值,而不是映射到物理的行标识符。当系统访问有非聚簇索引的表中数据时,而且这种非聚簇索引建立在聚簇索引上,那么它首先从非聚簇索引来找到指向聚簇索引的指针,而后经过使用聚簇索引来找到数据。
当须要以多种方式检索数据时,非聚簇索引是很是有用的。当建立非聚簇索引时,要考虑这些状况:在缺省状况下,所建立的索引是非聚簇索引;在每个表上面,能够建立很少于249个非聚簇索引,而聚簇索引最多只能有一个。
系统如何访问表中的数据
通常地,系统访问数据库中的数据,可使用两种方法:表扫描和索引查找。第一种方法是表扫描,就是指系统将指针放置在该表的表头数据所在的数据页上,而后按照数据页的排列顺序,一页一页地从前向后扫描该表数据所占有的所有数据页,直至扫描完表中的所有记录。在扫描时,若是找到符合查询条件的记录,那么就将这条记录挑选出来。最后,将所有挑选出来符合查询语句条件的记录显示出来。第二种方法是使用索引查找。索引是一种树状结构,其中存储了关键字和指向包含关键字所在记录的数据页的指针。当使用索引查找时,系统沿着索引的树状结构,根据索引中关键字和指针,找到符合查询条件的的记录。最后,将所有查找到的符合查询语句条件的记录显示出来。
在SQL Server中,当访问数据库中的数据时,由SQL Server肯定该表中是否有索引存在。若是没有索引,那么SQL Server使用表扫描的方法访问数据库中的数据。查询处理器根据分布的统计信息生成该查询语句的优化执行规划,以提升访问数据的效率为目标,肯定是使用表扫描仍是使用索引。
9、索引的选项
在建立索引时,能够指定一些选项,经过使用这些选项,能够优化索引的性能。这些选项包括FILLFACTOR选项、PAD_INDEX选项和SORTED_DATA_REORG选项。
使用FILLFACTOR选项,能够优化插入语句和修改语句的性能。当某个索引页变满时,SQL Server必须花费时间分解该页,以便为新的记录行腾出空间。使用FILLFACTOR选项,就是在叶级索引页上分配必定百分比的自由空间,以便减小页的分解时间。当在有数据的表中建立索引时,可使用FILLFACTOR选项指定每个叶级索引节点的填充的百分比。缺省值是0,该数值等价于100。在建立索引的时候,内部索引节点老是留有了必定的空间,这个空间足够容纳一个或者两个表中的记录。在没有数据的表中,当建立索引的时候,不要使用该选项,由于这时该选项是没有实际意义的。另外,该选项的数值在建立时指定之后,不能动态地获得维护,所以,只应该在有数据的表中建立索引时才使用。
PAD_INDEX选项将FILLFACTOR选项的数值一样也用于内部的索引节点,使内部的索引节点的填充度与叶级索引的节点中的填充度相同。若是没有指定FILLFACTOR选项,那么单独指定PAD_INDEX选项是没有实际意义的,这是由于PAD_INDEX选项的取值是由FILLFACTOR选项的取值肯定的。
当建立聚簇索引时,SORTED_DATA_REORG选项清除排序,所以能够减小创建聚簇索引所须要的时间。当在一个已经变成碎块的表上建立或者重建聚簇索引时,使用SORTED_DATA_REORG选项能够压缩数据页。当从新须要在索引上应用填充度时,也使用该选项。当使用SORTED_DATA_REORG选项时,应该考虑这些因素:SQL Server确认每个关键值是否比前一个关键值高,若是都不高,那么不能建立索引;SQL Server要求1.2倍的表空间来物理地从新组织数据;使用SORTED_DATA_REORG选项,经过清除排序进程而加快索引建立进程;从表中物理地拷贝数据;当某一个行被删除时,其所占的空间能够从新利用;建立所有非聚簇索引;若是但愿把叶级页填充到必定的百分比,能够同时使用FILLFACTOR选项和SORTED_DATA_REORG选项。
10、索引的维护
为了维护系统性能,索引在建立以后,因为频繁地对数据进行增长、删除、修改等操做使得索引页发生碎块,所以,必须对索引进行维护。
使用DBCC SHOWCONTIG语句,能够显示表的数据和索引的碎块信息。当执行DBCC SHOWCONTIG语句时,SQL Server浏览叶级上的整个索引页,来肯定表或者指定的索引是否严重碎块。DBCC SHOWCONTIG语句还能肯定数据页和索引页是否已经满了。当对表进行大量的修改或者增长大量的数据以后,或者表的查询很是慢时,应该在这些表上执行DBCC SHOWCONTIG语句。当执行DBCC SHOWCONTIG语句时,应该考虑这些因素:当执行DBCC SHOWCONTIG语句时,SQL Server要求指定表的ID号或者索引的ID号,表的ID号或者索引的ID号能够从系统表sysindexes中获得;应该肯定多长时间使用一次DBCC SHOWCONTIG语句,这个时间长度要根据表的活动状况来定,天天、每周或者每个月均可以。
使用DBCC DBREINDEX语句重建表的一个或者多个索引。当但愿重建索引和当表上有主键约束或者惟一性键约束时,执行DBCC DBREINDEX语句。除此以外,执行DBCC DBREINDEX语句还能够从新组织叶级索引页的存储空间、删除碎块和从新计算索引统计。当使用执行DBCC DBREINDEX语句时,应该考虑这些因素:根据指定的填充度,系统从新填充每个叶级页;使用DBCC DBREINDEX语句重建主键约束或者惟一性键约束的索引;使用SORTED_DATA_REORG选项能够更快地建立聚簇索引,若是没有排列关键值,那么不能使用DBCC DBREINDEX语句;DBCC DBREINDEX语句不支持系统表。另外,还可使用数据库维护规划向导自动地进行重建索引的进程。
统计信息是存储在SQL Server中的列数据的样本。这些数据通常地用于索引列,可是还能够为非索引列建立统计。SQL Server维护某一个索引关键值的分布统计信息,而且使用这些统计信息来肯定在查询进程中哪个索引是有用的。查询的优化依赖于这些统计信息的分布准确度。查询优化器使用这些数据样原本决定是使用表扫描仍是使用索引。当表中数据发生变化时,SQL Server周期性地自动修改统计信息。索引统计被自动地修改,索引中的关键值显著变化。统计信息修改的频率由索引中的数据量和数据改变量肯定。例如,若是表中有10000行数据,1000行数据修改了,那么统计信息可能须要修改。然而,若是只有50行记录修改了,那么仍然保持当前的统计信息。除了系统自动修改以外,用户还能够经过执行UPDATE STATISTICS语句或者sp_updatestats系统存储过程来手工修改统计信息。使用UPDATE STATISTICS语句既能够修改表中的所有索引,也能够修改指定的索引。
使用SHOWPLAN和STATISTICS IO语句能够分析索引和查询性能。使用这些语句能够更好地调整查询和索引。SHOWPLAN语句显示在链接表中使用的查询优化器的每一步以及代表使用哪个索引访问数据。使用SHOWPLAN语句能够查看指定查询的查询规划。当使用SHOWPLAN语句时,应该考虑这些因素。SET SHOWPLAN_ALL语句返回的输出结果比SET SHOWPLAN_TEXT语句返回的输出结果详细。然而,应用程序必须可以处理SET SHOWPLAN_ALL语句返回的输出结果。SHOWPLAN语句生成的信息只能针对一个会话。若是从新链接SQL Server,那么必须从新执行SHOWPLAN语句。STATISTICS IO语句代表输入输出的数量,这些输入输出用来返回结果集和显示指定查询的逻辑的和物理的I/O的信息。可使用这些信息来肯定是否应该重写查询语句或者从新设计索引。使用STATISTICS IO语句能够查看用来处理指定查询的I/O信息。
就象SHOWPLAN语句同样,优化器隐藏也用来调整查询性能。优化器隐藏能够对查询性能提供较小的改进,而且若是索引策略发生了改变,那么这种优化器隐藏就毫无用处了。所以,限制使用优化器隐藏,这是由于优化器隐藏更有效率和更有柔性。当使用优化器隐藏时,考虑这些规则:指定索引名称、当index_id为0时为使用表扫描、当index_id为1时为使用聚簇索引;优化器隐藏覆盖查询优化器,若是数据或者环境发生了变化,那么必须修改优化器隐藏。
11、索引调整向导
索引调整向导是一种工具,能够分析一系列数据库的查询语句,提供使用一系列数据库索引的建议,优化整个查询语句的性能。对于查询语句,须要指定下列内容:
查询语句,这是将要优化的工做量
包含了这些表的数据库,在这些表中,能够建立索引,提升查询性能。
在分析中使用的表
在分析中,考虑的约束条件,例如索引可使用的最大磁盘空间
这里指的工做量,能够来自两个方面:使用SQL Server捕捉的轨迹和包含了SQL语句的文件。索引调整向导老是基于一个已经定义好的工做量。若是一个工做量不能反映正常的操做,那么它建议使用的索引不是实际的工做量上性能最好的索引。索引调整向导调用查询分析器,使用全部可能的组合评定在这个工做量中每个查询语句的性能。而后,建议在整个工做量上能够提升整个查询语句的性能的索引。若是没有供索引调整向导来分析的工做量,那么可使用图解器当即建立它。一旦决定跟踪一条正常数据库活动的描述样本,向导可以分析这种工做量和推荐可以提升数据库工做性能的索引配置。
索引调整向导对工做量进行分析以后,能够查看到一系列的报告,还可使该向导当即建立所建议的最佳索引,或者使这项工做成为一种能够调度的做业,或者生成一个包含建立这些索引的SQL语句的文件。
索引调整向导容许为SQL Server数据库选择和建立一种理想的索引组合和统计,而不要求对数据库结构、工做量或者SQL Server阅读 java