#ALTER INDEX

# 通用描述

ALTER INDEX用于修改索引的相关信息。

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

一个SQL命令行可以指定多项修改操作,以,分开;但对于存在分区索引的表,该表上的索引操作需单项执行,即不能放在同一个命令行中,且对于分区索引,其修改操作必须按指定分区进行,而不能针对整体索引操作。

分布式部署中用户无法执行本语句。

# 语句定义

alter index::=

syntax
ALTER INDEX schema . index_name INITRANS integer VISIBLE INVISIBLE UNUSABLE COALESCE NOPARALLEL PARALLEL integer modify_partition rebuild_clause RENAME TO new_name

modify_partition::=

syntax
MODIFY PARTITION partition_name INITRANS integer UNUSABLE COALESCE

rebuild_clause::=

syntax
REBUILD PARTITION partition_name TABLESPACE tablespace_name INITRANS integer PCTFREE integer ONLINE NOCOMPRESS COMPRESS integer LOGGING NOLOGGING NOREVERSE REVERSE NOPARALLEL PARALLEL integer

# initrans

该语句用于修改索引的数据块(Data Block)里事务(Transaction)表的初始大小设置,修改成功后该索引后续增加的数据块将按照此值设置事务表初始大小。

示例

ALTER INDEX idx_sales_info_1 INITRANS 4;

# visible|invisible

该语句用于设置索引对优化器(Optimizer)是否可见,即在执行SQL查询时优化器是否会考虑使用该索引。

示例

ALTER INDEX idx_sales_info_1 INVISIBLE;
 
ALTER INDEX idx_sales_info_1 VISIBLE;

# unusable

该语句用于设置索引为不可用状态,之后对表操作不会触发该索引更新,因此如需要恢复该索引可用,则必须进行索引重建(Rebuild)。

示例

ALTER INDEX idx_sales_info_1 UNUSABLE;

# coalesce

该语句用于重组索引。

对于BTREE结构的索引,当索引(尤其是单调递增索引)使用一段时间后,整个BTREE上可能会出现大量的空页和稀疏页,造成空间浪费,为解决这一问题,YashanDB提供索引coalesce功能,包括对空页的回收及稀疏页的合并,但此功能并不会使BTREE变低。

重组操作会对索引产生结构性变更,且会对索引基表加表级共享锁,因此建议在没有业务或者业务量很低的时候执行本操作。

示例

ALTER INDEX idx_sales_info_1 COALESCE;

# noparallel|parallel

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

# nocompress|compress

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

# logging|nologging

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

# modify_partition

该语句用于对索引的分区进行INITRANS/UNUSABLE/COALESCE等修改操作,对于分区索引,必须通过本语句进行指定的分区索引修改。

示例

--在orders_info表上创建分区索引
CREATE INDEX idx_orders_info_1 ON orders_info(id) LOCAL;

--通过系统视图查看分区索引信息
SELECT index_name,partition_name,status
FROM USER_IND_PARTITIONS
WHERE index_name='IDX_ORDERS_INFO_1';
INDEX_NAME                    PARTITION_NAME        STATUS    
----------------------------- --------------------- --------- 
IDX_ORDERS_INFO_1             SYS_P66               USABLE   
IDX_ORDERS_INFO_1             SYS_P65               USABLE   
IDX_ORDERS_INFO_1             SYS_P64               USABLE   

--对指定分区索引进行修改
ALTER INDEX idx_orders_info_1 MODIFY PARTITION sys_p66 UNUSABLE;
ALTER INDEX idx_orders_info_1 MODIFY PARTITION sys_p66 COALESCE;

# rebuild_clause

该语句用于对索引或者索引分区进行重建操作。

当索引使用了一段时间后,可能存在空间膨胀或占用空间过多的问题,此时可以通过rebuild功能进行重建,生成新的紧凑的BTREE。此外,通过指定tablespace参数,该语句也可以实现索引表空间搬迁的功能。

对于被设置UNUSABLE的索引,重建后该索引将恢复为有效状态。

对于分区索引的REBUILD操作,需在每个分区上单独执行,而不可以整体执行。

本操作过程中将会在索引基表上加排他锁,但在指定了ONLINE时,本操作不会阻塞并发的DML操作。

分布式部署中不能指定关键字ONLINE。

# tablespace

重建索引或索引分区到指定的表空间。

# initrans

为重建的索引或索引分区指定INITRANS值。

# pctfree

为重建的索引或索引分区指定PCTFREE值。

# noparallel|parallel

设置重建索引的并行度,NOPARALLEL表示不并行。

integer

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

示例

ALTER INDEX idx_sales_info_1 REBUILD PARALLEL 2;

# online

该语句用于指定重建索引过程中是否允许并发DML操作,省略则默认不允许。

示例

ALTER INDEX idx_sales_info_1 REBUILD TABLESPACE yashan INITRANS 3 PCTFREE 10 ONLINE;

ALTER INDEX idx_orders_info_1 REBUILD PARTITION sys_p66;

# noreverse|reverse

重建索引为反向或非反向。

示例

ALTER INDEX idx_sales_info_1 REBUILD REVERSE;

ALTER INDEX idx_sales_info_1 REBUILD NOREVERSE;

# rename to new_name

修改索引的名称。

修改索引名称时,指定的新名称不能为空且必须符合YashanDB的对象命名规范

示例(单机HEAP表、TAC表)

ALTER INDEX idx_sales_info_1 RENAME TO idx_sales_info_2;