




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何在 ORACLE 数据库的字段上建立索引?Oracle中建立索引,会提高查询速度:create index 索引名 on 表名 (列名 );例如:create index index_userid on tbl_detail(userid);如何找数据库表的主键字段的名称 ?SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA' select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA&
2、#39;Oracle 在创建主键(可以不加 constraint SYS_AAA ),会为库表自动创建索引,索引的列为主键列。 并且当库表某些列名或者库表名改变时候, Oracle 自动创建的索引 SYS_AAA, 中的索引列也会自动更 新(类似于视图),并且 SYS_AAA 会与名字更改后的库表还是保持索引关系。关键系统库表:desc dba_constraintsdesc dba_cons_columnsdesc dba_indexesdesc dba_ind_columnsdesc DBA_TAB_COLUMNS例子 1:更改库表的列名ALTER TABLE AAA RENAME COL
3、UMN ID TO AAA_ID;create table AAA (ID NUMBER(8),NAME CHAR(20),constraint SYS_AAA primary key(ID);/查找约束名字select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns ccwhere c.constraint_name=cc.constraint_name and c.table_name ='AAA'AND C.CONSTRAINT_TYPE=
4、39;P'CONSTRAINT_NAMETABLE_NAME COLUMN_NAMESYS_AAA AAA ID/查找索引select index_name,index_type,uniqueness from user_indexes where table_name='AAA' INDEX_NAME INDEX_TYPE UNIQUENESSYS_AAA NORMAL UNIQUE/查找索引有那些列SQL> select INDEX_NAME,column_name from dba_ind_columns where table_name ='AAA
5、' INDEX_NAME COLUMN_NAMESYS_AAA IDALTER TABLE AAA RENAME COLUMN ID TO AAA_ID;/查找约束名字select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns ccwhere c.constraint_name=cc.constraint_name and c.table_name ='AAA'AND C.CONSTRAINT_TYPE='P'CONSTRA
6、INT_NAME TABLE_NAME COLUMN_NAMESYS_AAA AAA AAA_IDSQL> select INDEX_NAME,column_name from dba_ind_columns where table_name ='AAA' INDEX_NAME COLUMN_NAMESYS_AAA AAA_ID例子 2:更改库表的表名ALTER TABLE AAA RENAME TO AAA_AAA;select INDEX_NAME,column_name from dba_ind_columns where table_name ='AAA_
7、AAA' INDEX_NAME COLUMN_NAMESYS_AAA AAA_IDCREATE INDEX为给定表或视图创建索引。只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有 数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。语法CREATE UNIQUE CLUSTERED| NONCLUSTERED INDEX index_nameON table | view ( column ASC | DESC ,.n ) WITH < index_option> ,.n ON filegroup < inde
8、x_option > := PAD_INDEX |FILLFACTORfillfactor |IGNORE_DUP_KEY |DROP_EXISTING |STATISTICS_NORECOMPUTE |SORT_IN_TEMPDB参数UNIQUE为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚集索引必须是 UNIQUE 索引。在创建索引时,如果数据已存在, Microsoft® SQL Server? 会检查是否有重复值,并在 每次使用 INSERT 或 UPDATE 语句添加数据时进行这种检查。如果存在重复的键值,将取 消 CREATE INDEX 语
9、句,并返回错误信息, 给出第一个重复值。 当创建 UNIQUE 索引时, 有多个 NULL 值被看作副本。如果存在唯一索引,那么会产生重复键值的 UPDATE 或 INSERT 语句将回滚,SQL Server 将显示错误信息。即使 UPDATE 或 INSERT 语句更改了许多行但只产生了 一个重复值,也会出现这种情况。如果在有唯一索引并且指定了 IGNORE_DUP_KEY 子句情况 下输入数据,则只有违反 UNIQUE 索引的行才会失败。在处理 UPDATE 语句时, IGNORE_DUP_KEY 不起作用。SQL Server 不允许为已经包含重复值的列创建唯一索引,无论是否设置了 I
10、GNORE_DUP_KEY 。如果尝试这样做, SQL Server 会显示错误信息;重复值必须先删除, 才能为这些列创建唯一索引。CLUSTERED创建一个对象,其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的 数据行。一个表或视图只允许同时有一个聚集索引。具有聚集索引的视图称为索引视图。必须先为视图创建唯一聚集索引,然后才能为该视图定义其它 索引。在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。如果没有指定 CLUSTERED ,则创建非聚集索引。说明 因为按照定义,聚集索引的叶级与其数据页相同,所以创建聚集索引时使 用 ON file
11、group 子句实际上会将表从创建该表时所用的文件移到新的文件组中。 在特定的文件 组上创建表或索引之前, 应确认哪些文件组可用并且有足够的空间供索引使用。 文件组的大小必须至 少是整个表所需空间的 1.2 倍,这一点很重要。NONCLUSTERED创建一个指定表的逻辑排序的对象。对于非聚集索引,行的物理排序独立于索引排序。非聚集索引 的叶级包含索引行。每个索引行均包含非聚集键值和一个或多个行定位器(指向包含该值的行)。如 果表没有聚集索引,行定位器就是行的磁盘地址。如果表有聚集索引,行定位器就是该行的聚集索引 键。每个表最多可以有 249 个非聚集索引(无论这些非聚集索引的创建方式如何:是使
12、用 PRIMARY KEY 和 UNIQUE 约束隐式创建,还是使用 CREATE INDEX 显式创 建)。每个索引均可以提供对数据的不同排序次序的访问。对于索引视图,只能为已经定义了聚集索引的视图创建非聚集索引。因此,索引视图中非聚集索引 的行定位器一定是行的聚集键。index_name是索引名。 索引名在表或视图中必须唯一, 但在数据库中不必唯一。 索引名必须遵循标识符规则。table包含要创建索引的列的表。可以选择指定数据库和表所有者。view要建立索引的视图的名称。必须使用 SCHEMABINDING 定义视图才能在视图上创建索引。视 图定义也必须具有确定性。如果选择列表中的所有表达
13、式、 WHERE 和 GROUP BY 子句都 具有确定性,则视图也具有确定性。而且,所有键列必须是精确的。只有视图的非键列可能包含浮点 表达式(使用 float 数据类型的表达式),而且 float 表达式不能在视图定义的其它任何位置 使用。若要在确定性视图中查找列,请使用 COLUMNPROPERTY 函数( IsDeterministic 属性)。该 函数的 IsPrecise 属性可用来确定键列是否精确。必须先为视图创建唯一的聚集索引,才能为该视图创建非聚集索引。在 SQL Server 企业版或开发版中, 查询优化器可使用索引视图加快查询的执行速度。 要使优 化程序考虑将该视图作为替
14、换,并不需要在查询中引用该视图。在创建索引视图或对参与索引视图的表中的行进行操作时, 有 7 个 SET 选项必须指派特定 的值。 SET 选项 ARITHABORT 、 CONCAT_NULL_YIELDS_NULL 、QUOTED_IDENTIFIER 、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNING 必须为 ON。SET 选 项 NUMERIC_ROUNDABORT 必须为OFF。如果与上述设置有所不同, 对索引视图所引用的任何表执行的数据修改语句 (INSERT、 UPDATE、 DELETE) 都将失败, SQL Server 会显示一条错误信息,列出所
15、有违反设置要求的 SET 选 项。此外,对于涉及索引视图的 SELECT 语句,如果任何 SET 选项的值不是所需的值, 则 SQL Server 在处理该 SELECT 语句时不考虑索引视图替换。在受上述 SET 选项影 响的情况中,这将确保查询结果的正确性。如果应用程序使用 DB-Library 连接,则必须为服务器上的所有 7 个 SET 选项指派所 需的值。 (默认情况下, OLE DB 和 ODBC 连接已经正确设置了除 ARITHABORT 外所 有需要的 SET 选项。)如果并非所有上述 SET 选项均有所需的值,则某些操作(例如BCP、复制或分布式查询)可能无法对参与索引视图的
16、表执行更新。在大多数情况下,将ARITHABORT 设置为 ON (通过服务器配置选项中的 user options)可以避免这一问题。强烈建议在服务器的任一数据库中创建计算列上的第一个索引视图或索引后,尽早在服务器范围内将 ARITHABORT 用户选项设置为 ON。有关索引视图注意事项和限制的更多信息,请参见注释部分。column应用索引的列。 指定两个或多个列名, 可为指定列的组合值创建组合索引。 在 table 后的圆括号 中列出组合索引中要包括的列(按排序优先级排列)。说明 由 ntext、 text 或 image 数据类型组成的列不能指定为索引列。另外,视图不能包 括任何text
17、、 ntext 或 image 列,即使在 CREATE INDEX 语句中没有引用这些列。当两列或多列作为一个单位搜索最好,或者许多查询只引用索引中指定的列时,应使用组合索引。 最多可以有 16 个列组合到一个组合索引中。组合索引中的所有列必须在同一个表中。组合索引 值允许的最大大小为 900 字节。也就是说,组成组合索引的固定大小列的总长度不得超 过 900 字节。有关组合索引中可变类型列的更多信息,请参见注释部分。ASC | DESC确定具体某个索引列的升序或降序排序方向。默认设置为ASC。n表示可以为特定索引指定多个 columns 的占位符PAD_INDEX指定索引中间级中每个页(节
18、点)上保持开放的空间。 PAD_INDEX 选项只有在指定了 FILLFACTOR 时才有用,因为 PAD_INDEX 使用由 FILLFACTOR 所指定的百分比 默认情况下, 给定中间级页上的键集, SQL Server 将确保每个索引页上的可用空间至少可以容纳 一个索引允许的最大行。如果为 FILLFACTOR 指定的百分比不够大,无法容纳一行, SQL Server 将在内部使用允许的最小值替代该百分比。说明 中间级索引页上的行数永远都不会小于两行,无论 FILLFACTOR 的值有多小。FILLFACTOR = fillfactor指定在 SQL Server 创建索引的过程中,各索
19、引页叶级的填满程度。如果某个索引页填满,SQL Server 就必须花时间拆分该索引页,以便为新行腾出空间,这需要很大的开销。对于更新频 繁的表,选择合适的 FILLFACTOR 值将比选择不合适的 FILLFACTOR 值获得更好的更新性 能。 FILLFACTOR 的原始值将在 sysindexes 中与索引一起存储。如果指定了 FILLFACTOR ,SQL Server 会向上舍入每页要放置的行数。例如,发 出 CREATE CLUSTERED INDEX .FILLFACTOR = 33 将创建一 个 FILLFACTOR 为 33% 的聚集索引。假设 SQL Server 计算出每
20、页空间 的 33% 为 5.2 行。 SQL Server 将其向上舍入,这样,每页就放置 6 行。设置只是在索引首次创建时应用SQL Server 并不会动态说明 显式的 FILLFACTOR 保持页上可用空间的指定百分比。用户指定的 FILLFACTOR 值可以从 1 到 100。如果没有指定值,默认值为0。如果 FILLFACTOR 设置为 0 ,则只填满叶级页。可以通过执行sp_configure 更改默认的 FILLFACTOR 设置。只有不会出现 INSERT 或 UPDATE 语句时(例如对只读表),才可以使 用 FILLFACTOR 100。如果 FILLFACTOR 为 10
21、0, SQL Server 将创建叶级 页 100% 填满的索引。如果在创建 FILLFACTOR 为 100% 的索引之后执 行 INSERT 或 UPDATE ,会对每次 INSERT 操作以及有可能每次 UPDATE 操作进行 页拆分。如果 FILLFACTOR 值较小( 0 除外),就会使 SQL Server 创建叶级页不完全填充的 新索引。例如,如果已知某个表包含的数据只是该表最终要包含的数据的一小部分,那么为该表创建 索引时, FILLFACTOR 为 10 会是合理的选择。 FILLFACTOR 值较小还会使索引占用较多的 存储空间。下表说明如何在已指定 FILLFACTOR的
22、情况下填充索引页。FILLFACTOR 中间级页 叶级页0 一个可用项 100%1% -99 一个可用项填满<= FILLFACTOR% 填满100% 一个可用项 100% 填满一个可用项是指页上可以容纳另一个索引项的空间重要 用某个 FILLFACTOR 值创建聚集索引会影响数据占用存储空间的数量,因 为 SQL Server 在创建聚集索引时会重新分布数据。IGNORE_DUP_KEY控制当尝试向属于唯一聚集索引的列插入重复的键值时所发生的情况。如果为索引指定了 IGNORE_DUP_KEY ,并且执行了创建重复键的 INSERT 语句, SQL Server 将发出警告 消息并忽略
23、重复的行。如果没有为索引指定 个 INSERT 语句IGNORE_DUP_KEY ,SQLServer 会发出一条警告消息,并回滚整IGNORE_DUP_KEYIGNORE_DUP_KEYIGNORE_DUP_KEY下表显示何时可使用索引类型 选项聚集 不允许唯一聚集 允许使用 非聚集 不允许 唯一非聚集 允许使用DROP_EXISTING指定应除去并重建已命名的先前存在的聚集索引或非聚集索引。指定的索引名必须与现有的索引名 相同。因为非聚集索引包含聚集键,所以在除去聚集索引时,必须重建非聚集索引。如果重建聚集索 引,则必须重建非聚集索引,以便使用新的键集。为已经具有非聚集索引的表重建聚集索引
24、时(使用相同或不同的键集),DROP_EXISTING 子句可以提高性能。 DROP_EXISTING 子句代替了先对旧的聚集索引执行DROP INDEX 语句,然后再对新的聚集索引执行 CREATE INDEX 语句的过程。非聚集索引只需重建一次,而且还 只是在键不同的情况下才需要。如果键没有改变(提供的索引名和列与原索引相同),则 DROP_EXISTING 子句不会重新对数 据进行排序。在必须压缩索引时,这样做会很有用。无法使用 DROP_EXISTING 子句将聚集索引转换成非聚集索引; 不过, 可以将唯一聚集索引更 改为非唯一索引,反之亦然。说明 当执行带 DROP_EXISTING
25、 子句的 CREATE INDEX 语句时, SQL Server 假定索引是一致的(即索引没有损坏)。指定索引中的行应 按 CREATE INDEX 语句中引用的指定键排序。STATISTICS_NORECOMPUTE指定过期的索引统计不会自动重新计算。若要恢复自动更新统计,可执行没 有 NORECOMPUTE 子句的 UPDATE STATISTICS 。重要 如果禁用分布统计的自动重新计算, 的查询选取最佳执行计划。可能会妨碍 SQL Server 查询优化器为涉及该表SORT_IN_TEMPDB指定用于生成索引的中间排序结果将存储在 tempdb 数据库中。如果 tempdb 与用户数
26、据库 不在同一磁盘集,则此选项可能减少创建索引所需的时间,但会增加创建索引时使用的磁盘空间。有关更多信息,请参见 tempdb 和索引创建。ON filegroup在给定的 filegroup 上创建指定的索引。该文件组必须已经通过执 行 CREATE DATABASE 或 ALTER DATABASE 创建。注释为表或索引分配空间时, 每次递增一个扩展盘区 (8 个 8 KB 的页)。每填满一个扩展盘区, 就会再分配一个。如果表非常小或是空表,其索引将使用单页分配,直到向索引添加了 8 页后, 再转而进行扩展盘区分配。若要获得有关索引已分配和占用的空间数量的报表,请使用 sp_spaceus
27、ed创建聚集索引要求数据库中的可用空间大约为数据大小的1.2 倍。该空间不包括现有表占用的空间;将对数据进行复制以创建聚集索引,旧的无索引数据将在索引创建完成后删除。使 用 DROP_EXISTING 子句时,聚集索引所需的空间数量与现有索引的空间要求相同。所需的额 外空间可能还受指定的 FILLFACTOR 的影响。在 SQL Server 2000 中创建索引时,可以使用 SORT_IN_TEMPDB 选项指示数据库引 擎在 tempdb 中存储中间索引排序结果。如果 tempdb 在不同于用户数据库所在的磁盘集上, 则此选项可能减少创建索引所需的时间, 但会增加用于创建索引的磁盘空间。
28、除在用户数据库中创建 索引所需的空间外, tempdb 还必须有大约相同的额外空间来存储中间排序结果。有关更多信息, 请参见 tempdb 和索引创建。CREATE INDEX 语句同其它查询一样优化。 SQL Server 查询处理器可以选择扫描另一个 索引,而不是执行表扫描,以节省 I/O 操作。在某些情况下,可以不必排序。在运行 SQL Server 企业管理器和程序员版的多处理器计算机上, CREATE INDEX 自动 使用多个处理器执行扫描和排序,与其它查询的操作方式相同。执行一条CREATE INDEX 语句所使用的处理器数由配置选项 max degree of parallel
29、ism 和当前的工作负荷决定。如 果 SQL Server 检测到系统正忙,则在开始执行语句之前, CREATE INDEX 操作的并发程 度会自动降低。自上一次文件组备份以来受 CREATE INDEX 语句影响的全部文件组必须作为一个单位备 份。有关文件和文件组备份的更多信息,请参见 BACKUP 。备份和 CREATE INDEX 操作不相互防碍。如果正在进行备份,则在完整日志记录模式中创 建索引,而这可能需要额外的日志空间。若要显示有关对象索引的报表,请执行sp_helpindex。可以为临时表创建索引。在除去表或终止会话时,所有索引和触发器都将被除去。索引中的可变类型列索引键允许的最
30、大大小为 900 字节,不过 SQL Server 2000 允许在可能包含大量可变 类型列的列上创建索引,而这些列的最大大小超过 900 字节。在创建索引时, SQL Server 检查下列条件:所有参与索引定义的固定数据列的总长度必须小于或等于 900 字节。当所要创建的索引只由固 定数据列构成时,固定数据列的总计大小必须小于或等于 900 字节。否则将不能创建索引, 且 SQL Server 将返回错误。如果索引定义由固定类型列和可变类型列组成,且固定数据列满足前面的条件(小于或等于 900 字节),则 SQL Server 仍要检查可变类型列的总大小。如果可变类型列的最大大 小与固定数
31、据列大小的和大于 900 字节,则 SQL Server 将创建索引,不过将给用户返回 警告消息以提醒用户: 如果随后在可变类型列上的插入或更新操作导致总大小超过 900 字节,则 操作将失败且用户将收到运行时错误。同样,如果索引定义只由可变类型列组成,且这些列的最大总 大小大于 900 字节,则 SQL Server 将创建索引,不过将返回警告消息。有关更多信息,请参见索引键的最大值。在计算列和视图上创建索引时的考虑在 SQL Server 2000 中,还可以在计算列和视图上创建索引。在视图上创建唯一聚集索引 可以提高查询性能,因为视图存储在数据库中的方式与具有聚集索引的表的存储方式相同。
32、UNIQUE 或 PRIMARY KEY 只要满足所有索引条件,就可以包含计算列。具体说来就是, 计算列必须具有确定性、必须精确,且不能包含text、 ntext 或 image 列。有关确定性的更多信息,请参见确定性函数和非确定性函数。在计算列或视图上创建索引可能导致前面产生的 INSERT 或 UPDATE 操作失败。当计算列 导致算术错误时可能产生这样的失败。例如,虽然下表中的计算列 c 将导致算术错误,但 是 INSERT 语句仍有效:CREATE TABLE t1 (a int, b int, c AS a/b)GOINSERT INTO t1 VALUES ('1'
33、, '0')GO相反,如果创建表之后在计算列 c 上创建索引,则上述 INSERT 语句将失败。CREATETABLEt1 (a int, bint, cASa/b)GOCREATEUNIQUECLUSTEREDINDEXIdx1ON t1.cGOINSERTINTO t1VALUES ('1','0')GO在通过数字或 float 表达式定义的视图上使用索引所得到的查询结果, 可能不同于不在视图上使 用索引的类似查询所得到的结果。这种差异可能是由对基础表进行INSERT、DELETE 或 UPDATE 操作时的舍入错误引起的。若要防止 SQL
34、Server 使用索引视图,请在查询中包含 OPTION (EXPAND VIEWS) 提示。此外,任何所列选项设置不正确均会阻止优化程序使 用视图上的索引。 有关 OPTION (EXPAND VIEWS) 提示的更多信息, 请参见 SELECT 。对索引视图的限制定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT 、COMPUTE 、HAVING 和 UNION 关键字。也不能包含子查询。SELECT 列表中不得包含星号(*) 、'table.*' 通配符列表、 DISTINCT 、COUNT(*) 、COUNT(<expressio n>)、
35、基表中的计算列和标量聚合。非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表(包含 GROUP BY 的 查询)中可能包含 SUM 和 COUNT_BIG(<expression>);它一定包含 COUNT_BIG(*)。不允 许有其它聚合函数( MIN、 MAX 、 STDEV,.)。使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过,如果查询使用这样的聚 合,则优化程序将能使用该索引视图,用 SUM 和 COUNT_BIG 的简单聚合组合代 替 AVG 。若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的,
36、则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。索引视图受限于以下的附加限制:索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该 语句中只能出现一次。在任何联接表中,均不允许进行 OUTER JOIN 操作搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。如果视图定义包含 GROUP BY 子句,则视图的 SELECT 列表中必须包含所有分组依据 列及 COUNT_BIG
37、(*) 表达式。此外, CREATE UNIQUE CLUSTERED INDEX 子句中必 须只包含这些列。可以创建索引的视图的定义主体必须具有确定性且必须精确,这类似于计算列上的索引要求。请参 见在计算列上创建索引。权限CREATE INDEX 的权限默认授予 sysadmin 固定服务器角色、 db_ddladmin 和 db_owner 固定数据库角色和表所有者且不能转让。示例A. 使用简单索引面的示例为 authors 表的 au_id 列创建索引SET NOCOUNT OFFUSE pubsIF EXISTS (SELECT name FROM sysindexesWHERE na
38、me = 'au_id_ind')DROP INDEX authors.au_id_indGOUSE pubs叶级页填满<= FILLFACTOR% 填满CREATE INDEFILLFACTOR 中间级页 0 一个可用项 100% 1% -99 一个可用项100% 一个可用项 100% 填满一个可用项是指页上可以容纳另一个索引项的空间重要 用某个 FILLFACTOR 值创建聚集索引会影响数据占用存储空间的数量,因 为 SQL Server 在创建聚集索引时会重新分布数据。IGNORE_DUP_KEY控制当尝试向属于唯一聚集索引的列插入重复的键值时所发生的情况。如果为索
39、引指定了 IGNORE_DUP_KEY ,并且执行了创建重复键的 INSERT 语句, SQL Server 将发出警告 消息并忽略重复的行。如果没有为索引指定 个 INSERT 语句IGNORE_DUP_KEY ,SQLServer 会发出一条警告消息,并回滚整下表显示何时可使用IGNORE_DUP_KEY索引类型 选项聚集 不允许唯一聚集 允许使用 IGNORE_DUP_KEY 非聚集 不允许唯一非聚集 允许使用 IGNORE_DUP_KEYDROP_EXISTING指定应除去并重建已命名的先前存在的聚集索引或非聚集索引。指定的索引名必须与现有的索引名 相同。因为非聚集索引包含聚集键,所以
40、在除去聚集索引时,必须重建非聚集索引。如果重建聚集索 引,则必须重建非聚集索引,以便使用新的键集。为已经具有非聚集索引的表重建聚集索引时(使用相同或不同的键集),DROP_EXISTING 子句可以提高性能。 DROP_EXISTING 子句代替了先对旧的聚集索引执行DROP INDEX 语句,然后再对新的聚集索引执行 CREATE INDEX 语句的过程。非聚集索引只需重建一次,而且还 只是在键不同的情况下才需要。如果键没有改变(提供的索引名和列与原索引相同),则 DROP_EXISTING 子句不会重新对数 据进行排序。在必须压缩索引时,这样做会很有用。无法使用 DROP_EXISTING
41、 子句将聚集索引转换成非聚集索引; 不过, 可以将唯一聚集索引更 改为非唯一索引,反之亦然。说明 当执行带 DROP_EXISTING 子句的 CREATE INDEX 语句时, SQL Server 假定索引是一致的(即索引没有损坏)。指定索引中的行应 按 CREATE INDEX 语句中引用的指定键排序。STATISTICS_NORECOMPUTE指定过期的索引统计不会自动重新计算。若要恢复自动更新统计,可执行没 有 NORECOMPUTE 子句的 UPDATE STATISTICS 。重要 如果禁用分布统计的自动重新计算,可能会妨碍 SQL Server 查询优化器为涉及该表 的查询选取
42、最佳执行计划SORT_IN_TEMPDB指定用于生成索引的中间排序结果将存储在 tempdb 数据库中。如果 tempdb 与用户数据库 不在同一磁盘集,则此选项可能减少创建索引所需的时间,但会增加创建索引时使用的磁盘空间。有关更多信息,请参见 tempdb 和索引创建。ON filegroup在给定的 filegroup 上创建指定的索引。该文件组必须已经通过执 行 CREATE DATABASE 或 ALTER DATABASE 创建。注释为表或索引分配空间时, 每次递增一个扩展盘区 (8 个 8 KB 的页)。每填满一个扩展盘区, 就会再分配一个。如果表非常小或是空表,其索引将使用单页分
43、配,直到向索引添加了 8 页后, 再转而进行扩展盘区分配。若要获得有关索引已分配和占用的空间数量的报表,请使用 sp_spaceused创建聚集索引要求数据库中的可用空间大约为数据大小的1.2 倍。该空间不包括现有表占用的空间;将对数据进行复制以创建聚集索引,旧的无索引数据将在索引创建完成后删除。使 用 DROP_EXISTING 子句时,聚集索引所需的空间数量与现有索引的空间要求相同。所需的额 外空间可能还受指定的 FILLFACTOR 的影响。在 SQL Server 2000 中创建索引时,可以使用 SORT_IN_TEMPDB 选项指示数据库引 擎在 tempdb 中存储中间索引排序结
44、果。如果 tempdb 在不同于用户数据库所在的磁盘集上, 则此选项可能减少创建索引所需的时间, 但会增加用于创建索引的磁盘空间。 除在用户数据库中创建 索引所需的空间外, tempdb 还必须有大约相同的额外空间来存储中间排序结果。有关更多信息, 请参见 tempdb 和索引创建。CREATE INDEX 语句同其它查询一样优化。 SQL Server 查询处理器可以选择扫描另一个 索引,而不是执行表扫描,以节省 I/O 操作。在某些情况下,可以不必排序。在运行 SQL Server 企业管理器和程序员版的多处理器计算机上, CREATE INDEX 自动 使用多个处理器执行扫描和排序,与其
45、它查询的操作方式相同。执行一条CREATE INDEX 语句所使用的处理器数由配置选项 max degree of parallelism 和当前的工作负荷决定。如 果 SQL Server 检测到系统正忙,则在开始执行语句之前, CREATE INDEX 操作的并发程 度会自动降低。自上一次文件组备份以来受 CREATE INDEX 语句影响的全部文件组必须作为一个单位备 份。有关文件和文件组备份的更多信息,请参见 BACKUP 。备份和 CREATE INDEX 操作不相互防碍。如果正在进行备份,则在完整日志记录模式中创 建索引,而这可能需要额外的日志空间。若要显示有关对象索引的报表,请执
46、行sp_helpindex。可以为临时表创建索引。在除去表或终止会话时,所有索引和触发器都将被除去。索引中的可变类型列索引键允许的最大大小为 900 字节,不过 SQL Server 2000 允许在可能包含大量可变 类型列的列上创建索引,而这些列的最大大小超过 900 字节。在创建索引时, SQL Server 检查下列条件:900 字节。当所要创建的索引只由固所有参与索引定义的固定数据列的总长度必须小于或等于900 字节。否则将不能创建索引,定数据列构成时,固定数据列的总计大小必须小于或等于 且 SQL Server 将返回错误。如果索引定义由固定类型列和可变类型列组成,且固定数据列满足前
47、面的条件(小于或等于 900 字节),则 SQL Server 仍要检查可变类型列的总大小。如果可变类型列的最大大 小与固定数据列大小的和大于 900 字节,则 SQL Server 将创建索引,不过将给用户返回 警告消息以提醒用户: 如果随后在可变类型列上的插入或更新操作导致总大小超过 900 字节,则 操作将失败且用户将收到运行时错误。同样,如果索引定义只由可变类型列组成,且这些列的最大总 大小大于 900 字节,则 SQL Server 将创建索引,不过将返回警告消息。有关更多信息,请参见索引键的最大值。在计算列和视图上创建索引时的考虑在 SQL Server 2000 中,还可以在计算
48、列和视图上创建索引。在视图上创建唯一聚集索引 可以提高查询性能,因为视图存储在数据库中的方式与具有聚集索引的表的存储方式相同。UNIQUE 或 PRIMARY KEY 只要满足所有索引条件,就可以包含计算列。具体说来就是, 计算列必须具有确定性、必须精确,且不能包含text、 ntext 或 image 列。有关确定性的更多信息,请参见确定性函数和非确定性函数。在计算列或视图上创建索引可能导致前面产生的 INSERT 或 UPDATE 操作失败。当计算列 导致算术错误时可能产生这样的失败。例如,虽然下表中的计算列 c 将导致算术错误,但 是 INSERT 语句仍有效:CREATE TABLE t1 (a int, b int, c AS a/b)GOINSERT IN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 提高综合评估能力初级社会工作者考试试题及答案
- 第三版逻辑学试题及答案
- 改制企业解除合同协议书
- 英语六级答案及试题
- 小人开车考试题目及答案
- 社会工作者中级考试基础试题及答案
- 为2025年系统分析师考试奠定基础的试题及答案
- 数字化转型中的系统集成试题及答案
- 伊犁医院面试题及答案大全
- 初中肺活力测试题及答案
- DBJ50-T-078-2016重庆市城市道路工程施工质量验收规范
- 《基于STAMP的航空安全理论与实践》课件-第2章
- 庭院绿化养护方案
- 一例胃癌患者的个案护理
- 【MOOC】《电工技术》(北京科技大学)中国大学MOOC慕课答案
- 政府专职消防文员笔试考试题库(含答案)
- 2025届内蒙古鄂尔多斯市康巴什区鄂尔多斯一中高考考前模拟数学试题含解析
- 经营高危险性体育项目游泳申请表
- 小学低年级识字教学策略研究三篇
- 在线学习新变革课件 2024-2025学年人教版(2024)初中信息技术七年级全一册
- 膀胱癌教学课件
评论
0/150
提交评论