#CREATE INDEX

# 通用描述

CREATE INDEX用于在指定的表上创建一个索引对象。在YashanDB中可创建多种类型的索引,例如:

由于LSC表无索引特性,本语句只适用于HEAP/TAC表。

# 语句定义

create index::=

syntax
CREATE UNIQUE COLUMNAR INDEX schema . index_name ON table_name ( index_expr DESC ASC , index_expr DESC ASC ) index_attr_clause

index_expr::=

syntax
column_name column_expression

index_attr_clause::=

syntax
TABLESPACE tablespace_name DEFAULT INITRANS integer PCTFREE integer storage_clause VISIBLE INVISIBLE USABLE UNUSABLE local_index_clause ONLINE NOPARALLEL PARALLEL integer NOCOMPRESS COMPRESS integer LOGGING NOLOGGING NOREVERSE REVERSE readonly_clause inmemory_clause

storage_clause定义

local_index_clause::=

syntax
LOCAL hash_partition_clause none_hash_partition_clause

readonly_clause::=

syntax
READONLY READWRITE

inmemory_clause::=

syntax
INMEMORY NO INMEMORY

index_hash_partition_clause::=

syntax
STORE IN ( tablespace_name , )

index_partition_clause::=

syntax
( PARTITION partition_name index_partition_attr_clause , )

index_partition_attr_clause::=

syntax
TABLESPACE tablespace_name DEFAULT INITRANS integer PCTFREE integer USABLE UNUSABLE

# unique

该语句用于指定创建的索引为唯一索引,即索引列字段上的数值唯一。如表中该列字段上的值存在重复,则创建唯一索引失败。

示例

--在表orders_info中的id列创建唯一索引idx_orders_info_1
CREATE UNIQUE INDEX idx_orders_info_1 ON orders_info (id);

# columnar

该语句用于指定创建的索引为列式索引,即索引的数据内容采用列存方式存储,索引本身无序。

列式索引存在如下限制:

  • 列式索引不支持创建函数索引及反向索引。
  • 不支持在线(Online)创建列式索引。
  • 只允许行表创建列式索引。
  • 共享集群部署下不支持列式索引。

示例

--在表orders_info中的id列创建列式索引colidx_orders_info_1
CREATE COLUMNAR INDEX colidx_orders_info_1 ON orders_info (id);

# index_name

该语句用于指定创建的索引的名称,不可省略,且需符合YashanDB的对象命名规范

# table_name

该语句用于指定要创建索引的表。创建索引的操作过程中会对该表加排他锁,但在指定了ONLINE时,本操作不会阻塞对该表的并发DML事务。

# index_expr

指定索引所基于的列或列表达式,多项组合指定时以,分隔。

所有的索引列或列表达式里不能包含LOB大对象型的列字段。

# column_name

将指定名称的列字段作为索引列。

# column_expression

将指定的表达式作为索引列,含有表达式的索引列的索引称为函数索引。

YashanDB支持以任何通用表达式作为索引列来建立函数索引,但存在如下约束规则:

  • column_expression计算出来的结果须满足系统对索引列的所有约束限制,例如不能为LOB类型,长度不能超过索引键值长度规格等。
  • column_expression中包含内置函数时,该函数必须是一个可以返回确定和不变结果的非聚集函数,例如不能为SYSDATE、USERENV、SUM等函数。
  • column_expression中存在自动填充行为时,不能为非固定自动填充行为的表达式,例如在日期转换时发生自动填充年月的行为,由于系统需使用当前年月这类非固定值填充,导致表达式输出的结果不能确定,所以无法建立函数索引;而对于时分秒系统固定按0填充,或者对于CHAR类型系统固定按空格补位,表达式输出结果确定,则可以建立函数索引。
  • 在创建分区索引时,不能对分区键使用函数表达式。
  • column_expression中不能包含用户自定义函数。

示例

--函数索引可以为任意表达式
CREATE UNIQUE INDEX idx_orders_info_2 ON orders_info (TO_CHAR(id)||order_no);
CREATE INDEX idx_orders_info_3 ON orders_info (CAST(id AS CHAR(14)),order_no);

--字符串向DATE转换时,未指定format将导致系统获取不能保证恒定的默认格式,所以无法返回一个不变的结果
CREATE INDEX idx_orders_info_4 ON orders_info (order_date-TO_DATE('2001-01-01'));
[1:69]YAS-04399 only pure functions can be indexed

