《MS SQL Server 2000管理员手册》系列——17. 建立与使用索引[6]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

变得片断化的索引而言,另一个问题是索引会有多于适量需求的索引层级。更多的索引层级意味着每个索引查询需要更多的I/O操作。您可以重新建置索引来减少索引层级的数目,并且因而降低所有索引查询所需的I/O操作量。
重新建置索引的一个方法是先手动移除索引,然后再重新建立该索引。对一个较小的资料表而言,这个方式勉强可以接受。但若处理的是中型或大型的数据表,则不应使用这个方法。最好是选择本节稍后将要介绍的方式来重建索引,该方法并不需要先卸除再重新建立索引。有几个理由支持这个选择。当我们在丛集数据表上建立非丛集索引时,非丛集索引是以丛集索引为基础而建立。若我们卸除了丛集索引,非丛集索引就必须重建一次,因为原先作为根据的丛集索引已不存在于数据表上。假设我们接着又在数据表上建立新的丛集索引,非丛集索引又必须再重建第二次!换言之,如果您先卸除再重新建立丛集索引,您必须重建非丛集索引两次:一次发生在丛集索引卸除时,一次发生在丛集索引重建时。若您使用另一个方法来重新建置丛集索引,非丛集索引将只需要重建一次。
要重建索引而不需先卸除再重新建立,可使用 CREATE INDEX...DROP_EXISTING 或使用 DBCC DBREINDEX 。这两种选择都可以一个步骤来重新建置索引,并告诉SQL Server要重新组织现有的索引。使用这些方法可以让您在重新建置丛集索引时避免非丛集索引的删除与重建。这些只要一个步骤的方法也会利用目前索引中数据排列的顺序,这些数据并不需要再重新排序。
 CREATE INDEX...DROP_EXISTING 是用来在数据表上一次只重建一个索引。 DBCC DBREINDEX 则是与数据库名称和数据表名称一起使用,可以重建该数据表上所有的索引,而不必为每个索引执行个别的命令。这两个命令的语法与选项请参阅在线丛书。
更新索引统计数据
 
