数码资讯
通过SQLServer数据库对其索引进行索引的一种小技术
一、指数是多少 减少磁盘I/O和逻辑读的数量的最好方法之一是使用{ } 索引允许SQLServer在表中查找数据而无需扫描整个表。 1.1。索引的好处: 当表不聚集时,它将变成堆或堆表。 { }是一堆堆未处理的数据,以线为一个指向存储的位置标识符。表中的数据是不妥当的,也可以被搜索到,除非它走过的路
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
一、指数是多少
减少磁盘I/O和逻辑读的数量的最好方法之一是使用{ }
索引允许SQLServer在表中查找数据而无需扫描整个表。
1.1。索引的好处:
当表不聚集时,它将变成堆或堆表。
{ }是一堆堆未处理的数据,以线为一个指向存储的位置标识符。表中的数据是不妥当的,也可以被搜索到,除非它走过的路线。这个过程称为扫描。当一个聚集索引,对非指针聚集索引是由聚集索引中定义的值,所以它是收集的指标非常重要。
Because the size of the page is fixed, the less the column, the more rows you can store.Because the non - aggregated index usually does not contain all the columns, a general page bread contains more non - aggregated indexes.So SQLServer can read more values from a non - aggregated index page than the table that contains the column.
非聚集索引的另一个优点是:独立于表的结构可以放在不同的文件组中,并使用不同的I/O。
索引使用B树作为存储结构,因此查询特定行所需的操作被最小化。
1.2。索引的开销:
太多的索引会导致(插入/更新/删除/ CRUD反刍部分)花更长的时间。
在设计索引时,应该从两个角度进行:
对于现有的生产系统,需要对索引的总体影响进行度量,并确保性能的好处超过处理资源的额外成本。
当焦点和指数是眼前的利益,你可以使用DMV查看:
sys.dm_db_index_operational_stats或sys.dm_db_index_usage_stats
sys.dm_db_index_operational_stats:显示低水平的活动,是用一个指标,如我/ O和锁。
sys.dm_db_index_usage_stats:随时索引中的各种业务数据随时发生。
对于DML,维护索引的开销增加。然而,SQLServer必须首先更新或删除前找到一行,所以指数可以帮助更新和删除语句,使用复杂的where子句。
二、指标设计建议
索引设计建议如下:
l检查WHERE子句和连接条件列。
l使用窄索引;
l检查列的唯一性;
l检查列的数据类型;
l考虑列顺序;
l考虑索引类型(聚合索引和非聚集索引)
2.1,检查WHERE子句和连接条件列:
当一个查询提交给SQLServer,优化器做以下步骤:
1)优化器识别连接条件中包含的WHERE子句和列。
2)然后优化器检查这些列上的索引。
3)优化器通过从索引(即返回多少行)确定子句的选择性来评估每个索引的有效性。
4)最后,优化器根据前面步骤中的收集信息估计读取最低行开销的方法。
当没有合适的位置和连接列时,优化器将执行全表扫描。
建议:指标,经常用于WHERE子句或连接条件避免表扫描的列。当表中的数据量很小,可以放在单页(8KB),表扫描可能比索引查找工作。
2.2。使用窄索引:
为了获得最佳性能,尽量在索引中使用较少的列。还应避免一列宽数据类型。
狭义的指数可以容纳更多的行对8KB索引页面比宽指数,并可以达到以下效果。
l减少了我/ O(读不8kb页)
我是更有效的利用数据库缓存,因为SQLServer可以无缓存的索引页和减少内存索引页面所需的逻辑读取操作。
l减少数据库存储空间。
2.3。检查列的唯一性:
它不是表现在一个很小的范围内的电位值创建一个索引,如性别,因为优化器不能使用索引有效降低回归线。因为一个小范围的值可能会导致{ }或{全表扫描聚集索引扫描}。在WHERE子句中使列有大量独特的行(或高选择性)来限制访问的行数总是优先选择指数,应该在这些列创建一个小的结果集来访问。
此外,该顺序与多个列上的索引的创建有关。在某些情况下,使用最有选择性的列将更有效率。
2.4。检查列数据类型:
数值模型的索引是快速的,因为它的大小很小,算法操作容易,但是字符的大小很大,需要字符串匹配操作,通常开销较大。
2.5。考虑列的顺序:
在复合索引中,列的顺序是索引效率的一个重要因素。
L列唯一性;
L列宽度;
L列数据类型;
查询使用索引的边界执行查找操作来检索数据。将最有效的索引放在前面,并尽快筛选数据。减少数据量。
2.6。考虑索引的类型:
聚合索引和非聚集索引都存储在B -树中。
三。聚集索引(聚集索引)
聚集索引的叶页与表的数据页相同。表行按物理群集索引列排序,因为从中只能有一个物理顺序,所以只有一个聚集索引。
3.1。堆表:
没有集群索引的表称为堆表。数据列中没有连接到表相邻页的序列。与访问非堆表相比,无组织结构增加了访问的开销。
3.2。与非聚集指数的关系:
索引列的非聚集索引包含一个指针指向对应的数据线,指向一个表,该指针称为行定位器。它的价值取决于数据页存储在堆或聚集。非聚类指标,行定位器指向指针的数据线摆脱在堆。群集索引,行定位器是一个聚簇索引的索引键的值。当新数据行进入,这可能导致非聚簇索引定位,分页等,影响性能。
3.3。聚类索引建议:
1)首先创建集群索引:
因为所有非集群索引都在其索引行中保存集群索引键,所以创建顺序非常重要。
2)保持一个狭窄的索引:
对聚簇索引的总长度应尽可能地小。由于聚簇索引的长度太大,非聚簇索引也会增加。因此,大聚集索引键值不仅影响本身的宽度,也拓展了所有的非聚集索引的表增加索引页的数量,增加逻辑读磁盘I / O。
3)簇指数的一步重建:
由于聚簇索引和非聚簇索引,因此索引的使用和创建索引会导致非聚集索引设置两次,然后你可以使用创建drop_existing条款在聚集索引重建的单原子台阶指数的说法,类似于非聚集索引的使用。
4)何时使用群集索引:
(a)检索一定范围的数据:
由于聚类指数是按物理顺序建立的,合理利用索引可以减少磁头的运动,减少物理I/O。
(b)读取预先排序的数据:
聚类索引对于需要排序的数据是非常有效的,它可以减少数据读取后的排序开销。
对于读取大范围行和或排序输出的查询,集群索引通常比非集群索引更有效。
5)在不使用集群索引的情况下:
在某些情况下,最好不要使用集群索引:
a)经常更新的列:
如果列更新频繁,则非集群索引将重新定位,并且相关操作查询的开销将增加,它也将使用同一部分和其他未聚集索引的查询来阻塞此段时间,从而影响数据并行性。
(b)宽关键字:前面的原因已经解释过了。
c)并行顺序插入太多:
如果您想并行插入一个新行,那么它们将更好地分布在聚集索引的多个页面上,所有的插入都在最后一页上,通过创建另一个列索引形成一个巨大的焦点(索引将不按照新的顺序)。插入是随机分布在整个表中的,这个问题只有在大量同时插入时才会出现,如果磁盘热点成为性能瓶颈,您可以通过减少表的填充因子来保持中间页。
四。非聚簇索引
非聚集索引不影响表页中数据的顺序,对于堆表,行定位器指向指向数据行的指针,对于非堆表,指向集群索引的索引键。
4.1。非聚类索引维护:
优化维护成本,SQLServer旧数据页添加一个指针指向新的数据页在页分割,而不是更新所有相关的非聚集索引的行定位器。聚类索引行定位器减少与非聚集索引的开销。
4.2。定义书签查找:
当查询请求不是优化器选择的非聚集索引的一部分时,需要查找,这是对聚集索引的关键字查找和对堆表的清除查找。
此查找根据索引行的行定位器值从表中读取相应的数据行。除了索引页上的逻辑读取操作外,它还需要对数据页进行逻辑读取,但如果查询需要列中的索引,则不需要访问数据页。这称为覆盖指数。这些书签查找是大结果集最好使用集群索引的原因。
4.3。非聚集索引建议:
1。当使用非聚集索引时:
从大表读取少量行是最有效的。随着行数的增加,书签查找的开销成比例增加。索引列应该具有高选择性。
有一些索引要求不适合集群索引:
l经常更新的列
l广泛的关键
2。不使用非聚集索引时:
非聚集索引不适合检索大量行。最好是在这个时候使用聚簇索引,因为不需要一个单独的书签查找来检索数据行。如果你需要阅读大量的结果集的表,然后在过滤和非聚集索引连接条件不利于除非非聚集索引是用来覆盖指数。
五,聚类指数与非聚类指数
选择聚类指数或非聚类指数是考虑的主要因素:
由L检索的行数;
数据分类要求;
索引键宽度;
l列更新频率;
书签开销;
l任何磁盘热点;
5.1。相对于非聚集索引而言,聚类索引的好处:
在选择没有索引的表上的索引类型时,通常是首选索引。
尝试使用高选择性的小列在这个列上创建小聚集索引是一个很好的启示,但是在约定的列上的聚集索引可能同样有利甚至更好。
注意:尽管在许多数据检索中,许多聚集索引优于非聚集索引,但是表中只有一个聚集索引。因此,聚类索引应该保持在最强大的情况下。
5.2。非聚类索引相对聚类索引的优势:
在下列情况下,非聚集索引前面是集群索引:
l索引键大小大。
为了避免聚类索引的重建,L需要重建所有非聚集索引的相关开销。
L是一个在非聚集索引页上工作的数据库读取器,而编写程序修改数据页中的其他列(不包括非聚集索引)以避免阻塞。
l在查询所有引用列(从表中)时,可以安全地容纳非集群索引。
非集群索引的性能应该和集群索引一样好(甚至更好),而不需要跳转到数据行。
六。先进的索引技术
L覆盖指数:
l索引交叉:使用多个非集群索引来满足查询的所有列需求(从表中)
l索引连接:使用索引交叉和覆盖索引技术避免接触基表。
l过滤索引:为了索引字段或具有分散数据的稀疏列,过滤器可以应用于索引,因此它只对一些数据进行索引。
我的观点:物化视图索引在磁盘上
6.1。覆盖索引:
非聚类指标都是建立在满足SQL查询不需要达到下表中的所有列。如果查询满足指标,不需要参考完全底层的数据表,那么指数可以认为是一种覆盖指标。使用包括运营商覆盖索引程序,浙江存储数据和索引的索引结构本身不修改。
索引本身的覆盖面是减少逻辑阅读的一种游泳技巧:
l不想增加索引键的大小,但仍然希望有一个覆盖索引。
你打算指标数据类型不能被索引(除了文本、ntext和图像);
l超出索引的键列的最大数量(但最好避免这个问题)。
1、伪簇索引(pseudoclustered指数):
覆盖索引以在物理顺序组织所有索引列。从我的观点/ O,聚集索引不是用来计划覆盖指数包含列所有查询,充分满足索引中的列。如果查询结果集需要整理的覆盖指标可用于身体保持的结果要求的顺序列数据集。
2。建议:
使用覆盖索引,你应该注意的列的列表中的SELECT语句。少列应尽可能保持小覆盖索引键大小。如果在一个索引的所有列的字节数是小于一个单排一个表,并确定使用覆盖索引经常执行查询,然后覆盖指数是有效的。
在建立覆盖的许多指标,考虑SQLServer可以有效地自动使用索引交叉创建查询的覆盖指数。
6.2。指标的交叉:
如果一个表有很多指标,则SQLServer可以使用多个指标,执行一个查询,选择基于各指标数据的小的子集,然后执行两亚群的交叉口(即只有满足所有条件的行)
但在现实世界中,在修改现有索引时,应考虑以下问题:
l由于各种原因,不允许修改现有索引;
L中现有的非集群索引键可能相当宽;
l使用现有索引的查询开销将受此修改的影响。
为了提高查询性能,SQL Server可以使用多个索引的表,所以考虑创建多个窄的索引而不是广泛的索引键。
有时,可能需要创建一个单独的非集群索引,原因如下:
不允许在现有索引中对列进行L重排;
L覆盖索引所要求的一些列不能包含在现有的非聚集索引中;
l两个现有的非集群索引中的列总数可能是覆盖索引所需列数的冗余。
在这种情况下,可以在剩余的列上创建非集群索引。
6.3。索引连接:
指数指标交叉连接的一个变种,它适用于覆盖指数技术指标交叉。如果没有索引一个覆盖查询、多指标可以重写query.sqlserver可以使用索引连接不到基表完全满足查询。
6.4。滤波器的指标:
它是一个非聚集索引,它使用一个过滤器,基本上是WHERE子句。在一个或多个列上创建一个高度选择性的关键字组,这可能不是很有选择性。它适用于大量的空值。
筛选器索引以多种方式返回:
l减小索引大小以提高查询效率。
l构建较小的索引以减少存储开销。
l减少了索引维护的成本,因为减小了尺寸。
筛选器索引需要在访问或创建时设置一组特殊的ANSI设置:
在ansi_nulls,ansi_padding,ansi_warnings,ARITHABORT,concat_null_yields_null,quoted_identifier
关:numeric_roundabort
6.5。索引视图:
SQLServer可以创建一个独特的集群的集群的观点引导磁盘被物化,成为一个索引视图或索引实体观。非聚簇索引后可以创造创造。
1、福利:
l聚集可以预先计算并存储在索引视图来减少查询执行过程中昂贵的计算。
l表可以提前连接,结果集可以实现。
可以实现L连接或聚合的组成。
2。开销:
L基表中的任何修改都必须反映在SELECT语句中,该语句必须执行事务;
l可以修改索引视图定义的基本表中的任何索引,如果更新了集群键,也将更新集群索引。
l索引视图增加了数据库的维护开销。
在L数据库中需要更多的存储空间;
创建索引视图包含以下限制:
l视图的第一个索引必须是唯一的集群索引。
L索引视图中的非聚集索引只能在创建唯一的集群索引之后创建。
l视图定义必须是确定性的,也就是说,它只能返回一个可能的结果到给定的查询;
l索引视图必须只引用同一数据库中的基本表,而不是另一个视图;
l索引视图可以包含一个浮点列,但是这样的列不能包含在集群索引键中。
l索引视图必须是一个与引用表相关联的体系结构,以避免对表结构进行修改;
对L视图定义的语法有很多限制。
必须确定的set选项列表:
在concat_null_yields_null ARITHABORT,,ansi_nulls,ansi_padding和ansi_warning
关:numeric_roundabort
三.环境的使用:
OLTP是更难从索引视图的OLAP的利益。
6.6。索引压缩:
它是从2008引入的,压缩索引可以显著提高性能,但也会导致CPU和内存开销,这是一个不适合所有索引的方案。
默认情况下,索引不会被压缩,很显然索引在创建索引时需要压缩,它分为行级和页级压缩。索引中的非页页不接受页面类型下的压缩。
七。特殊的指数型
7.1。全文索引:
文本类型字段索引
7.2。空间索引:
索引空间类型的数据
7.3,XML:
在XML从2005引入xml类型之后
八、附录附录的特点
8.1。不同列的序列:
索引中的不同列可以按升序排列。
8.2。计算列上的索引:
只要计算列的表达式满足一定的限制,如源表的确定,就可以在计算列上创建索引。
8.3,位数据类型列上的索引:
在位数据列上创建索引不是一个很好的优势,但在覆盖索引列时覆盖索引是有用的。
8.4,作为查询处理创建索引语句:
8.5。并行索引创建:
您可以配置在最大并行度参数来控制处理器的数量在创建索引的语句,或者你可以使用exec sp_configuremaxdegree并行。
8.6。在线索引创建:
当创建索引时,可以减少锁定的机会。
8.7。考虑数据库引擎调整顾问
九、总结
要确定一个特殊查询的索引键列,有必要对查询的WHERE子句和连接条件进行评估,如列的选择性、宽度、数据类型和序列等,因为索引主要是为了检索少量的行,因此索引的选择性必须非常高。
为了获得更好的性能,可以使用覆盖索引来完全覆盖查询。
SQL Server数据库索引技术的优化
索引的常识:影响数据库性能的最大因素是索引,因为问题的复杂性,我可以简单地谈谈这个问题。但也有一些好的书给你看。在这里,我只讨论两种SQL Server索引是聚簇索引和非聚簇索引。当看什么类型的索引建立,你应该考虑数据类型和列来保存数据,以同样的方式,你必须同时考虑查询的数据库可以使用类型和查询最频繁使用的类型。
索引类型
如果柱救了高度相关的数据,并经常顺序访问,最好使用聚簇索引,这是因为如果使用聚集索引,SQL Server将身体以升序或降序重排(默认)的数据集,使您可以快速找到数据查询。同样,在搜索控制情况在一定范围内,最好使用聚集索引的列。这是因为,由于物理数据的重排,只能有一个聚集索引在每个表。
通过以上的对比,如果数据中包含的列相关性很差,你可以用nonculstered指标。你可以使用多达249个非聚集索引的表中的-虽然我不能想象在这么多指标的实际应用。
当桌子用主关键字(主键),默认情况下,SQL Server将自动为该列创建唯一聚集索引(S)包含的关键。很明显,这些列的唯一索引的建立(S)是主要的关键性建筑外键关系时。,如果你打算频繁使用它,它是建立非聚集索引的外部关键字柱的一个好方法。如果表有一个聚集索引,它使用一个链表来维护数据页之间的关系。相反,如果表没有聚集索引,SQL Server将在堆栈保存数据页。
数据页
当指数设立时,SQLServer建立一个数据页(数据页)和数据页指针来加快搜索速度。当指数设立时,其相应的填充因子也设置。设置填充因子的目的是显示在索引中的数据页的百分比。随着时间的推移,数据库的更新会消耗现有的闲置空间,使被分割的页面。页面分裂的结果是减少索引的性能,因此使用索引的查询会导致数据存储是支离破碎的。当一个指标的设置,该指数填充因子设置的填充因子,所以不能保持动态。
为了更新数据页的填充因子,我们可以停止旧索引和重建索引,并重新填充因子(注意:这将影响到当前数据库的操作和使用,它小心翼翼地在重要场合)。DBCC INDEXDEFRAG和DBCC DBREINDEX是两个命令清除聚集和nonculstered指数fragments.indexdefrag是联机操作(即,它没有其他表操作,如查询块),并重建索引DBREINDEX身体。在大多数情况下,重建索引可以更好的消除碎片,但这种优势是通过阻断,目前对指数的表发生的其他行动来实现的。当一个较大的碎片索引时,indexdefrag会花更长的时间,因为工作命令的数量是基于事务块的。
Filling factor
当你执行这些措施,数据库引擎可以更有效地回报指数为基础的数据,填充因子的话题(填充因子)超出了本文的范围,但我还是想提醒你注意那些表,打算填补指数。
执行查询时,SQL Server动态选择使用哪个索引。为此,SQL Server确定哪些指标是基于统计分布在这个关键词在每个指标。值得注意的是,在数据库日常活动如插入、删除和更新表,这些数据由SQL Server使用可能已经过期需要更新。您可以通过执行dbcc showcontig看到统计的状态。当你认为数据已经过时,你可以执行的形式更新统计信息的命令,使SQL Server更新有关指标的信息。
建立数据库维护计划
SQL Server简化并自动维护数据库提供了一个工具,这个工具,被称为数据库维护计划向导(这个称之为),也包括对指标的优化。如果你运行此向导,您将看到在数据库索引统计,这些统计工作日志,定期更新,从而减轻手动重建索引所造成的工作量。如果你不想自动更新索引统计,你也可以选择重新组织数据和在这个称之为数据页,这将停止旧索引和重建索引根据特定的填充因子。
减少磁盘I/O和逻辑读的数量的最好方法之一是使用{ }
索引允许SQLServer在表中查找数据而无需扫描整个表。
1.1。索引的好处:
当表不聚集时,它将变成堆或堆表。
{ }是一堆堆未处理的数据,以线为一个指向存储的位置标识符。表中的数据是不妥当的,也可以被搜索到,除非它走过的路线。这个过程称为扫描。当一个聚集索引,对非指针聚集索引是由聚集索引中定义的值,所以它是收集的指标非常重要。
Because the size of the page is fixed, the less the column, the more rows you can store.Because the non - aggregated index usually does not contain all the columns, a general page bread contains more non - aggregated indexes.So SQLServer can read more values from a non - aggregated index page than the table that contains the column.
非聚集索引的另一个优点是:独立于表的结构可以放在不同的文件组中,并使用不同的I/O。
索引使用B树作为存储结构,因此查询特定行所需的操作被最小化。
1.2。索引的开销:
太多的索引会导致(插入/更新/删除/ CRUD反刍部分)花更长的时间。
在设计索引时,应该从两个角度进行:
对于现有的生产系统,需要对索引的总体影响进行度量,并确保性能的好处超过处理资源的额外成本。
当焦点和指数是眼前的利益,你可以使用DMV查看:
sys.dm_db_index_operational_stats或sys.dm_db_index_usage_stats
sys.dm_db_index_operational_stats:显示低水平的活动,是用一个指标,如我/ O和锁。
sys.dm_db_index_usage_stats:随时索引中的各种业务数据随时发生。
对于DML,维护索引的开销增加。然而,SQLServer必须首先更新或删除前找到一行,所以指数可以帮助更新和删除语句,使用复杂的where子句。
二、指标设计建议
索引设计建议如下:
l检查WHERE子句和连接条件列。
l使用窄索引;
l检查列的唯一性;
l检查列的数据类型;
l考虑列顺序;
l考虑索引类型(聚合索引和非聚集索引)
2.1,检查WHERE子句和连接条件列:
当一个查询提交给SQLServer,优化器做以下步骤:
1)优化器识别连接条件中包含的WHERE子句和列。
2)然后优化器检查这些列上的索引。
3)优化器通过从索引(即返回多少行)确定子句的选择性来评估每个索引的有效性。
4)最后,优化器根据前面步骤中的收集信息估计读取最低行开销的方法。
当没有合适的位置和连接列时,优化器将执行全表扫描。
建议:指标,经常用于WHERE子句或连接条件避免表扫描的列。当表中的数据量很小,可以放在单页(8KB),表扫描可能比索引查找工作。
2.2。使用窄索引:
为了获得最佳性能,尽量在索引中使用较少的列。还应避免一列宽数据类型。
狭义的指数可以容纳更多的行对8KB索引页面比宽指数,并可以达到以下效果。
l减少了我/ O(读不8kb页)
我是更有效的利用数据库缓存,因为SQLServer可以无缓存的索引页和减少内存索引页面所需的逻辑读取操作。
l减少数据库存储空间。
2.3。检查列的唯一性:
它不是表现在一个很小的范围内的电位值创建一个索引,如性别,因为优化器不能使用索引有效降低回归线。因为一个小范围的值可能会导致{ }或{全表扫描聚集索引扫描}。在WHERE子句中使列有大量独特的行(或高选择性)来限制访问的行数总是优先选择指数,应该在这些列创建一个小的结果集来访问。
此外,该顺序与多个列上的索引的创建有关。在某些情况下,使用最有选择性的列将更有效率。
2.4。检查列数据类型:
数值模型的索引是快速的,因为它的大小很小,算法操作容易,但是字符的大小很大,需要字符串匹配操作,通常开销较大。
2.5。考虑列的顺序:
在复合索引中,列的顺序是索引效率的一个重要因素。
L列唯一性;
L列宽度;
L列数据类型;
查询使用索引的边界执行查找操作来检索数据。将最有效的索引放在前面,并尽快筛选数据。减少数据量。
2.6。考虑索引的类型:
聚合索引和非聚集索引都存储在B -树中。
三。聚集索引(聚集索引)
聚集索引的叶页与表的数据页相同。表行按物理群集索引列排序,因为从中只能有一个物理顺序,所以只有一个聚集索引。
3.1。堆表:
没有集群索引的表称为堆表。数据列中没有连接到表相邻页的序列。与访问非堆表相比,无组织结构增加了访问的开销。
3.2。与非聚集指数的关系:
索引列的非聚集索引包含一个指针指向对应的数据线,指向一个表,该指针称为行定位器。它的价值取决于数据页存储在堆或聚集。非聚类指标,行定位器指向指针的数据线摆脱在堆。群集索引,行定位器是一个聚簇索引的索引键的值。当新数据行进入,这可能导致非聚簇索引定位,分页等,影响性能。
3.3。聚类索引建议:
1)首先创建集群索引:
因为所有非集群索引都在其索引行中保存集群索引键,所以创建顺序非常重要。
2)保持一个狭窄的索引:
对聚簇索引的总长度应尽可能地小。由于聚簇索引的长度太大,非聚簇索引也会增加。因此,大聚集索引键值不仅影响本身的宽度,也拓展了所有的非聚集索引的表增加索引页的数量,增加逻辑读磁盘I / O。
3)簇指数的一步重建:
由于聚簇索引和非聚簇索引,因此索引的使用和创建索引会导致非聚集索引设置两次,然后你可以使用创建drop_existing条款在聚集索引重建的单原子台阶指数的说法,类似于非聚集索引的使用。
4)何时使用群集索引:
(a)检索一定范围的数据:
由于聚类指数是按物理顺序建立的,合理利用索引可以减少磁头的运动,减少物理I/O。
(b)读取预先排序的数据:
聚类索引对于需要排序的数据是非常有效的,它可以减少数据读取后的排序开销。
对于读取大范围行和或排序输出的查询,集群索引通常比非集群索引更有效。
5)在不使用集群索引的情况下:
在某些情况下,最好不要使用集群索引:
a)经常更新的列:
如果列更新频繁,则非集群索引将重新定位,并且相关操作查询的开销将增加,它也将使用同一部分和其他未聚集索引的查询来阻塞此段时间,从而影响数据并行性。
(b)宽关键字:前面的原因已经解释过了。
c)并行顺序插入太多:
如果您想并行插入一个新行,那么它们将更好地分布在聚集索引的多个页面上,所有的插入都在最后一页上,通过创建另一个列索引形成一个巨大的焦点(索引将不按照新的顺序)。插入是随机分布在整个表中的,这个问题只有在大量同时插入时才会出现,如果磁盘热点成为性能瓶颈,您可以通过减少表的填充因子来保持中间页。
四。非聚簇索引
非聚集索引不影响表页中数据的顺序,对于堆表,行定位器指向指向数据行的指针,对于非堆表,指向集群索引的索引键。
4.1。非聚类索引维护:
优化维护成本,SQLServer旧数据页添加一个指针指向新的数据页在页分割,而不是更新所有相关的非聚集索引的行定位器。聚类索引行定位器减少与非聚集索引的开销。
4.2。定义书签查找:
当查询请求不是优化器选择的非聚集索引的一部分时,需要查找,这是对聚集索引的关键字查找和对堆表的清除查找。
此查找根据索引行的行定位器值从表中读取相应的数据行。除了索引页上的逻辑读取操作外,它还需要对数据页进行逻辑读取,但如果查询需要列中的索引,则不需要访问数据页。这称为覆盖指数。这些书签查找是大结果集最好使用集群索引的原因。
4.3。非聚集索引建议:
1。当使用非聚集索引时:
从大表读取少量行是最有效的。随着行数的增加,书签查找的开销成比例增加。索引列应该具有高选择性。
有一些索引要求不适合集群索引:
l经常更新的列
l广泛的关键
2。不使用非聚集索引时:
非聚集索引不适合检索大量行。最好是在这个时候使用聚簇索引,因为不需要一个单独的书签查找来检索数据行。如果你需要阅读大量的结果集的表,然后在过滤和非聚集索引连接条件不利于除非非聚集索引是用来覆盖指数。
五,聚类指数与非聚类指数
选择聚类指数或非聚类指数是考虑的主要因素:
由L检索的行数;
数据分类要求;
索引键宽度;
l列更新频率;
书签开销;
l任何磁盘热点;
5.1。相对于非聚集索引而言,聚类索引的好处:
在选择没有索引的表上的索引类型时,通常是首选索引。
尝试使用高选择性的小列在这个列上创建小聚集索引是一个很好的启示,但是在约定的列上的聚集索引可能同样有利甚至更好。
注意:尽管在许多数据检索中,许多聚集索引优于非聚集索引,但是表中只有一个聚集索引。因此,聚类索引应该保持在最强大的情况下。
5.2。非聚类索引相对聚类索引的优势:
在下列情况下,非聚集索引前面是集群索引:
l索引键大小大。
为了避免聚类索引的重建,L需要重建所有非聚集索引的相关开销。
L是一个在非聚集索引页上工作的数据库读取器,而编写程序修改数据页中的其他列(不包括非聚集索引)以避免阻塞。
l在查询所有引用列(从表中)时,可以安全地容纳非集群索引。
非集群索引的性能应该和集群索引一样好(甚至更好),而不需要跳转到数据行。
六。先进的索引技术
L覆盖指数:
l索引交叉:使用多个非集群索引来满足查询的所有列需求(从表中)
l索引连接:使用索引交叉和覆盖索引技术避免接触基表。
l过滤索引:为了索引字段或具有分散数据的稀疏列,过滤器可以应用于索引,因此它只对一些数据进行索引。
我的观点:物化视图索引在磁盘上
6.1。覆盖索引:
非聚类指标都是建立在满足SQL查询不需要达到下表中的所有列。如果查询满足指标,不需要参考完全底层的数据表,那么指数可以认为是一种覆盖指标。使用包括运营商覆盖索引程序,浙江存储数据和索引的索引结构本身不修改。
索引本身的覆盖面是减少逻辑阅读的一种游泳技巧:
l不想增加索引键的大小,但仍然希望有一个覆盖索引。
你打算指标数据类型不能被索引(除了文本、ntext和图像);
l超出索引的键列的最大数量(但最好避免这个问题)。
1、伪簇索引(pseudoclustered指数):
覆盖索引以在物理顺序组织所有索引列。从我的观点/ O,聚集索引不是用来计划覆盖指数包含列所有查询,充分满足索引中的列。如果查询结果集需要整理的覆盖指标可用于身体保持的结果要求的顺序列数据集。
2。建议:
使用覆盖索引,你应该注意的列的列表中的SELECT语句。少列应尽可能保持小覆盖索引键大小。如果在一个索引的所有列的字节数是小于一个单排一个表,并确定使用覆盖索引经常执行查询,然后覆盖指数是有效的。
在建立覆盖的许多指标,考虑SQLServer可以有效地自动使用索引交叉创建查询的覆盖指数。
6.2。指标的交叉:
如果一个表有很多指标,则SQLServer可以使用多个指标,执行一个查询,选择基于各指标数据的小的子集,然后执行两亚群的交叉口(即只有满足所有条件的行)
但在现实世界中,在修改现有索引时,应考虑以下问题:
l由于各种原因,不允许修改现有索引;
L中现有的非集群索引键可能相当宽;
l使用现有索引的查询开销将受此修改的影响。
为了提高查询性能,SQL Server可以使用多个索引的表,所以考虑创建多个窄的索引而不是广泛的索引键。
有时,可能需要创建一个单独的非集群索引,原因如下:
不允许在现有索引中对列进行L重排;
L覆盖索引所要求的一些列不能包含在现有的非聚集索引中;
l两个现有的非集群索引中的列总数可能是覆盖索引所需列数的冗余。
在这种情况下,可以在剩余的列上创建非集群索引。
6.3。索引连接:
指数指标交叉连接的一个变种,它适用于覆盖指数技术指标交叉。如果没有索引一个覆盖查询、多指标可以重写query.sqlserver可以使用索引连接不到基表完全满足查询。
6.4。滤波器的指标:
它是一个非聚集索引,它使用一个过滤器,基本上是WHERE子句。在一个或多个列上创建一个高度选择性的关键字组,这可能不是很有选择性。它适用于大量的空值。
筛选器索引以多种方式返回:
l减小索引大小以提高查询效率。
l构建较小的索引以减少存储开销。
l减少了索引维护的成本,因为减小了尺寸。
筛选器索引需要在访问或创建时设置一组特殊的ANSI设置:
在ansi_nulls,ansi_padding,ansi_warnings,ARITHABORT,concat_null_yields_null,quoted_identifier
关:numeric_roundabort
6.5。索引视图:
SQLServer可以创建一个独特的集群的集群的观点引导磁盘被物化,成为一个索引视图或索引实体观。非聚簇索引后可以创造创造。
1、福利:
l聚集可以预先计算并存储在索引视图来减少查询执行过程中昂贵的计算。
l表可以提前连接,结果集可以实现。
可以实现L连接或聚合的组成。
2。开销:
L基表中的任何修改都必须反映在SELECT语句中,该语句必须执行事务;
l可以修改索引视图定义的基本表中的任何索引,如果更新了集群键,也将更新集群索引。
l索引视图增加了数据库的维护开销。
在L数据库中需要更多的存储空间;
创建索引视图包含以下限制:
l视图的第一个索引必须是唯一的集群索引。
L索引视图中的非聚集索引只能在创建唯一的集群索引之后创建。
l视图定义必须是确定性的,也就是说,它只能返回一个可能的结果到给定的查询;
l索引视图必须只引用同一数据库中的基本表,而不是另一个视图;
l索引视图可以包含一个浮点列,但是这样的列不能包含在集群索引键中。
l索引视图必须是一个与引用表相关联的体系结构,以避免对表结构进行修改;
对L视图定义的语法有很多限制。
必须确定的set选项列表:
在concat_null_yields_null ARITHABORT,,ansi_nulls,ansi_padding和ansi_warning
关:numeric_roundabort
三.环境的使用:
OLTP是更难从索引视图的OLAP的利益。
6.6。索引压缩:
它是从2008引入的,压缩索引可以显著提高性能,但也会导致CPU和内存开销,这是一个不适合所有索引的方案。
默认情况下,索引不会被压缩,很显然索引在创建索引时需要压缩,它分为行级和页级压缩。索引中的非页页不接受页面类型下的压缩。
七。特殊的指数型
7.1。全文索引:
文本类型字段索引
7.2。空间索引:
索引空间类型的数据
7.3,XML:
在XML从2005引入xml类型之后
八、附录附录的特点
8.1。不同列的序列:
索引中的不同列可以按升序排列。
8.2。计算列上的索引:
只要计算列的表达式满足一定的限制,如源表的确定,就可以在计算列上创建索引。
8.3,位数据类型列上的索引:
在位数据列上创建索引不是一个很好的优势,但在覆盖索引列时覆盖索引是有用的。
8.4,作为查询处理创建索引语句:
8.5。并行索引创建:
您可以配置在最大并行度参数来控制处理器的数量在创建索引的语句,或者你可以使用exec sp_configuremaxdegree并行。
8.6。在线索引创建:
当创建索引时,可以减少锁定的机会。
8.7。考虑数据库引擎调整顾问
九、总结
要确定一个特殊查询的索引键列,有必要对查询的WHERE子句和连接条件进行评估,如列的选择性、宽度、数据类型和序列等,因为索引主要是为了检索少量的行,因此索引的选择性必须非常高。
为了获得更好的性能,可以使用覆盖索引来完全覆盖查询。
SQL Server数据库索引技术的优化
索引的常识:影响数据库性能的最大因素是索引,因为问题的复杂性,我可以简单地谈谈这个问题。但也有一些好的书给你看。在这里,我只讨论两种SQL Server索引是聚簇索引和非聚簇索引。当看什么类型的索引建立,你应该考虑数据类型和列来保存数据,以同样的方式,你必须同时考虑查询的数据库可以使用类型和查询最频繁使用的类型。
索引类型
如果柱救了高度相关的数据,并经常顺序访问,最好使用聚簇索引,这是因为如果使用聚集索引,SQL Server将身体以升序或降序重排(默认)的数据集,使您可以快速找到数据查询。同样,在搜索控制情况在一定范围内,最好使用聚集索引的列。这是因为,由于物理数据的重排,只能有一个聚集索引在每个表。
通过以上的对比,如果数据中包含的列相关性很差,你可以用nonculstered指标。你可以使用多达249个非聚集索引的表中的-虽然我不能想象在这么多指标的实际应用。
当桌子用主关键字(主键),默认情况下,SQL Server将自动为该列创建唯一聚集索引(S)包含的关键。很明显,这些列的唯一索引的建立(S)是主要的关键性建筑外键关系时。,如果你打算频繁使用它,它是建立非聚集索引的外部关键字柱的一个好方法。如果表有一个聚集索引,它使用一个链表来维护数据页之间的关系。相反,如果表没有聚集索引,SQL Server将在堆栈保存数据页。
数据页
当指数设立时,SQLServer建立一个数据页(数据页)和数据页指针来加快搜索速度。当指数设立时,其相应的填充因子也设置。设置填充因子的目的是显示在索引中的数据页的百分比。随着时间的推移,数据库的更新会消耗现有的闲置空间,使被分割的页面。页面分裂的结果是减少索引的性能,因此使用索引的查询会导致数据存储是支离破碎的。当一个指标的设置,该指数填充因子设置的填充因子,所以不能保持动态。
为了更新数据页的填充因子,我们可以停止旧索引和重建索引,并重新填充因子(注意:这将影响到当前数据库的操作和使用,它小心翼翼地在重要场合)。DBCC INDEXDEFRAG和DBCC DBREINDEX是两个命令清除聚集和nonculstered指数fragments.indexdefrag是联机操作(即,它没有其他表操作,如查询块),并重建索引DBREINDEX身体。在大多数情况下,重建索引可以更好的消除碎片,但这种优势是通过阻断,目前对指数的表发生的其他行动来实现的。当一个较大的碎片索引时,indexdefrag会花更长的时间,因为工作命令的数量是基于事务块的。
Filling factor
当你执行这些措施,数据库引擎可以更有效地回报指数为基础的数据,填充因子的话题(填充因子)超出了本文的范围,但我还是想提醒你注意那些表,打算填补指数。
执行查询时,SQL Server动态选择使用哪个索引。为此,SQL Server确定哪些指标是基于统计分布在这个关键词在每个指标。值得注意的是,在数据库日常活动如插入、删除和更新表,这些数据由SQL Server使用可能已经过期需要更新。您可以通过执行dbcc showcontig看到统计的状态。当你认为数据已经过时,你可以执行的形式更新统计信息的命令,使SQL Server更新有关指标的信息。
建立数据库维护计划
SQL Server简化并自动维护数据库提供了一个工具,这个工具,被称为数据库维护计划向导(这个称之为),也包括对指标的优化。如果你运行此向导,您将看到在数据库索引统计,这些统计工作日志,定期更新,从而减轻手动重建索引所造成的工作量。如果你不想自动更新索引统计,你也可以选择重新组织数据和在这个称之为数据页,这将停止旧索引和重建索引根据特定的填充因子。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。