vf中索引怎么写( 四 )


CLUSTERED 创建一个对象 , 其中行的物理排序与索引排序相同 , 并且聚集索引的最低一级(叶级)包含实际的数据行 。一个表或视图只允许同时有一个聚集索引 。
具有聚集索引的视图称为索引视图 。必须先为视图创建唯一聚集索引 , 然后才能为该视图定义其它索引 。
在创建任何非聚集索引之前创建聚集索引 。创建聚集索引时重建表上现有的非聚集索引 。
如果没有指定 CLUSTERED , 则创建非聚集索引 。说明 因为按照定义 , 聚集索引的叶级与其数据页相同 , 所以创建聚集索引时使用 ON filegroup 子句实际上会将表从创建该表时所用的文件移到新的文件组中 。
在特定的文件组上创建表或索引之前 , 应确认哪些文件组可用并且有足够的空间供索引使用 。文件组的大小必须至少是整个表所需空间的 1.2 倍 , 这一点很重要 。
NONCLUSTERED 创建一个指定表的逻辑排序的对象 。对于非聚集索引 , 行的物理排序独立于索引排序 。
非聚集索引的叶级包含索引行 。每个索引行均包含非聚集键值和一个或多个行定位器(指向包含该值的行) 。
如果表没有聚集索引 , 行定位器就是行的磁盘地址 。如果表有聚集索引 , 行定位器就是该行的聚集索引键 。
每个表最多可以有 249 个非聚集索引(无论这些非聚集索引的创建方式如何:是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建 , 还是使用 CREATE INDEX 显式创建) 。每个索引均可以提供对数据的不同排序次序的访问 。
对于索引视图 , 只能为已经定义了聚集索引的视图创建非聚集索引 。因此 , 索引视图中非聚集索引的行定位器一定是行的聚集键 。
index_name 是索引名 。索引名在表或视图中必须唯一 , 但在数据库中不必唯一 。
索引名必须遵循标识符规则 。table 包含要创建索引的列的表 。
可以选择指定数据库和表所有者 。view 要建立索引的视图的名称 。
必须使用 SCHEMABINDING 定义视图才能在视图上创建索引 。视图定义也必须具有确定性 。
如果选择列表中的所有表达式、WHERE 和 GROUP BY 子句都具有确定性 , 则视图也具有确定性 。而且 , 所有键列必须是精确的 。
只有视图的非键列可能包含浮点表达式(使用 float 数据类型的表达式) , 而且 float 表达式不能在视图定义的其它任何位置使用 。若要在确定性视图中查找列 , 请使用 COLUMNPROPERTY 函数(IsDeterministic 属性) 。
该函数的 IsPrecise 属性可用来确定键列是否精确 。必须先为视图创建唯一的聚集索引 , 才能为该视图创建非聚集索引 。
在 SQL Server 企业版或开发版中 , 查询优化器可使用索引视图加快查询的执行速度 。要使优化程序考虑将该视图作为替换 , 并不需要在查询中引用该视图 。
在创建索引视图或对参与索引视图的表中的行进行操作时 , 有 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 会显示一条错误信息 , 列出所有违反设置要求的 SET 选项 。
此外 , 对于涉及索引视图的 SELECT 语句 , 如果任何 SET 选项的值不是所需的值 , 则 SQL Server 在处理该。