ALTER INDEX — 更改一个索引的定义
ALTER INDEX [ IF EXISTS ]name
RENAME TO [schema_name.]new_name
ALTER INDEX [ IF EXISTS ]name
SET TABLESPACEtablespace_name
ALTER INDEXname
ATTACH PARTITIONindex_name
ALTER INDEXname
[ NO ] DEPENDS ON EXTENSIONextension_name
ALTER INDEX [ IF EXISTS ]name
SET (storage_parameter
[=value
] [, ... ] ) ALTER INDEX [ IF EXISTS ]name
RESET (storage_parameter
[, ... ] ) ALTER INDEX [ IF EXISTS ]name
ALTER [ COLUMN ]column_number
SET STATISTICSinteger
ALTER INDEX ALL IN TABLESPACEname
[ OWNED BYrole_name
[, ... ] ] SET TABLESPACEnew_tablespace
[ NOWAIT ] ALTER INDEX [ IF EXISTS ]index_name
REBUILD
ALTER INDEX
更改一个现有索引的定义。下面描述了几种子窗体。
注意每个子窗体所需的锁级别可能不同。除非显式说明,ACCESS EXCLUSIVE
锁被持有。
列出多个子命令时,锁的持有将是任何子命令所需的最严格的子命令。
ALTER INDEX index_name REBUILD
类似于 REINDEX index name
,此语法特性自LightDB 23.2起包含,以实现与Oracle的兼容性。
RENAME
RENAME
形式更改该索引的名称。如果索引与一个表约束(UNIQUE
、PRIMARY KEY
或者EXCLUDE
)关联,该约束也会被重命名。这对已存储的数据没有影响。
重命名索引取得一个 SHARE UPDATE EXCLUSIVE
锁。
SET TABLESPACE
这种形式更改该索引的表空间为指定的表空间,并且把与该索引相关联的数据文件
移动到新的表空间中。要更改一个索引的表空间,你必须拥有该索引并且具有新表
空间上的CREATE
特权。可以使用
ALL IN TABLESPACE
形式把当前数据库中在一个表空间内的
所有索引全部移动到另一个表空间中,这将会锁定所有要被移动的索引然后挨个移
动它们。这种形式也支持OWNED BY
,即只移动属于指定角色
的索引。如果指定了NOWAIT
选项,那么当该命令无法立刻获
得所有锁时将会失败。注意这个命令不会移动系统目录,如果想要移动系统目录,
应使用ALTER DATABASE
或者显式的
ALTER INDEX
调用。另见
CREATE TABLESPACE
。
ATTACH PARTITION
导致提到的索引变成附着于被修改的索引。提及的索引必须在包含被修改索引的表的一个分区上,并且具有一种等效的定义。一个附着索引不能被单独删除,它会在其父索引被删除时自动连带删除。
DEPENDS ON EXTENSION extension_name
NO DEPENDS ON EXTENSION extension_name
这种形式将索引标记为依赖于扩展,或者如果指定了 NO
,则不再依赖于该扩展名。标记为依赖于扩展名的索引会在删除扩展名时自动删除。
SET ( storage_parameter
[= value
] [, ... ] )
这种形式为该索引更改一个或者多个索引方法相关的存储参数。可用的参数详见
CREATE INDEX
。注意这个命令不会立刻修改索引内容,
根据参数你可能需要用REINDEX
重建索引来得到想要的
效果。
RESET ( storage_parameter
[, ... ] )
这种形式把一个或者多个索引方法相关的存储参数重置为其默认值。正如
SET
一样,可能需要一次REINDEX
来完全更新
该索引。
ALTER [ COLUMN ] column_number
SET STATISTICS integer
这种形式为后续的ANALYZE
操作设置针对每个列的统计信息收集目标,不过只能用在被定义为表达式的索引列上。由于表达式缺少唯一的名称,我们通过该索引列的顺序号来引用它们。收集目标可以被设置为范围0到10000之间的值。另外,把它设置为-1会恢复到使用系统的默认统计信息目标(default_statistics_target)。更多有关LightDB查询优化器使用统计信息的内容,请参考Section 15.2。
REBUILD
REBUILD
使用索引表中存储的数据重建索引。
IF EXISTS
如果该索引不存在不要抛出错误。这种情况下将发出一个提示。
column_number
引用该索引列的顺序(从左往右)位置的顺序号。
name
要更改的一个现有索引的名称(可能被模式限定)。
new_name
该索引的新名称。
schema_name
为了兼容Oracle数据库语法,ALTER INDEX RENAME TO
语句支持为新的索引名称指定schema_name
。这个功能仅是语法糖。
tablespace_name
该索引将被移动到的表空间。
extension_name
该索引所依赖的扩展的名称。
storage_parameter
一个索引方法相关的存储参数的名称。
value
一个索引方法相关的存储参数的新值。根据该参数,这可能是一个数字或者一个 词。
index_name
重建索引的名字。
也可以用ALTER TABLE
来做这些操作。实际上,
ALTER INDEX
只是ALTER TABLE
应用在索引
上的形式的别名而已。
以前有一种ALTER INDEX OWNER
变体,但现在已被忽略(会出现
一个警告)。一个索引的拥有者不能与其基表的拥有者不同。更改基表的拥有者
会自动地更改索引的拥有者。
不允许更改系统目录索引的任何部分。
要重命名一个现有索引:
ALTER INDEX distributors RENAME TO suppliers;
把一个索引移动到一个不同的表空间:
ALTER INDEX distributors SET TABLESPACE fasttablespace;
更改一个索引的填充因子(假设该索引方法支持填充因子):
ALTER INDEX distributors SET (fillfactor = 75); REINDEX INDEX distributors;
为一个表达式索引设置统计信息收集目标:
CREATE INDEX coord_idx ON measured (x, y, (z + t)); ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;
在重命名索引时使用schema_name前缀。
create table t1(id int); create index hahaha.index_t1_id on t1(id); alter index index_t1_id rename to xxww.index_t1_id_1;
重建索引:
create table t1(id int); create index idx_t1_id on t1(id); ALTER INDEX idx_t1_id REBUILD;
ALTER INDEX
是一种
LightDB扩展。