返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

相关命令
gs_dumpall,gs_restore

功能描述
创建分区表。
分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,
这张
逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实
际是存储在分区上的。
常见的分区方案有范围分区(Range Partitioning)
、间隔分区(Interval Partitioning)
、哈
希分区(Hash Partitioning)
、列表分区(List Partitioning)等。目前行存表支持范围分区、间
隔分区、哈希分区、列表分区,列存表仅支持范围分区。
范围分区是根据表的一列或者多列,
将要插入表的记录分为若干个范围,
这些范围在不
同的分区里没有重叠。为每个范围创建一个分区,用来存储相应的数据。

范围分区的分区策略是指记录插入分区的方式。目前范围分区仅支持范围分区策略。
范围分区策略:
根据分区键值将记录映射到已创建的某个分区上,
如果可以映射到已创
建的某一分区上,则把记录插入到对应的分区上,
否则给出报错和提示信息。
这是最常
用的分区策略。

间隔分区是一种特殊的范围分区,相比范围分区,
新增间隔值定义,
当插入记录找不到
匹配的分区时,可以根据间隔值自动创建分区。间隔分区只支持基于表的一列分区,并
且该列只支持TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH
TIME ZONE]、DATE 数据类型。
间隔分区策略:
根据分区键值将记录映射到已创建的某个分区上,
如果可以映射到已创
建的某一分区上,
则把记录插入到对应的分区上,
否则根据分区键值和表定义信息自动
创建一个分区,然后将记录插入新分区中,新创建的分区数据范围等于间隔值。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1005

哈希分区是根据表的一列,
为每个分区指定模数和余数,
将要插入表的记录划分到对应
的分区中,
每个分区所持有的行都需要满足条件:
分区键的值除以为其指定的模数将产
生为其指定的余数。
哈希分区策略:
根据分区键值将记录映射到已创建的某个分区上,
如果可以映射到已创
建的某一分区上,则把记录插入到对应的分区上,否则返回报错和提示信息。

列表分区是根据表的一列,
将要插入表的记录通过每一个分区中出现的键值划分到对应
的分区中,这些键值在不同的分区里没有重叠。为每组键值创建一个分区,用来存储相
应的数据。
列表分区策略:
根据分区键值将记录映射到已创建的某个分区上,
如果可以映射到已创
建的某一分区上,则把记录插入到对应的分区上,否则给出报错和提示信息。
分区可以提供若干好处:

某些类型的查询性能可以得到极大提升。
特别是表中访问率较高的行位于一个单独分区
或少数几个分区上的情况下。分区可以减少数据的搜索空间,提高数据访问效率。

当查询或更新一个分区的大部分记录时,
连续扫描那个分区而不是访问整个表可以获得
巨大的性能提升。

如果需要大量加载或者删除的记录位于单独的分区上,
则可以通过直接读取或删除那个
分区以获得巨大的性能提升,同时还可以避免由于大量DELETE 导致的VACUUM 超
载(仅范围分区)

注意事项

唯一约束和主键约束的约束键包含所有分区键将为约束创建LOCAL 索引,否则创建
GLOBAL 索引。

目前哈希分区和列表分区仅支持单列构建分区键,暂不支持多列构建分区键。

只需要有间隔分区表的INSERT 权限,往该表INSERT 数据时就可以自动创建分区。

对于分区表PARTITION FOR (values)语法,values 只能是常量。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1006

对于分区表PARTITION FOR (values)语法,values 在需要数据类型转换时,建议使用强
制类型转换,以防隐式类型转换结果与预期不符。

分区数最大值为1048575 个,
一般情况下业务不可能创建这么多分区,
这样会导致内存
不足。应参照参数local_syscache_threshold 的值合理创建分区,分区表使用内存大致为
(分区数* 3 / 1024)MB。理论上分区占用内存不允许大于local_syscache_threshold 的
值,同时还需要预留部分空间以供其他功能使用。

指定分区语句目前不能走全局索引扫描。
语法格式
CREATE TABLE [ IF NOT EXISTS ] partition_table_name
( [
{ column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option [...] ] }
[, ... ]
] )
[ WITH ( {storage_parameter = value} [, ... ] ) ]
[ COMPRESS | NOCOMPRESS ]
[ TABLESPACE tablespace_name ]
[ DISTRIBUTE BY { REPLICATION | { [ HASH ] ( column_name ) } } ]
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]
PARTITION BY {
{VALUES (partition_key)} |
{RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN
( tablespace_name [, ...] ) ] ] ( part
ition_less_than_item [, ... ] )} |
{RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN
( tablespace_name [, ...] ) ] ] ( part
ition_start_end_item [, ... ] )} |
{LIST | HASH (partition_key) (PARTITION partition_name [ VALUES
(list_values_clause) ] opt_table_spac
e ) }
NOTICE: LIST/HASH partition is only avaliable in CENTRALIZED mode!
} [ { ENABLE | DISABLE } ROW MOVEMENT ];
列约束column_constraint:
[ CONSTRAINT constraint_name ]

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1007
{ NOT NULL |
NULL |
CHECK ( expression ) |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED |
UNIQUE index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH
SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
表约束table_constraint:
[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) |
UNIQUE ( column_name [, ... ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] ) index_parameters |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn
[, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE
action ] }
[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
like 选项like_option:
{ INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE
| COMMENTS | RELOPTIONS |
DISTRIBUTION | ALL }
索引存储参数index_parameters:
[ WITH ( {storage_parameter = value} [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]
partition_less_than_item:
PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } )
[TABLESPACE tablespace_name]
partition_start_end_item:
PARTITION partition_name {
{START(partition_value) END (partition_value) EVERY (interval_value)} |
{START(partition_value) END ({partition_value | MAXVALUE})} |

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1008
{START(partition_value)} |
{END({partition_value | MAXVALUE})}
} [TABLESPACE tablespace_name]
参数说明

IF NOT EXISTS
如果已经存在相同名称的表,不会抛出一个错误,
而会发出一个通知,告知表关系已存
在。

partition_table_name
分区表的名称。
取值范围:字符串,要符合标识符的命名规范。

column_name
新表中要创建的字段名。
取值范围:字符串,要符合标识符的命名规范。

data_type
字段的数据类型。

COLLATE collation
COLLATE 子句指定列的排序规则(该列必须是可排列的数据类型)
。如果没有指定,
则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation
系统表中查询,默认的排序规则为查询结果中以default 开始的行。

CONSTRAINT constraint_name
列约束或表约束的名称。
可选的约束子句用于声明约束,
新行或者更新的行必须满足这
些约束才能成功插入或更新。
定义约束有两种方法:
列约束:作为一个列定义的一部分,仅影响该列。
表约束:不和某个列绑在一起,可以作用于多个列。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1009

LIKE source_table [ like_option … ]
LIKE 子句声明一个表,新表自动从这个表里面继承所有字段名及其数据类型和非空约
束。
和INHERITS 不同,
新表与原来的表之间在创建动作完毕之后是完全无关的。
在源表做
的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。

字段缺省表达式只有在声明了INCLUDING DEFAULTS 之后才会包含进来。缺省
是不包含缺省表达式的,即新表中所有字段的缺省值都是NULL。

如果指定了INCLUDING GENERATED,则源表列的生成表达式会复制到新表中。
默认不复制生成表达式。

非空约束将总是复制到新表中,CHECK 约束则仅在指定了INCLUDING
CONSTRAINTS 的时候才复制,而其他类型的约束则永远也不会被复制。此规则
同时适用于表约束和列约束。

和INHERITS 不同,
被复制的列和约束并不使用相同的名称进行融合。
如果明确的
指定了相同的名称或者在另外一个LIKE 子句中,将会报错。

如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不
建立索引。

如果指定了INCLUDING STORAGE,则拷贝列的STORAGE 设置也将被拷贝,默
认情况下不包含STORAGE 设置。

如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释也会被拷贝
过来。默认情况下,不拷贝源表的注释。

如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH 子
句)也将拷贝至新表。默认情况下,不拷贝源表的存储参数。

