Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

CREATE INDEX 语句

此语句用于在指定表或实例化视图上创建索引。索引可以提高数据库的性能。

语法 1 - 在表上创建索引
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX index-name
  ON [ owner.]table-name
    ( column-name [ ASC | DESC ], ...
      | function-name ( argument, ... ] ) AS column-name )
  [ { IN | ON } dbspace-name ]
  [ FOR OLAP WORKLOAD ]
语法 2 - 在实例化视图上创建索引
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX index-name
  ON [ owner.]materialized-view-name
    ( column-name [ ASC | DESC ], ...)
  [ { IN | ON } dbspace-name ]
  [ FOR OLAP WORKLOAD ]
参数
  • VIRTUAL 子句   VIRTUAL 关键字主要由索引顾问使用。在索引顾问对执行计划进行求值期间以及使用 PLAN 函数时,虚拟索引将模拟真实物理索引的属性。可以将虚拟索引和 PLAN 函数结合使用以充分利用索引在性能方面的影响,从而避免创建真实索引这一通常既耗时又消耗资源的过程。

    虚拟索引对其它连接是不可见的,并且在关闭连接时将被删除。在对查询的实际执行计划进行求值时不使用虚拟索引,所以不会对性能造成影响。

    虚拟索引的列数限制为四列。

    请参见获取对查询的 [索引顾问] 建议索引顾问

  • CLUSTERED 子句   CLUSTERED 属性使行按照与索引对应的大概键顺序来存储。当数据库服务器尝试保留键顺序时,不能保证实施总体聚簇。

    如果存在聚簇索引,LOAD TABLE 语句便按照索引键的顺序插入行,而 INSERT 语句将按照键顺序的定义尝试将新行添加到包含相邻行的同一页上。

    请参见使用聚簇索引

  • UNIQUE 子句   UNIQUE 属性确保表或实例化视图中不会有两行的值在所有索引列中相同。每个索引键都必须是唯一的,或者至少在一列中包含 NULL。

    唯一约束与唯一索引是有区别的。唯一索引的列可以为 NULL,而唯一约束的列不能为 NULL。外键可以引用主键或者唯一约束,但不能引用唯一索引,因为唯一索引可以包括多个 NULL 实例。

    建议不要将近似数据类型(例如 FLOAT 和 DOUBLE)用于主键或具有唯一约束的列。近似数值数据类型在算术运算后容易产生舍入误差。

  • ASC | DESC 子句   除非显式指定降序 (DESC),否则列以升序 (increasing) 排序。无论索引是升序排列还是降序排列,在执行升序或降序 ORDER BY 操作时都会使用索引。但是,如果通过混合的升序和降序特性来执行 ORDER BY,则仅当索引是用相同的升序和降序特性创建的时,才会使用索引。

  • function-name   function-name 子句在函数上创建索引。此子句不能用于已声明的临时表或实例化视图。

    CREATE INDEX 语句的这种格式是执行以下操作的便捷方法:

    1. 向表中添加名为 column-name 的计算列。该列是通过 COMPUTE 子句(此子句是指定的函数)以及任何指定的参数定义的。有关可指定的函数类型的限制,请参见 CREATE TABLE 语句的 COMPUTE 子句。该列的数据类型依函数的返回类型而定。

    2. 填充表中现有行的计算列。

    3. 创建列的索引。

      删除索引不会导致相关联的计算列被删除。

      有关计算列的详细信息,请参见使用计算列

  • IN | ON 子句   缺省情况下,索引与其所在的表或实例化视图放在同一个数据库文件中。通过指定用来存放索引的 dbspace 名称,可以将索引放在单独的数据库文件中。此功能的主要用途是:使大型数据库避开文件大小的限制,或者实现通过使用多个磁盘设备才能达到的性能改善。

    如果新索引可与现有逻辑索引共用物理索引,将忽略 IN 子句。

    有关限制的详细信息,请参见SQL Anywhere 大小和数量限制

  • 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)),而且也不能在优化程序的提示中进行引用。

  • 索引所有权   无法在 CREATE INDEX 语句中指定索引所有者。索引总是由表或实例化视图的所有者拥有。

  • 视图索引   可在实例化视图上创建索引,但无法在非常规视图上创建。

  • 索引名称空间   对于给定表或实例化视图,每个索引的名称必须唯一。

  • 独占使用   只要 CREATE INDEX 语句影响了当前正由其它连接使用的表或实例化视图,就会禁止该语句。CREATE INDEX 可能很耗时,且数据库服务器在处理此语句时不会处理引用同一个表的请求。

  • 自动创建的索引   SQL Anywhere 自动为主键、外键和唯一约束创建索引。这些自动创建的索引保存在表所在的同一数据库文件中。

当存在使用 WITH HOLD 子句打开的使用语句快照或事务快照的游标时,不能执行此语句。请参见快照隔离

权限

实例化视图须是表或实例化视图的所有者,或者具有 DBA 权限或 REFERENCES 权限。

副作用

自动提交。在内置函数上创建索引还会生成一个检查点。

更新列统计信息(如果此信息不存在,则创建它)。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

在 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 );