# desc|asc

指定索引列的同时指定排序方式,可省略,则系统默认按升序排序。

示例

--指定索引列的升降序
CREATE INDEX idx_orders_info_4 ON orders_info (order_date DESC, TO_NUMBER(order_no) ASC);

# index_attr_clause

该语句用于指定索引的各项属性。

# tablespace

该语句用于指定索引的表空间,省略则默认为当前用户所在的表空间。分布式部署中用户无法为索引指定表空间,使用表所在的表空间作为索引的表空间。

  • tablespace_name:指定到一个存在的表空间。
  • DEFAULT:指定到缺省表空间,即当前用户所在的表空间。

在临时表上创建的索引,其表空间只能为系统默认的temporary表空间,不可指定。

# initrans/pctfree/storage_clause

该语句用于指定索引的存储属性,省略则INITRANS/PCTFREE默认为2/8,其他存储属性请参考通用SQL语法storage描述。

# visible|invisible

该语句用于指定创建的索引是否能被优化器(Optimizer)使用,省略则默认为VISIBLE。

# usable|unusable

该语句用于指定创建的索引是否可用,省略则默认为USABLE。

# online

该语句用于指定创建索引过程中是否允许并发DML操作,省略则默认不允许。分布式部署中不支持执行create index online操作。

# noparallel|parallel

该语句用于设置创建索引的并行度,NOPARALLEL表示不并行。

YashanDB不支持对函数索引指定本语句。

integer

并行度值,该值必须介于1~服务器CPU核数*2之间,可省略,则默认按CPU核数的并行度并发创建索引。

CREATE INDEX idx_orders_info_1 ON orders_info (id) ONLINE PARALLEL 2

# nocompress|compress

该语句用于语法兼容,无实际含义。

# logging|nologging

该语句用于语法兼容,无实际含义。

# noreverse|reverse

该语句用于指定创建的索引是否为反向索引。反向索引在存入数据的时候将索引列字节进行反转,以离散数据,减少叶块争用。省略时默认为NOREVERSE。

示例

CREATE INDEX idx_orders_info_1 ON orders_info (id) REVERSE;

CREATE INDEX idx_orders_info_1 ON orders_info (id) NOREVERSE;

# readonly_clause

语法兼容,无实际含义。

# inmemory_clause

语法兼容,无实际含义。

# local_index_clause

该语句用于创建分区索引(Local Partitioned Index)。只能在分区表上建立分区索引,且索引的分区数量、分区界值必须与表的分区相同。

如LOCAL后面的语句都省略,即按如下规则创建索引分区:

  • 分区数量与表分区数量一致
  • 分区界值与表分区界值一致
  • 表空间与在INDEX上指定的值一致
  • INITRANS/PCTFREE等存储属性与在INDEX上指定的值一致
  • USABLE/UNUSABLE开关设置为USABLE

示例

--创建本地分区索引
CREATE INDEX idx_sales_info_2 ON sales_info (year,month,branch)
TABLESPACE yashan
INITRANS 3
UNUSABLE
LOCAL;

# index_hash_partition_clause

该语句仅被用于指定在哈希分区表上的索引分区的表空间,指定多个表分区用,分隔,且数量需与索引分区的数量一致。

示例

--指定hash分区索引的分区表空间
CREATE INDEX idx_sales_info_hash_1 ON sales_info_hash (year,month,branch)
TABLESPACE yashan
INITRANS 3
UNUSABLE
LOCAL STORE IN (yashan,yashan1);

# index_partition_clause

指定索引分区的名称和其他属性,同时指定多个分区用,分隔,且数量需与索引分区的数量一致。

# partition_name

指定索引分区的名称,省略则由系统生成的默认名称。

# index_partition_attr_clause

指定索引分区的如下属性:

  • 表空间:省略则默认为在INDEX上指定的表空间。其中DEFAULT值等于在INDEX上指定的表空间名称。
  • INITRANS/PCTFREE:省略则默认为在INDEX上指定的存储属性值。
  • USABLE/UNUSABLE:省略则为USABLE。

示例

--指定索引分区属性
CREATE INDEX idx_sales_info_range_1 ON sales_info_range (year,month,branch)
TABLESPACE yashan
INITRANS 3
UNUSABLE
LOCAL (PARTITION p1 TABLESPACE DEFAULT INITRANS 2,PARTITION p2,PARTITION p3);