INCLUDING ALL 包含了INCLUDING DEFAULTS、
INCLUDING CONSTRAINTS、
INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、
INCLUDING PARTITION 和INCLUDING RELOPTIONS 的内容。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1010

WITH ( storage_parameter [= value] [, … ] )
这个子句为表或索引指定一个可选的存储参数。参数的详细描述如下所示:

FILLFACTOR
一个表的填充因子(fillfactor)是一个介于10 和100 之间的百分数。100(完全填充)
是默认值。如果指定了较小的填充因子,INSERT 操作仅按照填充因子指定的百分率填充表
页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE 有机会在同一页上放
置同一条记录的新版本,
这比把新版本放置在其他页上更有效。
对于一个从不更新的表将填
充因子设为100 是最佳选择,但是对于频繁更新的表,
选择较小的填充因子则更加合适。该
参数对于列存表没有意义。
取值范围:10~100

ORIENTATION
决定了表的数据的存储方式。
取值范围:
COLUMN:表的数据将以列式存储。
ROW(缺省值)
:表的数据将以行式存储。
须知:orientation 不支持修改。

STORAGE_TYPE
指定存储引擎类型,该参数设置成功后就不再支持修改。
取值范围:
USTORE,表示表支持Inplace-Update 存储引擎。特别需要注意,使用USTORE 表,必
须要开启track_counts 和track_activities 参数,否则会引起空间膨胀。
ASTORE,表示表支持Append-Only 存储引擎。
默认值:

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1011
不指定表时,默认是Append-Only 存储。

COMPRESSION
列存表的有效值为LOW/MIDDLE/HIGH/YES/NO,
压缩级别依次升高,
默认值为LOW。
行存表不支持压缩。

MAX_BATCHROW
指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。
该参数只对列存表有
效。
取值范围:10000~60000,默认60000。

PARTIAL_CLUSTER_ROWS
指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。
取值范围:
大于等于MAX_BATCHROW,
建议取值为MAX_BATCHROW 的整数倍数。

DELTAROW_THRESHOLD
预留参数。该参数只对列存表有效。
取值范围:0~9999

segment
使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog 表。不
支持ustore 存储引擎。
取值范围:on/off
默认值:off

COMPRESS / NOCOMPRESS
创建一个新表时,需要在创建表语句中指定关键字COMPRESS,这样,当对该表进行
批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,
生成字典、压缩元
组数据并进行存储。指定关键字NOCOMPRESS 则不对表进行压缩。行存表不支持压缩。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1012
缺省值为NOCOMPRESS,即不对元组数据进行压缩。

TABLESPACE tablespace_name
指定新表将要在tablespace_name 表空间内创建。如果没有声明,将使用默认表空间。

PARTITION BY RANGE(partition_key)
创建范围分区。partition_key 为分区键的名称。
(1)对于从句是VALUES LESS THAN 的语法格式:
须知:对于从句是VALUE LESS THAN 的语法格式,
范围分区策略的分区键最
多支持4 列。
该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、
NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、
CHARACTER(n)、
CHAR(n)、
CHARACTER、
CHAR、
TEXT、
NVARCHAR、
NVARCHAR2、
NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME
ZONE]、DATE。
(2)对于从句是START END 的语法格式:
须知:对于从句是START END 的语法格式,范围分区策略的分区键仅支持1
列。
该情形下,分区键支持的数据类型为:SMALLINT、INTEGER、BIGINT、DECIMAL、
NUMERIC、REAL、DOUBLE PRECISION、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、
TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。
(3)对于指定了INTERVAL 子句的语法格式:
须知:对于指定了INTERVAL 子句的语法格式,范围分区策略的分区键仅支持
1 列。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1013
该情形下,分区键支持的数据类型为:TIMESTAMP[(p)] [WITHOUT TIME ZONE]、
TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。

PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } )
指定各分区的信息。partition_name 为范围分区的名称。partition_value 为范围分区的上
边界,取值依赖于partition_key 的类型。MAXVALUE 表示分区的上边界,它通常用于设置
最后一个范围分区的上边界。
须知:
每个分区都需要指定一个上边界。
分区上边界的类型应当和分区键的类型一致。
分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。

**PARTITION partition_name {START (partition_value) END (partition_value) EVERY
(interval_value)} | **{START (partition_value) END (partition_value|MAXVALUE)} |
{START(partition_value)} | {END (partition_value | MAXVALUE)}
指定各分区的信息,各参数意义如下:
partition_name:
范围分区的名称或名称前缀,
除以下情形外
(假定其中的partition_name
是p1)
,均为分区的名称。

若该定义是START+END+EVERY 从句,则语义上定义的分区的名称依次为p1_1,
p1_2, …。例如对于定义“PARTITION p1 START(1) END(4) EVERY(1)”,则生成的
分区是:[1, 2), [2, 3) 和[3, 4),名称依次为p1_1, p1_2 和p1_3,即此处的p1 是名
称前缀。

若该定义是第一个分区定义,
且该定义有START 值,
则范围
(MINVALUE, START)
将自动作为第一个实际分区,其名称为p1_0,然后该定义语义描述的分区名称依
次为p1_1, p1_2, …。例如对于完整定义“PARTITION p1 START(1), PARTITION p2
START(2)”,则生成的分区是:(MINVALUE, 1), [1, 2) 和[2, MAXVALUE),其名

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1014
称依次为p1_0, p1_1 和p2,
即此处p1 是名称前缀,
p2 是分区名称。
这里MINVALUE
表示最小值。
partition_value:范围分区的端点值(起始或终点)
,取值依赖于partition_key 的类型,
不可是MAXVALUE。
interval_value:对[START,END) 表示的范围进行切分,interval_value 是指定切分后每
个分区的宽度,不可是MAXVALUE;如果(END-START)值不能整除以EVERY 值,则仅
最后一个分区的宽度小于EVERY 值。
MAXVALUE:表示最大值,它通常用于设置最后一个范围分区的上边界。
须知:
1. 在创建分区表若第一个分区定义含START 值,则范围(MINVALUE,START)将自
动作为实际的第一个分区。
2.
START END 语法需要遵循以下限制:- 每个partition_start_end_item 中的START
值(如果有的话,下同)必须小于其END 值。

相邻的两个partition_start_end_item,第一个的END 值必须等于第二个的START
值;

每个partition_start_end_item 中的EVERY 值必须是正向递增的,且必须小于
(END-START)值;

每个分区包含起始值,不包含终点值,即形如:[起始值,终点值),起始值是
MINVALUE 时则不包含;

一个partition_start_end_item 创建的每个分区所属的TABLESPACE 一样;

partition_name 作为分区名称前缀时,其长度不要超过57 字节,超过时自动截断;

在创建、修改分区表时请注意分区表的分区总数不可超过最大限制(1048575)

3. 在创建分区表时START END 与LESS THAN 语法不可混合使用。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1015
4. 即使创建分区表时使用START END 语法,备份(gs_dump)出的SQL 语句也是
VALUES LESS THAN 语法格式。

INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, … ] ) ]
间隔分区定义信息。
interval_expr:自动创建分区的间隔,例如:1 day、1 month。
STORE IN (tablespace_name [, … ] ):指定存放自动创建分区的表空间列表,如果有指
定,则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。
须知:列存表不支持间隔分区。

PARTITION BY LIST(partition_key)
创建列表分区。partition_key 为分区键的名称。
对于partition_key,列表分区策略的分区键仅支持1 列。
对于从句是VALUES (list_values_clause)的语法格式,
list_values_clause 中包含了对应分
区存在的键值,推荐每个分区的键值数量不超过64 个。
分区键支持的数据类型为:INT1、INT2、INT4、INT8、NUMERIC、VARCHAR(n)、
CHAR、
BPCHAR、
NVARCHAR、
NVARCHAR2、
TIMESTAMP[(p)] [WITHOUT TIME ZONE]、
TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575 个。

