华为云云数据库GaussDBCREATE GLOBAL INDEX_云淘科技
功能描述
在指定的表上创建全局二级索引(Global Secondary Index,简称GSI)。
全局二级索引允许用户定义与基表分布不一致的索引,从而实现基表非分布列查询的单节点计划和基表非分布列上的unique/主键约束。
建议在至少一列GSI的索引键上创建NOT NULL约束,以提速IUD的性能。
建议在GSI的基表创建普通索引提升IUD执行效率。
当前创建GSI生成的执行计划是先将基表数据拉回CN再下发给GSI所在DN,因此大数据量、大规模集群下性能较普通索引存在较大劣化(比如6节点SSD盘千万数据量下可能需近1小时),将在后续版本中优化创建GSI的实现机制,将目前的单点改为DN间并行提升创建效率。
注意事项
只支持GTM-LITE模式下创建GSI,不支持其他GTM模式,在其他模式下创建GSI会报错。
支持创建普通UBTree索引,不支持局部索引、表达式索引;Astore不支持创建GSI以外的UBTree,不支持对GSI创建分区。
不支持创建与基表分布一致的GSI,执行时会报错。
不支持create GSI concurrently,会报语法错误;不支持parallel,数据节点侧会将parallel_workers设为0。
支持对基表为hash分布的行存Astore表、分区表创建hash分布的GSI,不支持基表为replicate、bucket、段页式、list/range分布、Ustore、列存等,对于GSI本身不支持hash分布以外的分布。
不支持对基表列名或者ctid、xc_node_hash、xmin、xmax、tableoid(当基表为分区表时)增加_new$$、_NEW$$后与自身列名重复的基表创建GSI。
如果在执行VACUUM FULL或者REINDEX DATABASE后,查询语句走GSI会报错,需要再执行一次查询或者执行REINDEX INDEX重建索引。
语法格式
CREATE GLOBAL [ UNIQUE ] INDEX [ [schema_name.]index_name ] ON table_name [ USING method ] ({ column_name [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [CONTAINING (containing_colname)] [DISTRIBUTE BY hash(dist_colnames)] [ TABLESPACE tablespace_name ];
参数说明
UNIQUE
创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将报错。
schema_name
模式的名称。
取值范围:已存在模式名。
index_name
要创建的索引名,不能包含模式名,索引的模式与表相同。
取值范围:字符串,要符合标识符命名规范。
table_name
需要为其创建索引的表的名称,可以用模式修饰。
取值范围:已存在的表名。
USING method
指定创建索引的方法。
取值范围:ubtree,提供多版本B-tree索引,索引页面上包含事务信息。
column_name
表中需要创建索引的列的名称(字段名)。
如果索引方式支持多字段索引,可以声明多个字段,对于非分区基表最多可以声明28个字段,对于分区基表最多可以声明27个字段。
COLLATE collation
COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。
opclass
操作符类的名称。对于索引的每一列可以指定一个操作符类,操作符类标识了索引那一列的使用的操作符。
ASC
指定按升序排序 (默认)。
DESC
指定按降序排序。
NULLS FIRST
指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。
NULLS LAST
指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。
CONTAINING
全局二级索引可以包含索引键以外的基表属性。
containing_colname
全局二级索引包含的索引键以外的基表属性。
DISTRIBUTE BY
指定全局二级索引分布键,其分布键需要与基表不同,且只能使用哈希分布方式。
dist_colnames
全局二级索引分布键。
需要被包含在column_name 中。
TABLESPACE tablespace_name
指定索引的表空间,如果没有声明则使用默认的表空间。
取值范围:已存在的表空间名。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
--创建包含3列的基表test gaussdb=# CREATE TABLE test(c1 int, c2 int, c3 int); -- 在test表的c2列上创建GSI,并包含c3列,基于c2列哈希分布 gaussdb=# CREATE GLOBAL INDEX idx_gsi_1 ON test(c2) CONTAINING(c3) DISTRIBUTE BY HASH(c2); -- 创建包含3列的基表test2 gaussdb=# CREATE TABLE test2(c1 int, c2 int, c3 int); -- 在test2表的c2列上创建GSI,并包含c3列,默认基于c2列哈希分布 gaussdb=# CREATE GLOBAL INDEX idx_gsi_2 ON test2(c2) CONTAINING(c3) ; -- 创建包含3列的基表test3 gaussdb=# CREATE TABLE test3(c1 int, c2 int, c3 int); -- 在test3表的c2列上创建UNIQUE形式的GSI,默认基于c2列哈希分布 gaussdb=# CREATE GLOBAL UNIQUE INDEX idx_gsi_3 ON test3(c2) DISTRIBUTE BY HASH(c2); |
父主题: SQL语法
同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家