云服务器内容精选

  • SET INTERVAL子句支持 支持使用SET INTERVAL子句修改INTERVAL RANGE表定义的INTERVAL子句间隔类型和间隔值,也可实现消除或添加INTERVAL子句。 语法: ALTER TABLE table_name SET INTERVAL {() | (type, value) | (value)}; 表4 参数说明 参数名称 参数说明 type 目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND),不显式指定默认是数字类型的间隔。 value 指定间隔的数值大小。当type为SECOND类型时,间隔不能小于60。 示例: 修改INTERVAL RANGE表的INTERVAL类型和值。 CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ) PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); ​ ALTER TABLE orders SET INTERVAL(YEAR, 1); 实现RANGE表和INTERVAL RANGE表之间的转化。 CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ) PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); ​ # 删除INTERVAL子句 ALTER TABLE sales SET INTERVAL(); ​ # 添加INTERVAL子句 ALTER TABLE sales SET INTERVAL(DAY, 60); 即使当前功能开关rds_interval_range_enabled关闭,"ALTER TABLE table_name SET INTERVAL()"语句也可使用(用于消除INTERVAL RANGE表的INTERVAL子句定义信息,转化为普通RANGE表)。
  • INTERVAL RANGE分区表与任意类型表的相互转换 语法: 其他类型表转化为INTERVAL RANGE分区表。 ALTER TABLE table_name table_definition partition_options; ​ partition_options: PARTITION BY { RANGE{(expr) | COLUMNS(column_list)} } { INTERVAL(type, value) | INTERVAL(value) } [(partition_definition [, partition_definition] ...)] ​ partition_definition: PARTITION partition_name [VALUES LESS THAN {expr | MAXVALUE}] [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] INTERVAL子句关联参数说明: 表3 参数说明 参数名称 参数说明 INTERVAL(value) 使用RANGE(expr) 或者 RANGE COLUMNS(column_list)且column是整型字段时,INTERVAL子句的格式,其中value代表间隔数值,必须是正整数。 expr RANGE(expr)中的分区表达式,目前只支持整数类型。 column_list RANGE COLUMNS(column_list)的分区字段列表,在INTERVAL RANGE分区表中,column_list只能是单列。 INTERVAL(type, value) 使用RANGE COLUMNS(column_list)且column_list是DATE/TIME/DATETIME类型时,INTERVAL子句的格式,其中type代表间隔类型,value代表间隔数值。 type目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND)。 value代表间隔数值,必须是正整数;当type为SECOND类型时,间隔不能小于60。 INTERVAL RANGE分区表转化为其他任意类型的表,这里partition_options是可选的。 ALTER TABLE table_name table_definition [partition_options]; 示例: 将其他类型表转为INTERVAL RANGE表: CREATE TABLE orders( orderkey BIGINT NOT NULL, custkey BIGINT NOT NULL, orderdate DATE NOT NULL ); ​ ALTER TABLE orders PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) ( PARTITION p0 VALUES LESS THAN('2021-10-01') ); 将INTERVAL RANGE表转化为其他类型表: CREATE TABLE orders (a INT, b DATETIME) PARTITION BY RANGE (a) INTERVAL(10) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ ALTER TABLE orders PARTITION BY LIST COLUMNS (a) ( PARTITION p0 VALUES IN (1, 11, 25) ); 修改INTERVAL RANGE表的INTERVAL子句信息: CREATE TABLE orders (a INT, b DATETIME) PARTITION BY RANGE (a) INTERVAL(10) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ ALTER TABLE orders PARTITION BY RANGE (a) INTERVAL(20) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ # 消除INTERVAL子句 ALTER TABLE orders PARTITION BY RANGE (a) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) ); ​ # 添加INTERVAL子句 ALTER TABLE orders PARTITION BY RANGE (a) INTERVAL(100) ( PARTITION p0 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(20) );
  • 创建INTERVAL RANGE分区表 INTERVAL RANGE分区表定义格式类似于RANGE分区表,但多了INTERVAL子句。 语法: CREATE TABLE [IF NOT EXISTS] [schema.]table_name table_definition partition_options; 其中,partition_options为: PARTITION BY RANGE {(expr) | COLUMNS(column_list)} {INTERVAL(value) | INTERVAL(type, expr)} (partition_definition [, partition_definition] ...) partition_definition为: PARTITION partition_name [VALUES LESS THAN {expr | MAXVALUE}] [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] 其中,INTERVAL子句仅支持设置间隔数值(value)和间隔类型(type)。 INTERVAL子句关联参数说明: 表2 参数说明 参数名称 参数说明 INTERVAL(value) 使用RANGE(expr) 或者 RANGE COLUMNS(column_list)且column是整型字段时,INTERVAL子句的格式,其中value代表间隔数值,必须是正整数。 expr RANGE(expr)中的分区表达式,目前只支持整数类型。 column_list RANGE COLUMNS(column_list)的分区字段列表,在INTERVAL RANGE分区表中,column_list只能是单列。 INTERVAL(type, value) 使用RANGE COLUMNS(column_list)且column_list是DATE/TIME/DATETIME类型时,INTERVAL子句的格式,其中type代表间隔类型,value代表间隔数值。 type目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND)。 value代表间隔数值,必须是正整数;当type为SECOND类型时,间隔不能小于60。 间隔数值(value)和间隔类型(type)的进一步说明:
  • 使用限制 INTERVAL RANGE表只支持HASH/KEY二级分区。 采取RANGE COLUMNS(column_list) INTERVAL([type], value)形式描述INTERVAL RANGE规则时: column_list(分区键)中列个数只能为1,并且只能是是整数类型或者DATE/TIME/DATETIME类型。 如果分区键是整型,INTERVAL的间隔类型type不需要填写。 如果分区键为DATE类型,INTERVAL的间隔类型type只能取YEAR、QUARTER、MONTH、WEEK、DAY。 如果分区键为TIME类型,INTERVAL的间隔类型type只能取HOUR、MINUTE、SECOND。 如果分区间为DATETIME类型,INTERVAL的间隔类型type可以取YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND。 间隔值value只能为正整数。 如果INTERVAL的间隔类型是SECOND,间隔不能小于60。 采取RANGE(expr) INTERVAL(value)形式描述INTERVAL RANGE规则时,expr表达式的结果应为整数,间隔值value只能为正整数。 不支持使用INSERT ...SELECT语句、INSERT ...ON DUPLICATE KEY UPDATE语句、UPDATE语句触发分区新增。 LOAD DATA时不会触发分区新增(如果分区覆盖了所有插入数据的范围,能使用load data导入数据,如果分区没有覆盖插入数据的范围,load data无法触发自增分区,导入数据失败)。 事务中如果触发分区自增,一旦新分区创建成功,不支持回滚。 自增的分区使用'_p'作为分区名的前缀,因此客户设置的以此开头的分区名可能导致分区自增失败。 SET INTERVAL([type], value)子句只适用于INTERVAL RANGE表和RANGE表,如果这两种表有二级分区,只支持二级分区为HASH或KEY类型。 SET INTERVAL([type], value)子句的type和value取值要受原表的分区表达式expr或分区键column_list的约束。
  • 修改LIST DEFAULT HASH分区表 LIST DEFAULT HASH分区支持所有修改分区表的语法,包括ALTER TABLE ADD PARTITION、ALTER TABLE DROP PARTITION、ALTER TABLE REORGANIZE PARTITION、ALTER TABLE TRUNCATE PARTITION、ALTER TABLE EXCHANGE PARTITION、ALTER TABLE OPTIMIZE PARTITIONALTER TABLE REBUILD PARTITION、ALTER TABLE REPAIR PARTITION、ALTER TABLE ANALYZE PARTITION、ALTER TABLE CHECK PARTITION操作。除了ALTER TABLE ADD PARTITION,ALTER TABLE DROP PARTITION,ALTER TABLE REORGANIZE PARTITION有特殊的使用方法和限制,其他的语法同其他类型的分区表使用方法一样。 ALTER TABLE ADD PARTITION ADD DEFAULT PARTITION 对于没有DEFAULT分区的普通LIST分区表,通过ADD PARTITION增加DEFAULT分区,使之变成LIST DEFAULT HASH分区表。 ALTER TABLE table_name ADD PARTITION(default_partition_definition) 增加一个DEFAULT分区示例如下: CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT); 增加两个DEFAULT分区示例如下: CREATE TABLE list_tab ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10) ); ALTER TABLE list_tab ADD PARTITION(PARTITION pd DEFAULT PARTITIONS 2); ADD LIST PARTITION LIST DEFAULT HASH分区表ALTER TABLE ADD PARTITION语法支持使用WITHOUT VALIDATION选项添加LIST分区。 ALTER TABLE table_name ADD PARTITION( list_partition_definition[, ..., list_partition_definition]) WITHOUT VALIDATION 新增一个LIST分区的示例如下: CREATE TABLE list_default_hash ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3); ALTER TABLE list_default_hash ADD PARTITION( PARTITION p2 VALUES IN (11,12,13) )WITHOUT VALIDATION; 执行后,list_default_hash表会增加一个LIST分区p2,p2中没有数据。 一旦使用了without validation添加list分区,需要您手动执行`ALTER TABLE .. REBUILD ALL`命令,重新分配数据。否则数据不会重新分配,满足新添加的分区定义的数据仍存放在DEFAULT分区中,在查询时候会把default分区全部标记,不会裁剪掉,会导致查询性能下降。建议您使用ALTER TABLE REORGANIZE PARTITION语法,从DEFAULT分区中分离部分数据,建立新的LIST分区。 ALTER TABLE DROP PARTITION DROP PARTITION操作时,只能一次性删除全部DEFAULT分区,不支持只删除部分DEFAULT分区。 执行DROP PARTITION操作,删除所有分区的示例如下: ALTER TABLE list_default_hash DROP PARTITION pd0,pd1,pd2; Query OK, 0 rows affected (0.33 sec) Records: 0 Duplicates: 0 Warnings: 0 单独删除部分DEFAULT分区时会报错。 ALTER TABLE list_default_hash DROP PARTITION pd0; 报错信息如下: ERROR 8078 (HY000): DROP PARTITION cannot be used on default partitions of LIST DEFAULT, except once dropping all default partitions ALTER TABLE REORGANIZE PARTITION REORGANIZE PARTITION操作时,只能一次性修改全部DEFAULT分区,不支持只修改部分DEFAULT分区。 使用REORGANIZE PARTITION操作可以改变DEFAULT分区的个数: ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO( PARTITION pd DEFAULT PARTITIONS 3); 执行后,DEFAULT分区的个数会由2个变成3个。 使用REORGANIZE PARTITION可以从DEFAULT分区中分离出一个LIST分区: ALTER TABLE list_default_hash REORGANIZE PARTITION pd0,pd1 INTO ( PARTITION p2 VALUES IN (20,21), PARTITION pd DEFAULT PARTITIONS 2); 执行后,list_default_hash分区表会增加一个LIST分区p2, p2中会有从DEFAULT分区中分离出来的符合VALUES IN (20,21)的数据。 使用REORGANIZE PARTITION可以合并一个LIST分区到DEFAULT分区 ALTER TABLE list_default_hash REORGANIZE PARTITION p2, pd0, pd1 INTO ( PARTITION pd DEFAULT PARTITIONS 2); 执行后,LIST分区p2会合并到DEFAULT分区里。 使用REORGANIZE PARTITION可以从DEFAULT分区中分离部分values放到LIST分区: ALTER TABLE list_default REORGANIZE partition p2, pd0, pd1 INTO ( PARTITION p2 VALUES IN (20,21,22,23,24), PARTITION pd DEFAULT PARTITIONS 4); 执行后,p2的定义由PARTITION p2 VALUES IN (20,21)变为PARTITION p2 VALUES IN (20,21,22,23,24), 相应的数据也会从DEFAULT分区挪到p2。
  • 参数说明 在参数配置页面通过设置参数rds_list_default_partition_enabled的值来启用或禁用LIST DEFAULT HASH功能。 表1 参数说明 参数名称 级别 说明 rds_list_default_partition_enabled Global LIST DEFAULT HASH功能控制开关。 取值范围如下: ON: 启用LIST DEFAULT HASH功能。 OFF: 关闭LIST DEFAULT HASH功能。
  • 创建LIST DEFAULT HASH分区表 语法 CREATE TABLE [ schema. ]table_name table_definition PARTITION BY LIST [COLUMNS] (expr) SUBPARTITION BY ... (list_partition_definition[, ..., list_partition_definition], default_partition_definition ) 其中,default_partition_definition为: PARTITION partition_name DEFAULT [PARTITIONS number] 每个分区的定义也可以包含二级分区, 二级分区也支持使用LIST DEFAULT分区,定义如下: SUBPARTITION subpartition_name DEFAULT 表2 参数说明 参数名称 参数说明 table_name 要创建的表名称。 partition_name 只有一个DEFAULT分区时,表示分区名称。不可与其他分区表重复。 当有多个DEFAULT分区时,表示分区名称前缀。“partition_name+序号”表示分区名称。 subpartition_name 子分区名称。同一个表中不可重复,子分区最多只支持一个DEFAULT分区。 number DEFAULT分区按照哈希规则分成number个分区,通过number指定分区个数。PARTITIONS number是可选项,不指定时,则默认为一个DEFAULT分区。 示例 创建单个DEFAULT分区示例如下: CREATE TABLE list_default_tbl ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT); 创建多个DEFAULT分区示例如下: CREATE TABLE list_default_hash ( a INT, b INT ) PARTITION BY LIST (a) (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3); 使用LIST COLUMNS示例如下: CREATE TABLE t_goods ( country VARCHAR(30), year VARCHAR(60), goods TEXT ) PARTITION BY LIST COLUMNS(country) ( PARTITION p1 VALUES IN ('China'), PARTITION p2 VALUES IN ('USA'), PARTITION p3 VALUES IN ('Asia'), PARTITION p3 VALUES IN ('India'), PARTITION p_deft DEFAULT PARTITIONS 5 ); 通过explain查看分区: EXPLAIN SELECT * FROM list_default_hash; 显示结果如下: +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | list_default_hash | p0,p1,pd0,pd1,pd2 | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL | +----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set (0.04 sec) 二级分区支持LIST DEFAULT类型,示例如下: CREATE TABLE test (a int, b int) PARTITION BY RANGE(a) SUBPARTITION BY LIST(b) ( PARTITION part0 VALUES LESS THAN (10) ( SUBPARTITION sub0 VALUES IN (1,2,3,4,5), SUBPARTITION sub1 DEFAULT), PARTITION part1 VALUES LESS THAN (20) ( SUBPARTITION sub2 VALUES IN (1,2,3,4,5), SUBPARTITION sub3 DEFAULT), PARTITION part2 VALUES LESS THAN (30) ( SUBPARTITION sub4 VALUES IN (1,2,3,4,5), SUBPARTITION sub5 DEFAULT)); 一级分区存在多个LIST DEFAULT HASH分区的情况下,仅支持HASH或KEY二级分区: CREATE TABLE list_default_hash_sub ( a INT, b INT ) PARTITION BY LIST (a) SUBPARTITION BY HASH (b) SUBPARTITIONS 20 (PARTITION p0 VALUES IN (1,2,3,4,5), PARTITION p1 VALUES IN (6,7,8,9,10), PARTITION pd DEFAULT PARTITIONS 3);
  • 示例 为了便于理解删除分区语句的使用方法,本节示例为您提供源数据,基于源数据提供删除分区的操作示例。 使用DataSource语法创建一个OBS表分区表。 创建了一个名为student的OBS分区表,表中有学生学号(id),学生姓名(name),学生院系编号(facultyNo)和学生班级编号(classNo),该表使用学生院系编号(facultyNo)和学生班级编号(classNo)进行分区。 1 2 3 4 5 6 7 8 create table if not exists student ( id int, name STRING, facultyNo int, classNo INT) using csv options (path 'obs://bucketName/filePath') partitioned by (faculytNo, classNo); 在表格中插入分区数据。 利用插入数据中的内容,可以插入以下数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 INSERT into student partition (facultyNo = 10, classNo = 101) values (1010101, "student01"), (1010102, "student02"); INSERT into student partition (facultyNo = 10, classNo = 102) values (1010203, "student03"), (1010204, "student04"); INSERT into student partition (facultyNo = 20, classNo = 101) values (2010105, "student05"), (2010106, "student06"); INSERT into student partition (facultyNo = 20, classNo = 102) values (2010207, "student07"), (2010208, "student08"); INSERT into student partition (facultyNo = 20, classNo = 103) values (2010309, "student09"), (2010310, "student10"); INSERT into student partition (facultyNo = 30, classNo = 101) values (3010111, "student11"), (3010112, "student12"); INSERT into student partition (facultyNo = 30, classNo = 102) values (3010213, "student13"), (3010214, "student14"); 查看分区。 利用查看指定表所有分区中的内容,可以查看相关的分区内容。 示例代码如下: SHOW partitions student; 表2 表数据示例 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103 facultyNo=30 classNo=101 facultyNo=30 classNo=102 删除分区。 示例1:指定多个筛选条件删除分区 本示例删除facultyNo为20,classNo为103的分区; 如需按指定筛选条件删除分区请参考指定筛选条件删除分区(只支持OBS表)。 示例代码如下: ALTER TABLE student DROP IF EXISTS PARTITION (facultyNo=20, classNo=103); 重新利用第三步中的方法查看表中的分区,可以看到该分区被删除: SHOW partitions student; 示例2:指定单个筛选条件删除分区 本示例删除facultyNo为30的分区;在插入数据的过程中可以了解到,facultyNo为30的分区有两个。 如需按指定筛选条件删除分区请参考指定筛选条件删除分区(只支持OBS表)。 示例代码如下: ALTER TABLE student DROP IF EXISTS PARTITION (facultyNo = 30); 执行后结果: 表3 表数据示例 facultyNo classNo facultyNo=10 classNo=101 facultyNo=10 classNo=102 facultyNo=20 classNo=101 facultyNo=20 classNo=102 facultyNo=20 classNo=103
  • 参数说明 表1 参数描述 参数 描述 db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。 table_name Database中的表名,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。 partition_specs 分区信息,key=value形式,key为分区字段,value为分区值。若分区字段为多个字段,可以不包含所有的字段,会删除匹配上的所有分区。“partition_specs”中的参数默认带有“( )”,例如:PARTITION (facultyNo=20, classNo=103);。
  • 工具函数示例 pg_get_tabledef获取分区表的定义,入参可以为表的OID或者表名。 SELECT pg_get_tabledef('test_range_pt'); pg_get_tabledef ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SET search_path = public; + CREATE TABLE test_range_pt ( + a integer, + b integer, + c integer + ) + WITH (orientation=row, compression=no, storage_type=USTORE, segment=off) + PARTITION BY RANGE (a) + ( + PARTITION p1 VALUES LESS THAN (2000) TABLESPACE pg_default, + PARTITION p2 VALUES LESS THAN (3000) TABLESPACE pg_default, + PARTITION p3 VALUES LESS THAN (4000) TABLESPACE pg_default, + PARTITION p4 VALUES LESS THAN (5000) TABLESPACE pg_default, + PARTITION p5 VALUES LESS THAN (MAXVALUE) TABLESPACE pg_default + ) + ENABLE ROW MOVEMENT; + CREATE INDEX idx_range_a ON test_range_pt USING ubtree (a) LOCAL(PARTITION p1_a_idx, PARTITION p2_a_idx, PARTITION p3_a_idx, PARTITION p4_a_idx, PARTITION p5_a_idx) WITH (storage_type=USTORE) TABLESPACE pg_default; (1 row) pg_stat_get_partition_tuples_hot_updated返回给定分区id的分区热更新元组数的统计。 在分区p1中插入10条数据并更新,统计分区p1的热更新元组数。 INSERT INTO test_range_pt VALUES(generate_series(1,10),1,1); INSERT 0 10 SELECT pg_stat_get_partition_tuples_hot_updated(49294); pg_stat_get_partition_tuples_hot_updated ------------------------------------------ 0 (1 row) UPDATE test_range_pt SET b = 2; UPDATE 10 SELECT pg_stat_get_partition_tuples_hot_updated(49294); pg_stat_get_partition_tuples_hot_updated ------------------------------------------ 10 (1 row)
  • 前置建表相关信息 前置建表: CREATE TABLE test_range_pt (a INT, b INT, c INT) PARTITION BY RANGE (a) ( PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN (3000), partition p3 VALUES LESS THAN (4000), partition p4 VALUES LESS THAN (5000), partition p5 VALUES LESS THAN (MAXVALUE) )ENABLE ROW MOVEMENT; 查看分区表OID: SELECT oid FROM pg_class WHERE relname = 'test_range_pt'; oid ------- 49290 (1 row) 查看分区信息: SELECT oid,relname,parttype,parentid,boundaries FROM pg_partition WHERE parentid = 49290; oid | relname | parttype | parentid | boundaries -------+---------------+----------+----------+------------ 49293 | test_range_pt | r | 49290 | 49294 | p1 | p | 49290 | {2000} 49295 | p2 | p | 49290 | {3000} 49296 | p3 | p | 49290 | {4000} 49297 | p4 | p | 49290 | {5000} 49298 | p5 | p | 49290 | {NULL} (6 rows) 创建索引: CREATE INDEX idx_range_a ON test_range_pt(a) LOCAL; CREATE INDEX --查看分区索引oid SELECT oid FROM pg_class WHERE relname = 'idx_range_a'; oid ------- 90250 (1 row) 查看索引分区信息: SELECT oid,relname,parttype,parentid,boundaries,indextblid FROM pg_partition WHERE parentid = 90250; oid | relname | parttype | parentid | boundaries | indextblid -------+----------+----------+----------+------------+------------ 90255 | p5_a_idx | x | 90250 | | 49298 90254 | p4_a_idx | x | 90250 | | 49297 90253 | p3_a_idx | x | 90250 | | 49296 90252 | p2_a_idx | x | 90250 | | 49295 90251 | p1_a_idx | x | 90250 | | 49294 (5 rows)
  • 合并分区 用户可以使用合并分区的命令来将多个分区合并为一个分区。合并分区只能通过指定分区名来进行,不支持指定分区值的写法。 合并分区不能作用于哈希分区上。 执行合并分区命令会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。 合并前的分区如果包含分类索引则不支持合并。 合并后的新分区,对于范围分区,可以与最后一个源分区名字相同,比如将p1,p2合并为p2;对于列表分区,可以与任一源分区名字相同,比如将p1,p2合并为p1。 如果新分区与源分区名字相同,数据库会将新分区视为对源分区的继承。 使用ALTER TABLE MERGE PARTITIONS可以将多个分区合并为一个分区。 例如,将范围分区表range_sales的分区date_202001和date_202002合并为一个新的分区,并更新Global索引。 ALTER TABLE range_sales MERGE PARTITIONS date_202001, date_202002 INTO PARTITION date_2020_old UPDATE GLOBAL INDEX; 父主题: 分区表运维管理
  • 分区剪枝 分区剪枝是 GaussDB 提供的一种分区表查询优化技术,数据库SQL引擎会根据查询条件,只扫描特定的部分分区。分区剪枝是自动触发的,当分区表查询条件符合剪枝场景时,会自动触发分区剪枝。根据剪枝阶段的不同,分区剪枝分为静态剪枝和动态剪枝,静态剪枝在优化器阶段进行,在生成计划之前,数据库已经知道需要访问的分区信息;动态剪枝在执行器阶段进行(执行开始/执行过程中),在生成计划时,数据库并不知道需要访问的分区信息,只是判断“可以进行分区剪枝”,具体的剪枝信息由执行器决定。 只有分区表页面扫描和Local索引扫描才会触发分区剪枝,Global索引没有分区的概念,不需要进行剪枝。 分区表静态剪枝 分区表动态剪枝 父主题: 分区表查询优化
  • 分区表运维管理 分区表运维管理包括分区管理、分区表管理、分区索引管理和分区表业务并发支持等。 分区管理:也称分区级DDL,包括新增(Add)、删除(Drop)、交换(Exchange)、清空(Truncate)、分割(Split)、合并(Merge)、移动(Move)、重命名(Rename)共8种。 对于哈希分区,涉及分区数的变更会导致数据re-shuffling,故当前GaussDB不支持导致Hash分区数变更的操作,包括新增(Add)、删除(Drop)、分割(Split)、合并(Merge)这4种。 涉及分区数据变更的操作会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,包括删除(Drop)、交换(Exchange)、清空(Truncate)、分割(Split)、合并(Merge)这5种。 大部分分区DDL支持partition和partition for指定分区两种写法,前者需要指定分区名,后者需要指定分区定义范围内的任一分区值。比如假设分区part1的范围定义为[100, 200),那么partition part1和partition for(150)这两种写法是等价的。 不同分区DDL的执行代价各不相同,由于在执行分区DDL过程中目标分区会被锁住,用户需要评估其代价以及对业务的影响。一般而言,分割(Split)、合并(Merge)的执行代价远大于其他分区DDL,与源分区的大小正相关;交换(Exchange)的代价主要源于Global索引的重建和validation校验;移动(Move)的代价限制于磁盘I/O;其余分区DDL的执行代价都很低。 分区表管理:除了继承普通表的功能外,还支持开启/关闭分区表行迁移的功能。 分区索引管理:支持用户设置索引/索引分区不可用,或者重建不可用的索引/索引分区,比如由于分区管理操作导致的Global索引失效场景。 分区表业务并发支持:分布式分区表的DDL操作会锁全表,不支持跨分区DDL-DQL/DML并发。 新增分区 删除分区 交换分区 清空分区 分割分区 合并分区 移动分区 重命名分区 分区表行迁移 分区表索引重建/不可用 父主题: 分区表
  • 索引重建/不可用 使用ALTER INDEX可以设置索引是否可用。 例如,假设分区表range_ sales上存在索引range_sales_idx,可以通过如下命令设置其不可用。 ALTER INDEX range_sales_idx UNUSABLE; 可以通过如下命令重建索引range_sales_idx。 ALTER INDEX range_sales_idx REBUILD; 父主题: 分区表索引重建/不可用