在指定表或实例化视图上创建索引。
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX [ IF NOT EXISTS ] index-name ON [ owner.]table-name ( column-name [ ASC | DESC ], ... | function-name ( argument, ... ] ) AS column-name ) | [ WITH NULLS NOT DISTINCT ] [ { IN | ON } dbspace-name ] [ FOR OLAP WORKLOAD ]
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX [ IF NOT EXISTS ] index-name ON [ owner.]materialized-view-name ( column-name [ ASC | DESC ], ...) | [ WITH NULLS NOT DISTINCT ] [ { IN | ON } dbspace-name ] [ FOR OLAP WORKLOAD ]
VIRTUAL 子句 VIRTUAL 关键字主要由索引顾问使用。在索引顾问对执行计划进行求值期间以及使用 PLAN 函数时,虚拟索引将模拟真实物理索引的属性。可以将虚拟索引和 PLAN 函数结合使用以充分利用索引在性能方面的影响,从而避免创建真实索引这一通常既耗时又消耗资源的过程。
虚拟索引对其它连接是不可见的,并且在关闭连接时将被删除。在对查询的实际执行计划进行求值时不使用虚拟索引,所以不会对性能造成影响。
虚拟索引的列数限制为四列。
请参见获取对查询的索引顾问建议和索引顾问。
UNIQUE 子句 UNIQUE 属性确保表或实例化视图中不会有两行的值在所有索引列中相同。如果指定 UNIQUE,但不指定 WITH NULLS NOT DISTINCT,则每个索引键必须唯一或至少在一列中包含 NULL。例如,('a', NULL) 和 ('a', NULL) 这两个条目均被视为唯一。
如果指定 UNIQUE...WITH NULLS NOT DISTINCT,则不论 NULL 值如何,索引键都必须唯一。例如,('a', NULL) 和 ('a', NULL) 这两个条目被视为相等,但不唯一。
唯一约束与唯一索引是有区别的。唯一索引的列可以为 NULL,而唯一约束的列不能为 NULL。外键可以引用主键或者唯一约束,但不能引用唯一索引,因为唯一索引可以包括多个 NULL 实例。
建议不要将近似数据类型(例如 FLOAT 和 DOUBLE)用于主键或具有唯一约束的列。近似数值数据类型在算术运算后容易产生舍入误差。
CLUSTERED 子句 CLUSTERED 属性使行按照与索引对应的大概键顺序来存储。当数据库服务器尝试保留键顺序时,不能保证实施总体聚簇。
如果存在聚簇索引,LOAD TABLE 语句便按照索引键的顺序插入行,而 INSERT 语句将按照键顺序的定义尝试将新行添加到包含相邻行的同一页上。
请参见使用聚簇索引。
IF NOT EXISTS 子句 指定 IF NOT EXISTS 属性且命名的索引已存在时,不会进行任何更改,也不会返回错误。
ASC | DESC 子句 除非显式指定降序 (DESC),否则列以升序 (increasing) 排序。无论索引是升序排列还是降序排列,在执行升序或降序 ORDER BY 操作时都会使用索引。但是,如果通过混合的升序和降序特性来执行 ORDER BY,则仅当索引是用相同的升序和降序特性创建的时,才会使用索引。
function-name function-name 子句在函数上创建索引。此子句不能用于已声明的临时表或实例化视图。
CREATE INDEX 语句的这种格式是执行以下操作的便捷方法:
向表中添加名为 column-name 的计算列。该列是通过 COMPUTE 子句(此子句是指定的函数)以及任何指定的参数定义的。有关可指定的函数类型的限制,请参见 CREATE TABLE 语句的 COMPUTE 子句。该列的数据类型依函数的返回类型而定。
填充表中现有行的计算列。
创建列的索引。
删除索引不会导致相关联的计算列被删除。
有关计算列的详细信息,请参见使用计算列。
IN | ON 子句 缺省情况下,索引与其所在的表或实例化视图放在同一个数据库文件中。通过指定用来存放索引的 dbspace 名称,可以将索引放在单独的数据库文件中。此功能的主要用途是:使大型数据库避开文件大小的限制,或者实现通过使用多个磁盘设备才能达到的性能改善。
如果新索引可与现有逻辑索引共用物理索引,将忽略 IN 子句。
有关限制的详细信息,请参见SQL Anywhere 大小和数量限制。
WITH NULLS NOT DISTINCT 子句 仅当声明索引为 UNIQUE 并允许您指定索引键中的 NULL 不唯一时,才能指定此子句。有关详细信息,请参见 UNIQUE 子句。
FOR OLAP WORKLOAD 子句 当指定 FOR OLAP WORKLOAD 时,数据库服务器会执行某些优化,并会收集有关该键的统计信息以帮助提高 OLAP 负载的性能。当 optimization_workload 设置为 OLAP 时,性能改善最为显著。请参见optimization_workload 选项。
有关 OLAP 的详细信息,请参见OLAP 支持。
语法 1 与表一起使用;语法 2 与实例化视图一起使用。
索引可以提高数据库的性能。SQL Anywhere 使用物理索引和逻辑索引。物理索引是存储在磁盘上的实际索引结构。逻辑索引是对物理索引的引用。如果所创建索引的物理特性与现有索引相同,则数据库服务器会创建一个共享现有物理索引的逻辑索引。通常会将用户创建的索引视为逻辑索引。数据库服务器可根据需要创建物理索引以实现逻辑索引,并可在多个逻辑索引之间共享同一物理索引。请参见使用逻辑索引共享索引。
CREATE INDEX 语句在指定表或实例化视图的指定列上创建排序索引。此索引自动用于改进向数据库发出的查询的性能,以及通过 ORDER BY 子句对查询进行排序。索引一旦创建,就不能再在 SQL 语句中加以引用(除非对其进行校验 (VALIDATE INDEX)、变更 (ALTER INDEX)、删除 (DROP INDEX)),而且也不能在优化程序的提示中进行引用。
当存在使用 WITH HOLD 子句打开的使用语句快照或事务快照的游标时,不能执行此语句。请参见快照隔离。
实例化视图须是表或实例化视图的所有者,或者具有 DBA 权限或 REFERENCES 权限。
自动提交。在函数(隐式计算列)上创建索引还会生成一个检查点。
更新列统计信息(如果此信息不存在,则创建它)。
SQL/2008 服务商扩充。
在 Employees 表上创建一个两列索引。
CREATE INDEX employee_name_index ON Employees ( Surname, GivenName ); |
在 SalesOrderItems 表上为 ProductID 列创建索引。
CREATE INDEX item_prod ON SalesOrderItems ( ProductID ); |
使用 SORTKEY 函数在 Products 表的 Description 列上创建索引,其排序顺序根据俄语归类而定。该语句有一个副作用,即向表中添加一个计算列 desc_ru。
CREATE INDEX ix_desc_ru ON Products ( SORTKEY( Description, 'rusdict' ) AS desc_ru ); |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |