减少读写互锁方案分享--交换分区特性实例

举报
进击的白金之星 发表于 2021/06/17 12:00:38 2021/06/17
【摘要】 在调度和查询混合的数据仓库的使用场景中,常常会有同时对一张表进行ETL写入,和业务进行查询的情况。这种情况下会导致调度和查询互锁,影响调度性能,拖慢整体调度时间;或者是查询语句被锁,只能等待调度完成再能读取。给业务带来很大的不便。这种情况下,如果目标表是分区表,可以使用分区表的交换分区的功能,减少锁等待。语法如下:具体实现方式简单理解为,调度将数据写入与目标表相同表结构的临时表中,数据写完之...

在调度和查询混合的数据仓库的使用场景中,常常会有同时对一张表进行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级数仓黑科技~

GaussDB(DWS)博文后缀.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。