PARTITION BY HASH(partition_key)
创建哈希分区。partition_key 为分区键的名称。
对于partition_key,哈希分区策略的分区键仅支持1 列。
分区键支持的数据类型为:INT1、INT2、INT4、INT8、NUMERIC、VARCHAR(n)、
CHAR、
BPCHAR、
TEXT、
NVARCHAR、
NVARCHAR2、
TIMESTAMP[(p)] [WITHOUT TIME
ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。分区个数不能超过1048575 个。

{ ENABLE | DISABLE } ROW MOVEMENT

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1016
行迁移开关。
如果进行UPDATE 操作时,更新了元组在分区键上的值,造成了该元组所在分区发生
变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。
取值范围:
ENABLE(缺省值)
:行迁移开关打开。
DISABLE:行迁移开关关闭。
须知:列表/哈希分区表暂不支持ROW MOVEMENT。

NOT NULL
字段值不允许为NULL。ENABLE 用于语法兼容,可省略。

NULL
字段值允许NULL ,这是缺省。
这个子句只是为和非标准SQL 数据库兼容。不建议使用。

CHECK (condition) [ NO INHERIT ]
CHECK 约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表
达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。
声明为字段约束的检查约束应该只引用该字段的数值,
而在表约束里出现的表达式可以
引用多个字段。
用NO INHERIT 标记的约束将不会传递到子表中去。
ENABLE 用于语法兼容,可省略。

DEFAULT default_expr
DEFAULT 子句给字段指定缺省值。
该数值可以是任何不含变量的表达式(不允许使用子
查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1017
缺省表达式将被用于任何未声明该字段数值的插入操作。
如果没有指定缺省值则缺省值
为NULL 。

GENERATED ALWAYS AS ( generation_expr ) STORED
该子句将字段创建为生成列,
生成列的值在写入
(插入或更新)
数据时由generation_expr
计算得到,STORED 表示像普通列一样存储生成列的值。
说明:- 生成表达式不能以任何方式引用当前行以外的其他数据。生成表达式不
能引用其他生成列,不能引用系统列。生成表达式不能返回结果集,不能使用子查询,不能
使用聚集函数,不能使用窗口函数。生成表达式调用的函数只能是不可变(IMMUTABLE)
函数。
不能为生成列指定默认值。
生成列不能作为分区键的一部分。
生成列不能和ON UPDATE 约束字句的CASCADE,SET NULL,SET DEFAULT 动作同时
指定。生成列不能和ON DELETE 约束字句的SET NULL、SET DEFAULT 动作同时指定。
修改和删除生成列的方法和普通列相同。
删除生成列依赖的普通列,
生成列被自动删除。
不能改变生成列所依赖的列的类型。
生成列不能被直接写入。
在INSERT 或UPDATE 命令中, 不能为生成列指定值, 但是可
以指定关键字DEFAULT。
生成列的权限控制和普通列一样。
列存表、内存表MOT 不支持生成列。外表中仅postgres_fdw 支持生成列。

UNIQUE index_parameters
UNIQUE ( column_name [, … ] ) index_parameters
UNIQUE 约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。
对于唯一约束,NULL 被认为是互不相等的。

PRIMARY KEY index_parameters

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1018
PRIMARY KEY ( column_name [, … ] ) index_parameters
主键约束声明表中的一个或者多个字段只能包含唯一的非NULL 值。
一个表只能声明一个主键。

DEFERRABLE | NOT DEFERRABLE
这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检
查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS 命令检查。缺省是NOT
DEFERRABLE。目前,UNIQUE 约束、主键约束、外键约束可以接受这个子句。所有其他
约束类型都是不可推迟的。

INITIALLY IMMEDIATE | INITIALLY DEFERRED
如果约束是可推迟的,则这个子句声明检查约束的缺省时间。
如果约束是INITIALLY IMMEDIATE(缺省)
,则在每条语句执行之后就立即检查它;
如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。
约束检查的时间可以用SET CONSTRAINTS 命令修改。

USING INDEX TABLESPACE tablespace_name
为UNIQUE 或PRIMARY KEY 约束相关的索引声明一个表空间。如果没有提供这个子
句,这个索引将在default_tablespace 中创建,如果default_tablespace 为空,将使用数据库的
缺省表空间。
示例
示例1:创建范围分区表tpcds.web_returns_p1,含有8 个分区,分区键为integer 类型。
分区的范围分别为:wr_returned_date_sk< 2450815、2450815<= wr_returned_date_sk<
2451179、2451179<=wr_returned_date_sk< 2451544、2451544 <= wr_returned_date_sk<
2451910、2451910 <= wr_returned_date_sk< 2452275、2452275 <= wr_returned_date_sk<
2452640、2452640 <= wr_returned_date_sk< 2453005、wr_returned_date_sk>=2453005。
--创建表tpcds.web_returns。
gbase=#CREATE TABLE tpcds.web_returns

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1019
(
W_WAREHOUSE_SK
INTEGER
NOT NULL,
W_WAREHOUSE_ID
CHAR(16)
NOT NULL,
W_WAREHOUSE_NAME
VARCHAR(20)
,
W_WAREHOUSE_SQ_FT
INTEGER
,
W_STREET_NUMBER
CHAR(10)
,
W_STREET_NAME
VARCHAR(60)
,
W_STREET_TYPE
CHAR(15)
,
W_SUITE_NUMBER
CHAR(10)
,
W_CITY
VARCHAR(60)
,
W_COUNTY
VARCHAR(30)
,
W_STATE
CHAR(2)
,
W_ZIP
CHAR(10)
,
W_COUNTRY
VARCHAR(20)
,
W_GMT_OFFSET
DECIMAL(5,2)
);
--创建分区表tpcds.web_returns_p1。
gbase=#CREATE TABLE tpcds.web_returns_p1
(
WR_RETURNED_DATE_SK
INTEGER
,
WR_RETURNED_TIME_SK
INTEGER
,
WR_ITEM_SK
INTEGER
NOT NULL,
WR_REFUNDED_CUSTOMER_SK
INTEGER
,
WR_REFUNDED_CDEMO_SK
INTEGER
,
WR_REFUNDED_HDEMO_SK
INTEGER
,
WR_REFUNDED_ADDR_SK
INTEGER
,
WR_RETURNING_CUSTOMER_SK
INTEGER
,
WR_RETURNING_CDEMO_SK
INTEGER
,
WR_RETURNING_HDEMO_SK
INTEGER
,
WR_RETURNING_ADDR_SK
INTEGER
,
WR_WEB_PAGE_SK
INTEGER
,
WR_REASON_SK
INTEGER
,
WR_ORDER_NUMBER
BIGINT
NOT NULL,
WR_RETURN_QUANTITY
INTEGER
,
WR_RETURN_AMT
DECIMAL(7,2)
,
WR_RETURN_TAX
DECIMAL(7,2)
,
WR_RETURN_AMT_INC_TAX
DECIMAL(7,2)
,
WR_FEE
DECIMAL(7,2)
,
WR_RETURN_SHIP_COST
DECIMAL(7,2)
,
WR_REFUNDED_CASH
DECIMAL(7,2)
,
WR_REVERSED_CHARGE
DECIMAL(7,2)
,

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1020
WR_ACCOUNT_CREDIT
DECIMAL(7,2)
,
WR_NET_LOSS
DECIMAL(7,2)
)
WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
PARTITION BY RANGE(WR_RETURNED_DATE_SK)
(
PARTITION P1 VALUES LESS THAN(2450815),
PARTITION P2 VALUES LESS THAN(2451179),
PARTITION P3 VALUES LESS THAN(2451544),
PARTITION P4 VALUES LESS THAN(2451910),
PARTITION P5 VALUES LESS THAN(2452275),
PARTITION P6 VALUES LESS THAN(2452640),
PARTITION P7 VALUES LESS THAN(2453005),
PARTITION P8 VALUES LESS THAN(MAXVALUE)
);
--从示例数据表导入数据。
gbase=#INSERT INTO tpcds.web_returns_p1 SELECT * FROM tpcds.web_returns;
--删除分区P8。
gbase=#ALTER TABLE tpcds.web_returns_p1 DROP PARTITION P8;
--增加分区WR_RETURNED_DATE_SK 介于2453005 和2453105 之间。
gbase=#ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P8 VALUES LESS THAN
(2453105);
--增加分区WR_RETURNED_DATE_SK 介于2453105 和MAXVALUE 之间。
gbase=#ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P9 VALUES LESS THAN
(MAXVALUE);
--删除分区P8。
gbase=#ALTER TABLE tpcds.web_returns_p1 DROP PARTITION FOR (2453005);
--分区P7 重命名为P10。
gbase=#ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION P7 TO P10;
--分区P6 重命名为P11。
gbase=#ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION FOR (2452639) TO P11;
--查询分区P10 的行数。
gbase=#SELECT count(*) FROM tpcds.web_returns_p1 PARTITION (P10);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1021
count
--------
0
(1 row)
--查询分区P1 的行数。
gbase=#SELECT COUNT(*) FROM tpcds.web_returns_p1 PARTITION FOR (2450815);
count
--------
0
(1 row)
示例2:创建范围分区表tpcds.web_returns_p2,含有8 个分区,分区键类型为integer
类型,其中第8 个分区上边界为MAXVALUE。
八个分区的范围分别为:wr_returned_date_sk< 2450815、2450815<=
wr_returned_date_sk< 2451179、2451179<=wr_returned_date_sk< 2451544、2451544 <=
wr_returned_date_sk< 2451910、2451910 <= wr_returned_date_sk< 2452275、2452275 <=
wr_returned_date_sk< 2452640、2452640 <= wr_returned_date_sk< 2453005、
wr_returned_date_sk>=2453005。
分区表tpcds.web_returns_p2 的表空间为example1;分区P1 到P7 没有声明表空间,使
用采用分区表tpcds.web_returns_p2 的表空间example1;指定分区P8 的表空间为example2。
假定数据库节点的数据目录/pg_location/mount1/path1,数据库节点的数据目录
/pg_location/mount2/path2,数据库节点的数据目录/pg_location/mount3/path3,数据库节点的
数据目录/pg_location/mount4/path4 是dwsadmin 用户拥有读写权限的空目录。
gbase=#CREATE TABLESPACE example1 RELATIVE LOCATION 'tablespace1/tablespace_1';
gbase=#CREATE TABLESPACE example2 RELATIVE LOCATION 'tablespace2/tablespace_2';
gbase=#CREATE TABLESPACE example3 RELATIVE LOCATION 'tablespace3/tablespace_3';
gbase=#CREATE TABLESPACE example4 RELATIVE LOCATION 'tablespace4/tablespace_4';
gbase=#CREATE TABLE tpcds.web_returns_p2
(
WR_RETURNED_DATE_SK
INTEGER
,
WR_RETURNED_TIME_SK
INTEGER
,
WR_ITEM_SK
INTEGER
NOT NULL,
WR_REFUNDED_CUSTOMER_SK
INTEGER
,

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1022
WR_REFUNDED_CDEMO_SK
INTEGER
,
WR_REFUNDED_HDEMO_SK
INTEGER
,
WR_REFUNDED_ADDR_SK
INTEGER
,
WR_RETURNING_CUSTOMER_SK
INTEGER
,
WR_RETURNING_CDEMO_SK
INTEGER
,
WR_RETURNING_HDEMO_SK
INTEGER
,
WR_RETURNING_ADDR_SK
INTEGER
,
WR_WEB_PAGE_SK
INTEGER
,
WR_REASON_SK
INTEGER
,
WR_ORDER_NUMBER
BIGINT
NOT NULL,
WR_RETURN_QUANTITY
INTEGER
,
WR_RETURN_AMT
DECIMAL(7,2)
,
WR_RETURN_TAX
DECIMAL(7,2)
,
WR_RETURN_AMT_INC_TAX
DECIMAL(7,2)
,
WR_FEE
DECIMAL(7,2)
,
WR_RETURN_SHIP_COST
DECIMAL(7,2)
,
WR_REFUNDED_CASH
DECIMAL(7,2)
,
WR_REVERSED_CHARGE
DECIMAL(7,2)
,
WR_ACCOUNT_CREDIT
DECIMAL(7,2)
,
WR_NET_LOSS
DECIMAL(7,2)
)
TABLESPACE example1
PARTITION BY RANGE(WR_RETURNED_DATE_SK)
(
PARTITION P1 VALUES LESS THAN(2450815),
PARTITION P2 VALUES LESS THAN(2451179),
PARTITION P3 VALUES LESS THAN(2451544),
PARTITION P4 VALUES LESS THAN(2451910),
PARTITION P5 VALUES LESS THAN(2452275),
PARTITION P6 VALUES LESS THAN(2452640),
PARTITION P7 VALUES LESS THAN(2453005),
PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2
)
ENABLE ROW MOVEMENT;
--以like 方式创建一个分区表。
gbase=#CREATE TABLE tpcds.web_returns_p3 (LIKE tpcds.web_returns_p2 INCLUDING
PARTITION);
--修改分区P1 的表空间为example2。
gbase=#ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P1 TABLESPACE example2;

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1023
--修改分区P2 的表空间为example3。
gbase=#ALTER TABLE tpcds.web_returns_p2 MOVE PARTITION P2 TABLESPACE example3;
--以2453010 为分割点切分P8。
gbase=#ALTER TABLE tpcds.web_returns_p2 SPLIT PARTITION P8 AT (2453010) INTO
(
PARTITION P9,
PARTITION P10
);
--将P6,P7 合并为一个分区。
gbase=#ALTER TABLE tpcds.web_returns_p2 MERGE PARTITIONS P6, P7 INTO PARTITION
P8;
--修改分区表迁移属性。
gbase=#ALTER TABLE tpcds.web_returns_p2 DISABLE ROW MOVEMENT;
--删除表和表空间。
gbase=#DROP TABLE tpcds.web_returns_p1;
gbase=#DROP TABLE tpcds.web_returns_p2;
gbase=#DROP TABLE tpcds.web_returns_p3;
gbase=#DROP TABLESPACE example1;
gbase=#DROP TABLESPACE example2;
gbase=#DROP TABLESPACE example3;
gbase=#DROP TABLESPACE example4;
示例3:START END 语法创建、修改Range 分区表。
假定/home/omm/startend_tbs1、/home/omm/startend_tbs2、/home/omm/startend_tbs3、
/home/omm/startend_tbs4 是omm 用户拥有读写权限的空目录。
-- 创建表空间
gbase=#CREATE TABLESPACE startend_tbs1 LOCATION '/home/omm/startend_tbs1';
gbase=#CREATE TABLESPACE startend_tbs2 LOCATION '/home/omm/startend_tbs2';
gbase=#CREATE TABLESPACE startend_tbs3 LOCATION '/home/omm/startend_tbs3';
gbase=#CREATE TABLESPACE startend_tbs4 LOCATION '/home/omm/startend_tbs4';
-- 创建临时schema
gbase=#CREATE SCHEMA tpcds;
gbase=#SET CURRENT_SCHEMA TO tpcds;
-- 创建分区表,分区键是integer 类型

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1024
gbase=#CREATE TABLE tpcds.startend_pt (c1 INT, c2 INT)
TABLESPACE startend_tbs1
PARTITION BY RANGE (c2) (
PARTITION p1 START(1) END(1000) EVERY(200) TABLESPACE startend_tbs2,
PARTITION p2 END(2000),
PARTITION p3 START(2000) END(2500) TABLESPACE startend_tbs3,
PARTITION p4 START(2500),
PARTITION p5 START(3000) END(5000) EVERY(1000) TABLESPACE startend_tbs4
)
ENABLE ROW MOVEMENT;
-- 查看分区表信息
gbase=#SELECT relname, boundaries, spcname FROM pg_partition p JOIN pg_tablespace
t ON p.reltablespace=t.oid and p.parentid='tpcds.startend_pt'::regclass ORDER BY
1;
relname
| boundaries |
spcname
-------------+------------+---------------
p1_0
| {1}
| startend_tbs2
p1_1
| {201}
| startend_tbs2
p1_2
| {401}
| startend_tbs2
p1_3
| {601}
| startend_tbs2
p1_4
| {801}
| startend_tbs2
p1_5
| {1000}
| startend_tbs2
p2
| {2000}
| startend_tbs1
p3
| {2500}
| startend_tbs3
p4
| {3000}
| startend_tbs1
p5_1
| {4000}
| startend_tbs4
p5_2
| {5000}
| startend_tbs4
startend_pt |
| startend_tbs1
(12 rows)
-- 导入数据,查看分区数据量
gbase=#INSERT INTO tpcds.startend_pt VALUES (GENERATE_SERIES(0, 4999),
GENERATE_SERIES(0, 4999));
gbase=#SELECT COUNT(*) FROM tpcds.startend_pt PARTITION FOR (0);
count
-------
1
(1 row)
gbase=#SELECT COUNT(*) FROM tpcds.startend_pt PARTITION (p3);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1025
count
-------
500
(1 row)
-- 增加分区: [5000, 5300), [5300, 5600), [5600, 5900), [5900, 6000)
gbase=#ALTER TABLE tpcds.startend_pt ADD PARTITION p6 START(5000) END(6000)
EVERY(300) TABLESPACE startend_tbs4;
-- 增加MAXVALUE 分区: p7
gbase=#ALTER TABLE tpcds.startend_pt ADD PARTITION p7 END(MAXVALUE);
-- 重命名分区p7 为p8
gbase=#ALTER TABLE tpcds.startend_pt RENAME PARTITION p7 TO p8;
-- 删除分区p8
gbase=#ALTER TABLE tpcds.startend_pt DROP PARTITION p8;
-- 重命名5950 所在的分区为:p71
gbase=#ALTER TABLE tpcds.startend_pt RENAME PARTITION FOR(5950) TO p71;
-- 分裂4500 所在的分区[4000, 5000)
gbase=#ALTER TABLE tpcds.startend_pt SPLIT PARTITION FOR(4500) INTO(PARTITION q1
START(4000) END(5000) EVERY(250) TABLESPACE startend_tbs3);
-- 修改分区p2 的表空间为startend_tbs4
gbase=#ALTER TABLE tpcds.startend_pt MOVE PARTITION p2 TABLESPACE startend_tbs4;
-- 查看分区情形
gbase=#SELECT relname, boundaries, spcname FROM pg_partition p JOIN pg_tablespace
t ON p.reltablespace=t.oid and p.parentid='tpcds.startend_pt'::regclass ORDER BY
1;
relname
| boundaries |
spcname
-------------+------------+---------------
p1_0
| {1}
| startend_tbs2
p1_1
| {201}
| startend_tbs2
p1_2
| {401}
| startend_tbs2
p1_3
| {601}
| startend_tbs2
p1_4
| {801}
| startend_tbs2
p1_5
| {1000}
| startend_tbs2
p2
| {2000}
| startend_tbs4

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1026
p3
| {2500}
| startend_tbs3
p4
| {3000}
| startend_tbs1
p5_1
| {4000}
| startend_tbs4
p6_1
| {5300}
| startend_tbs4
p6_2
| {5600}
| startend_tbs4
p6_3
| {5900}
| startend_tbs4
p71
| {6000}
| startend_tbs4
q1_1
| {4250}
| startend_tbs3
q1_2
| {4500}
| startend_tbs3
q1_3
| {4750}
| startend_tbs3
q1_4
| {5000}
| startend_tbs3
startend_pt |
| startend_tbs1
(19 rows)
-- 删除表和表空间
gbase=#DROP SCHEMA tpcds CASCADE;
gbase=#DROP TABLESPACE startend_tbs1;
gbase=#DROP TABLESPACE startend_tbs2;
gbase=#DROP TABLESPACE startend_tbs3;
gbase=#DROP TABLESPACE startend_tbs4;
示例4:创建间隔分区表sales,初始包含2 个分区,分区键为DATE 类型。分区的范
围分别为:time_id < '2019-02-01 00:00:00'、
'2019-02-01 00:00:00' <= time_id < '2019-02-02 00:00:00' 。
--创建表sales
gbase=#CREATE TABLE sales
(prod_id NUMBER(6),
cust_id NUMBER,
time_id DATE,
channel_id CHAR(1),
promo_id NUMBER(6),
quantity_sold NUMBER(3),
amount_sold NUMBER(10,2)
)
PARTITION BY RANGE (time_id)
INTERVAL('1 day')
( PARTITION p1 VALUES LESS THAN ('2019-02-01 00:00:00'),
PARTITION p2 VALUES LESS THAN ('2019-02-02 00:00:00')
);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1027
-- 数据插入分区p1
gbase=#INSERT INTO sales VALUES(1, 12, '2019-01-10 00:00:00', 'a', 1, 1, 1);
-- 数据插入分区p2
gbase=#INSERT INTO sales VALUES(1, 12, '2019-02-01 00:00:00', 'a', 1, 1, 1);
-- 查看分区信息
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'sales' AND t1.parttype
= 'p';
relname | partstrategy |
boundaries
---------+--------------+-------------------------
p1
| r
| {"2019-02-01 00:00:00"}
p2
| r
| {"2019-02-02 00:00:00"}
(2 rows)
-- 插入数据没有匹配的分区,新创建一个分区,并将数据插入该分区
-- 新分区的范围为'2019-02-05 00:00:00' <= time_id < '2019-02-06 00:00:00'
gbase=#INSERT INTO sales VALUES(1, 12, '2019-02-05 00:00:00', 'a', 1, 1, 1);
-- 插入数据没有匹配的分区,新创建一个分区,并将数据插入该分区
-- 新分区的范围为'2019-02-03 00:00:00' <= time_id < '2019-02-04 00:00:00'
gbase=#INSERT INTO sales VALUES(1, 12, '2019-02-03 00:00:00', 'a', 1, 1, 1);
-- 查看分区信息
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'sales' AND t1.parttype
= 'p';
relname | partstrategy |
boundaries
---------+--------------+-------------------------
sys_p1
| i
| {"2019-02-06 00:00:00"}
sys_p2
| i
| {"2019-02-04 00:00:00"}
p1
| r
| {"2019-02-01 00:00:00"}
p2
| r
| {"2019-02-02 00:00:00"}
(4 rows)
示例5:创建LIST 分区表test_list,初始包含4 个分区,分区键为INT 类型。4 个分区
的范围分别为:2000、3000、4000、5000。
--创建表test_list
gbase=#create table test_list (col1 int, col2 int)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1028
partition by list(col1)
(
partition p1 values (2000),
partition p2 values (3000),
partition p3 values (4000),
partition p4 values (5000)
);
-- 数据插入
gbase=#INSERT INTO test_list VALUES(2000, 2000);
INSERT 0 1
gbase=#INSERT INTO test_list VALUES(3000, 3000);
INSERT 0 1
-- 查看分区信息
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'test_list' AND
t1.parttype = 'p';
relname | partstrategy | boundaries
---------+--------------+------------
p1
| l
| {2000}
p2
| l
| {3000}
p3
| l
| {4000}
p4
| l
| {5000}
(4 rows)
-- 插入数据没有匹配到分区,报错处理
gbase=#INSERT INTO test_list VALUES(6000, 6000);
ERROR:
inserted partition key does not map to any table partition
-- 添加分区
gbase=#alter table test_list add partition p5 values (6000);
ALTER TABLE
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'test_list' AND
t1.parttype = 'p';
relname | partstrategy | boundaries
---------+--------------+------------
p5
| l
| {6000}
p4
| l
| {5000}
p1
| l
| {2000}

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1029
p2
| l
| {3000}
p3
| l
| {4000}
(5 rows)
gbase=#INSERT INTO test_list VALUES(6000, 6000);
INSERT 0 1
-- 分区表和普通表交换数据
gbase=#create table t1 (col1 int, col2 int);
CREATE TABLE
gbase=#select * from test_list partition (p1);
col1 | col2
------+------
2000 | 2000
(1 row)
gbase=#alter table test_list exchange partition (p1) with table t1;
ALTER TABLE
gbase=#select * from test_list partition (p1);
col1 | col2
------+------
(0 rows)
gbase=#select * from t1;
col1 | col2
------+------
2000 | 2000
(1 row)
-- truncate 分区
gbase=#select * from test_list partition (p2);
col1 | col2
------+------
3000 | 3000
(1 row)
gbase=#alter table test_list truncate partition p2;
ALTER TABLE
gbase=#select * from test_list partition (p2);
col1 | col2
------+------
(0 rows)
-- 删除分区
gbase=#alter table test_list drop partition p5;

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1030
ALTER TABLE
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'test_list' AND
t1.parttype = 'p';
relname | partstrategy | boundaries
---------+--------------+------------
p4
| l
| {5000}
p1
| l
| {2000}
p2
| l
| {3000}
p3
| l
| {4000}
(4 rows)
gbase=#INSERT INTO test_list VALUES(6000, 6000);
ERROR:
inserted partition key does not map to any table partition
-- 删除分区表
gbase=#drop table test_list;
示例6:创建HASH 分区表test_hash,初始包含2 个分区,分区键为INT 类型。
--创建表test_hash
gbase=#create table test_hash (col1 int, col2 int)
partition by hash(col1)
(
partition p1,
partition p2
);
-- 数据插入
gbase=#INSERT INTO test_hash VALUES(1, 1);
INSERT 0 1
gbase=#INSERT INTO test_hash VALUES(2, 2);
INSERT 0 1
gbase=#INSERT INTO test_hash VALUES(3, 3);
INSERT 0 1
gbase=#INSERT INTO test_hash VALUES(4, 4);
INSERT 0 1
-- 查看分区信息
gbase=#SELECT t1.relname, partstrategy, boundaries FROM pg_partition t1,
pg_class t2 WHERE t1.parentid = t2.oid AND t2.relname = 'test_hash' AND
t1.parttype = 'p';

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1031
relname | partstrategy | boundaries
---------+--------------+------------
p1
| h
| {0}
p2
| h
| {1}
(2 rows)
-- 查看数据
gbase=#select * from test_hash partition (p1);
col1 | col2
------+------
3 |
3
4 |
4
(2 rows)
gbase=#select * from test_hash partition (p2);
col1 | col2
------+------
1 |
1
2 |
2
(2 rows)
-- 分区表和普通表交换数据
gbase=#create table t1 (col1 int, col2 int);
CREATE TABLE
gbase=#alter table test_hash exchange partition (p1) with table t1;
ALTER TABLE
gbase=#select * from test_hash partition (p1);
col1 | col2
------+------
(0 rows)
gbase=#select * from t1;
col1 | col2
------+------
3 |
3
4 |
4
(2 rows)
-- truncate 分区
gbase=#alter table test_hash truncate partition p2;
ALTER TABLE
gbase=# select * from test_hash partition (p2);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1032
col1 | col2
------+------
(0 rows)
-- 删除分区表
gbase=#drop table test_hash;
相关命令
ALTER TABLE PARTITION,DROP TABLE

