华为云云数据库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)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家