如果您没有时间或资源去重建索引,您也可以单独地只更新统计数据。这个技术得到的结果也许不如重新建置索引那般有效,因为索引可能已经片断化,产生的问题远比统计资料过期要来得复杂。这里也假设您已将SQL Server中统计数据自动更新的功能关闭(否则的话,您的统计数据无论如何都会被周期性的更新)。您可使用 UPDATE STATISTICS 命令手动更新索引统计数据,语法如下:
UPDATE STATISTICS table_name
[ index_name | (statistics_name   [, statistics_name, ...] ]
[ WITH
[ FULLSCAN | SAMPLE number {PERCENT | ROWS} ]
[ ALL | COLUMNS | INDEX ]
[ NORECOMPUTE]
]
中括号内的值是选择性的,唯一必须的自变量是 table_name 。选择性的自变量在表17-2中说明。
如果您的系统必须处理大量的插入、更新,以及删除的作业,您应偶尔重新建置索引以避免效能如前述状况般降低。若您无法重新建置索引,至少也应定期的更新统计资料。
表17-2 UPDATE STATISTICS命令的选择性自变量
自变量  说明
index_name 指定要重新计算统计数据的索引。在预设状况下,数据表中所有的索引其统计数据都会重新计算。如果指定了index_name,就只有该索引的统计数据会重新计算。
statistics_name 允许您指定那些统计资料要重新计算。如果不指定这个值,所有的统计数据都会重新计算。
FULLSCAN 指定读取数据表中所有的数据列以收集统计数据。使用这个自变量是收集统计数据最好的方式,但它也会消耗最多的系统资源与时间。
SAMPLE number PERCENT | ROWS 指定统计数据要以多少数据列为基础,您可以提供资料列数或百分比率。在预设状况下,SQL Server会自行决定要取样的数据列数。这个选项无法与FULLSCAN选项共存。
ALL | COLUMN | INDEX 指定要收集所有的统计数据、或是数据行统计数据、或只收集索引统计数据。
NORECOMPUTE 指定统计资料在未来不会自动地重新计算。要重新开启统计数据自动重新计算的功能,可再次执行这个命令并且不要使用NORECOMPUTE选项,或是执行sp_autostats 预存程序。
使用索引
 
现在您已经了解如何建立索引,让我们接着来看一下如何使用索引。即使索引已经存在也不意味着SQL Server一定会使用它。一个索引是否会被SQL Server使用要看索引与SQL陈述式而定。此外,如果存在着多个索引,SQL Server可能就必须去选择要使用哪个索引。在本节中,您会看到SQL Server如何选择索引,您还会学到如何利用 索引提示 来指定使用哪个索引。您也会学到如何利用Query Analyzer来检视一个查询执行计划。
使用提示
 
当SQL Server查询最佳化器产生一个查询执行计划,它会选择一个能提供最佳效能的索引-通常这个索引会用到最少的I/O操作并检索最少量的数据列。
虽然查询最佳化器通常会为您的查询选择最有效率的查询执行计划与存取路径,但是若您对数据的了解比查询最佳化器知道得更多,您也许可以做出更好的决定。举例来说,假设您想在某一个数据表的名称数据行上检索名称为「Smith」的个人相关资料。索引统计数据是依照该数据行来建立的,并且假设其显示出在该数据行中每个名字平均出现三次。这个信息意味着该数据行具有相当良好的选择性;然而,您却知道「Smith」事实上出现的次数比平均值要高很多。若您知道如何指示SQL作业会更有效率,您可使用提示。 提示 (hint)是您给予查询最佳化器的简单建议,指定其不需进行自动地选择。
有数种型态的提示可用-包括联结提示、查询提示以及数据表提示-但此处我们将焦点放在数据表提示上。数据表提示让您指定如何存取该数据表(其它类型的提示会在 第35章 中介绍)。数据表提示可用来指定下列信息:
•   资料表扫瞄 在某些状况下,您可能会发现一个数据表扫瞄要比一个索引查询或索引扫瞄更有效率。当索引扫瞄需检索数据表中超过20% 的数据列时,数据表扫瞄会更有效率-例如,当数据表中有30% 是「Smith」。
 
•   要使用哪个索引 您可指定一个特定索引作为唯一要考虑的索引。您可能不知道SQL Server查询最佳化器在没有提示的状况下将会选择哪个索引,但您直觉得了解提示使用该索引会有最佳的效能。
 
•   要从哪一组索引中作选择 您可以对查询最佳化器建议数个索引,这些索引查询最佳化器都会使用(忽略重复的部分)。当您知道某个索引集合可以运作良好时,这个选项会很有用。
 
•   锁定方法 当查询最佳化器从特定数据表存取数据时,您可以告诉它要使用哪种类型的锁定。若您直觉到错误的锁定类型可能会被选取用在此数据表上,您可指定查询最佳化器应使用数据列锁定、分页锁定或数据表锁定。
 
让我们看一下如何利用提示来指定应使用的索引-也就是索引提示。下列范例显示出在T-SQL陈述式中使用索引提示的情形(该查询使用Region索引):
SELECT *
FROM Customers WITH (INDEX(Region))
WHERE Region = 'OR' AND City = 'Portland'
请注意索引提示是摆在WITH关键词之后。如果您想要指定多个索引给SQL Server使用,在T-SQL陈述式中把它们列出来,方式如下:
SELECT *
FROM Customers WITH (INDEX(Region, City, CompanyName))
WHERE Region = 'OR' AND City = 'Portland'
索引提示的自变量可以是一个索引名称(就如刚刚看到的那样)或是一个索引识别码(Index ID)。在提示中利用索引识别码时有些特殊的情况,如下表所示。
提示  结果
INDEX(0)使用在一个丛集数据表上(此数据表上存在一个丛集索引) 强制执行一个丛集索引扫瞄
INDEX(1)使用在一个丛集数据表上 强制执行一个丛集索引扫瞄或搜寻
INDEX(0)使用在一个非丛集数据表上(此数据表上没有丛集索引) 强制执行一个数据表扫瞄
INDEX(1)使用在一个非丛集数据表上 会像发生错误一样被中断
您可利用SQL Server Query Analyzer来执行您的查询,便可检视使用提示的结果。
使用Query Analyzer
 
在 第13章 中,您已经学到Query Analyzer是SQL Server 2000中一个很有用的工具。接着我们要再次利用这个工具来看一下它如何显示出查询执行计划使用的是哪一个索引。Query Analyzer还可以用在其它的任务中,如下:
•   执行SQL查询 您可以使用一个便于使用的GUI来执行SQL陈述式并检视它的结果。
 
•   分析查询的语法 在尚未执行前便分析此SQL陈述式的语法,您可以藉此发现错误并修正它。
 
•   显示估计的执行计划 透过显示执行计划,您可以看到不同的查询如何影响着执行耗用。这在最佳化SQL陈述式中非常有价值,因为允许您重新编写您的SQL叙述,并看看其执行成本是否有所改变。
 
•   执行索引分析 索引分析可以告诉您使用索引是否会增加一个查询的执行耗用。
 
要试验一下Query Analyzer,请将下列T-SQL陈述式载入到Query Analyzer之中:
SELECT *
FROM Customers
WHERE Region = 'OR' AND City = 'Portland'
现在请于 查询 下拉式菜单中选择 显示估计的执行计划 ,便可检查估计的执行计划。在图17-23中您可看到已使用City索引的情形。

 
 
图17-23 在没有提示时使用City索引的估计的执行计划
现在让我们新增一个提示来指示SQL Server使用Region索引。查询如下:
SELECT *
FROM Customers With (Index(Region))
WHERE Region = 'OR' AND City = 'Portland'
此查询的估计的执行计划如图17-24所示。请注意现在使用的是Region索引。

本文关键:《MS SQL Server 2000管理员手册》系列——17. 建立与使用索引
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top