虚拟集群镜像功能提供了三种方式创建表镜像。分别是:
1.
创建单个表镜像;
2.
以库为单位创建表镜像;
3.
同时创建主表和镜像表;
4.
创建库的默认镜像VC。

创建单个镜像表
创建镜像表命令:
ALTER TABLE VC1.DB.T1 CREATE MIRROR TO VC2;
以上命令用于VC1.DB.T1 表和VC2.DB 库已存在,VC2.DB.T1 表不存在的场景
下,在VC2.DB 下创建T1 表、同步数据并创建镜像关系,使VC1.DB.T1 与
VC2.DB.T1 完全一样,并在后续对镜像关系表的任意一边操作保持同步到另一
边。如果VC2.DB.T1 表存在则报错。
强制创建镜像命令:
ALTER TABLE VC1.DB.T1 CREATE MIRROR TO VC2 FORCE;
以上命令使用FORCE 参数,用于VC2.DB.T1 表存在的场景,会强制在VC2.DB
中创建VC1.DB.T1 的镜像表,
使VC2.DB.T1 与VC1.DB.T1 完全一样,
并在后续
对镜像关系表的任意一边操作保持同步到另一边。

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
211
注意
使用强制创建镜像表SQL 时,当VC1.DB.T1 与VC2.DB.T1 的表结构不相
同,该命令会删除VC2.DB.T1 表,然后使用VC1.DB.T1 表的建表SQL 重新创建
VC2.DB.T1 表,最后再同步VC1.DB.T1 表数据到VC2.DB.T1 表。
已经建立镜像关系的表可以直接删除,表删除后,镜像关系也随之删除。

