exchange partition语法,可以把某些分区交换到其它表中,你可以利用这个语法把某些分区交换到列存表和外部表,从而实现多态存储。具体操作如下。再GP 归档的时候来深入学习一下这块
用一个外部表交换一个叶子子分区
用户可以用一个可读的外部表交换一个分区表中的一个叶子子分区。外部表数据可以位于一个主机文件系统、一个NFS挂载或者一个Hadoop文件系统(HDFS)。
例如,如果用户有一个分区表,它按月被分成月度分全局并且对该表的大部分查询值访问较新的数据,用户可以把较旧的、较少访问的数据拷贝到外部表并且把较旧的分区与这些外部表交换。对于之访问较新数据的查询,用户可以创建使用分区排除的查询来防止扫描较旧的、不需要的分区。
用一个外部表交换一个叶子子分区在这些情况下不被支持:
- 分区表用SUBPARTITION子句创建或者如果一个分区有一个子分区。
- 分区表含有一个带检查约束或者NOT NULL约束的列。
关于交换和修改一个叶子子分区的信息,请见 Greenplum数据库命令参考中的ALTER TABLE命令。
关于含有外部表分区的分区表的限制,请见分区表的限制。
用一个外部表交换一个分区的例子
这是一个简单的例子,它把这个分区表的一个叶子子分区交换为一个外部表。分区表包含2010至2013年份的数据。
CREATE TABLE sales (id int, year int, qtr int, day int, region text) DISTRIBUTED BY (id) PARTITION BY RANGE (year) ( PARTITION yr START (2010) END (2014) EVERY (1) ) ;
该分区表有四个叶子子分区。每一个叶子子分区含有单一年份的数据。叶子子分区表 sales_1_prt_yr_1包含2010年的数据。这些步骤把表sales_1_prt_yr_1交换为一个使用gpfdist协议的外部表:
- 确保Greenplum数据库系统启用了该外部表协议。这个例子使用了gpfdist协议。这个命令开始gpfdist协议。
$ gpfdist
- 创建一个可写的外部表。
This CREATE WRITABLE EXTENAL TABLE命令用和分区表相同的列创建一个可写的外部表。
CREATE WRITABLE EXTERNAL TABLE my_sales_ext ( LIKE sales_1_prt_yr_1 ) LOCATION ( 'gpfdist://gpdb_test/sales_2010' ) FORMAT 'csv' DISTRIBUTED BY (id) ;
- 创建一个可读的外部表,它从前一步创建的可写外部表的目的地读取数据。
这个CREATE EXTENAL TABLE创建一个可读外部表,它使用和可写外部数据相同的外部数据。
CREATE EXTERNAL TABLE sales_2010_ext ( LIKE sales_1_prt_yr_1) LOCATION ( 'gpfdist://gpdb_test/sales_2010' ) FORMAT 'csv' ;
- 从叶子子分区中拷贝数据到该可写外部表。
这个INSERT命令从分区表的叶子子分区拷贝数据到外部表。
INSERT INTO my_sales_ext SELECT * FROM sales_1_prt_yr_1 ;
- 用该外部表交换现有的叶子子分区。
这个ALTER TABLE命令指定了EXCHANGE PARTITION子句来切换可读外部表和叶子子分区。
ALTER TABLE sales ALTER PARTITION yr_1 EXCHANGE PARTITION yr_1 WITH TABLE sales_2010_ext WITHOUT VALIDATION;
以表名sales_1_prt_yr_1成为叶子子分区的外部表,并且旧的叶子子分区变成表sales_2010_ext。
警告: 为了确保针对分区表的查询返回正确的结果,外部表数据必须针对叶子子分区上的CHECK约束有效。在这种情况下,数据会从其上定义有CHECK约束的叶子子分区表中取出。
- 删除滚出分区表的表。
DROP TABLE sales_2010_ext ;
用户可以重命名该叶子子分区的名称来表明 sales_1_prt_yr_1是一个外部表。
这个示例命令把partitionname改为 yr_1_ext把叶子子分区表的名称改为 sales_1_prt_yr_1_ext。
ALTER TABLE sales RENAME PARTITION yr_1 TO yr_1_ext ;