减少读写互锁方案分享--交换分区特性实例
在调度和查询混合的数据仓库的使用场景中,常常会有同时对一张表进行ETL写入,和业务进行查询的情况。
这种情况下会导致调度和查询互锁,影响调度性能,拖慢整体调度时间;或者是查询语句被锁,只能等待调度完成再能读取。给业务带来很大的不便。
这种情况下,如果目标表是分区表,可以使用分区表的交换分区的功能,减少锁等待。
语法如下:
具体实现方式简单理解为,调度将数据写入与目标表相同表结构的临时表B中,数据写完之后,通过交换分区语。用临时表的数据置换目标表对应的分区。这种方案能只在交换分区的时候会加锁,在数据库底层其实是重新指定分区表的分区地址,速度特别快,对查询的业务影响能降到最低。
假设有一张分区表A,根据会计日期分为多个分区,即每个月的数据都放在同一个数据分区。
业务调度作业先将当月(2月)的数据写入临时表B中,此时分区表A可以进行DML操作。
B表数据插入完成之后,通过交换分区命令,即可实现B表的数据与A表中对应表分区做交换。
在交换分区的时候据库会对两张表的表元数据做校验,只有表结构,字段完全一致的场景下能交换。
CREATE TABLE public.tab_partition (
prod_key int, prod_code character varying(50)
)
WITH (orientation=column, compression=middle)
DISTRIBUTE BY HASH(prod_key)
PARTITION BY RANGE (prod_key)
( PARTITION p201901_r01 VALUES LESS THAN (100) TABLESPACE pg_default
, PARTITION p201901_r02 VALUES LESS THAN (200) TABLESPACE pg_default
, PARTITION p201901_r03 VALUES LESS THAN (300) TABLESPACE pg_default
)
CREATE TABLE public.tab_tmp (
prod_key int,
prod_code character varying(50)
)
WITH (orientation=column, compression=middle)
DISTRIBUTE BY HASH(prod_key);
alter table tab_partition exchange partition (p201901_r02) with table tab_tmp;
drop table tab_tmp
查看pg_attribute 可以发现列的最大标记是2
alter table public.tab_partition add column prod_col character varying(200);
alter table public.tab_partition drop column prod_col ;
可以发现drop 字段之后,仍会有对应的记录,只是改了列名的标识。
alter table public.tab_partition exchange partition (p201901_r02) with table public.tab_tmp;
所以A、B表 对字段没有执行同样的操作,在看数据库看来两张表的结构是有区别的,这个时候执行交换分区会报错。
ERROR: tables in ALTER TABLE EXCHANGE PARTITION must have the same number of columns
可以通过利用create table like including 的方式实现复制表结构,这样表元数据是一致的。能规避上边的问题。
create table tab_tmp2(like tab_partition INCLUDING DROPCOLUMNS INCLUDING DISTRIBUTION INCLUDING STORAGE INCLUDING RELOPTIONS);
alter table tab_partition exchange partition (p201901_r02) with table tab_tmp2;
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技~
- 点赞
- 收藏
- 关注作者
评论(0)