以库为单位创建表镜像
ALTER DATABASE VC1.DB CREATE MIRROR TO VC2;
用于VC1.DB 库和VC2.DB 库都存在的场景,
在VC2.DB 中创建VC1.DB 里所
有的非同名表和非同名存储过程、函数,同时对这些新创建的非同名表同步数
据和创建镜像关系,使创建了镜像关系的两张表结构和数据完全一致(存储过
程和函数没有镜像关系)。后续对镜像关系的任意一边表做更改都将同步到镜
像关系的另一边的表中,使两张表完全一致。
如果VC2.DB 中存在VC1.DB 的同名表或同名存储过程、函数,则整个sql 会
以warning 的方式返回同名表、同名存储过程和函数的创建失败信息。
VC1.DB 中的表
VC2.DB 中的表
本功能执行结果
T
VC2.DB 中创建T 的镜像表
T2
T2
VC2.DB 中T2 无变化,warnings 中报T2 已存
在信息
T3
VC2.DB 中T3 无变化,没有任何影响
procedure1
VC2.DB 中创建procedure1 存储过程,但无镜
像关系
procedure2
VC2.DB 中procedure2 不受影响,无变化
创建镜像关系时只会在VC2.DB 中创建VC1.DB 的镜像表,VC1.DB 中表、存储过程、函数
等不会有变化。镜像关系创建成功后,镜像关系两侧的表没有主次之分,任意一边的操作
会映射到关系的另一侧表,保持两侧的表完全一致。
本功能主要是批量给库下的表创建镜像,也就是多个表并发创建镜像,并发数
由参数gcluster_mirror_parallel_count 指定。

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
212
注意
gcluster_mirror_parallel_count 是session 级参数。
需要在执行前先设置并行
度,否则,在执行创建镜像表的过程中更改这个参数不生效。
创建成功后可以在gbase.table_distribution 中查看表的镜像关系:
select vc_id,index_name,mirror_vc_id from gbase.table_distribution where
dbname='***';
强制创建库级镜像表命令(使用Force 参数):
ALTER DATABASE VC1.DB CREATE MIRROR TO VC2 FORCE;
用于VC1.DB 库和VC2.DB 库都存在的场景,
在VC2.DB 中创建VC1.DB 里所
有的表和存储过程、函数,同时对这些新创建的表同步数据并创建镜像关系,
使创建了镜像关系的两张表完全一致。
后续对镜像关系的任意一边表做更改都
将同步到镜像关系的另一边的表中,使两张表完全一致。
VC1.DB 中的表
VC2.DB 中的表
本功能执行结果
T
VC2.DB 中创建T 的镜像表
T2
T2
VC2.DB 中T2 删除,
VC2.DB 中创建VC1.DB.T
的镜像表
T3
VC2.DB 中T3 无变化,没有任何影响
procedure1
VC2.DB 中创建procedure1 存储过程,但无镜
像关系
procedure2
VC2.DB 中procedure2 不受影响,无变化
注意
以库为单位创建表镜像,加了force 和不加force 的区别在于对同名表的处
理:
不加force 的sql 不对同名表创建镜像关系,会有warnings 报出失败信息;
加了force 的sql 对同名表强制创建镜像关系,将会删除VC2 中的同名表,
将VC1 中的同名表在VC2 中重建,使VC2 中该表的表结构和数据与VC1 中一致。

同时创建主表和镜像表

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
213
在CREATE TABLE 语句中增加MIRROR TO 参数来实现同时创建主表和镜像
表。
CREATE TABLE VC1.DB.T1(A INT, B VARCHAR(10)) MIRROR TO VC2;
CREATE TABLE VC1.DB.T1 MIRROR TO VC2 AS SELECT * FROM
VC1.DB.T
如果VC2.DB 中存在T1 表则报错。
gbase> create table vc1.mirrdb.tx mirror to vc2 as select * from vc2.mirrdb.x;
Query OK, 1 row affected (Elapsed: 00:00:05.06)
注意
该语法不支持force 关键字
不支持create table like 指定镜像表

创建库的默认镜像VC
设置VC1.DB 库的默认镜像所在的VC 名(后续简称为默认镜像VC),用于
VC1.DB 和VC2.DB 已存在的场景下。如果VC2.DB 不存在则报错。
ALTER DATABASE VC1.DB SET DEFAULT MIRROR = VC2;
设置默认镜像VC 时,对VC1.DB 库和VC2.DB 库中已存在的表、存储过程、
视图没有任何影响。
设置默认镜像VC 完成后,VC1.DB 库和VC2.DB 库中之前已存在的表、存储
过程、视图无变化,没有镜像关系存在,任何操作(包括删除重建同名对象)
均不会做镜像同步。
设置默认镜像VC 完成后,VC1.DB 库和VC2.DB 库的镜像关系建立成功,镜
像关系的任意一侧(VC1.DB 或者VC2.DB)新创建的表、视图、存储过程以
及对这些对象的操作都会同时同步到镜像关系的另一侧,
使镜像关系两侧新建
立的表、视图、存储过程保持一致。
VC1.DB 中的表
VC2.DB 中的表
本功能执行结果
设置default VC 前已存在的对象
T、procedure1
DDL、DML
T3、procedure2
DDL、DML
不同步,无变动,互不影响
T2
DDL、DML
T2
DDL、DML
不同步,无变动,互不影响
设置default VC 后操作的对象
Table 、view 、
procedure
DDL、DML
同步到VC2.DB

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
214
VC1.DB 中的表
VC2.DB 中的表
本功能执行结果
Table

view

procedure
DDL、DML
同步到VC1.DB
删除库的默认镜像VC 可以使用如下sql:
ALTER DATABASE VC1.DB SET DEFAULT MIRROR = null;