KingbaseES例程_普通表在线转分区表

概述

普通表转分区表,使用视图的替换式规则,以路由方式,实现在线转移数据。

数据准备

/*普通大表*/
create table tab_single
as
select id, (random() * 100)::int + 1 c1, md5(id::text) name
from generate_series(1, 10000000) id; alter table tab_single add primary key (id); /*表结构一样的分区表*/
create table tab_part
( like tab_single )
partition by list (c1)
;
select format($$ create table tab_part_%s partition of tab_part for values in ( %s ) $$, id, id)
from generate_series(1, 100) id \gexec /*分区表可以创建查询所需的索引*/
create index idx_tab_part_id on tab_part(id); /*创建合并视图,作为操作入口*/
create or replace view tab_view as
select *
from tab_single
union all
select *
from tab_part; /*视图不可更新*/
update tab_view
set name = 'a'
where id = 1;
[55000] ERROR: cannot update view "tab_view" 详细:Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable. 建议:To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.

通过规则实现视图更新

INSERT 规则

/*NEW数据,插入到分区表*/
CREATE or replace RULE rul_ins_tab_view
AS ON INSERT TO tab_view
DO INSTEAD insert into tab_part
select new.*; insert into tab_view
select id + 10000000, (random() * 100)::int + 1 c1, 'a' name
from generate_series(1, 10) id; /*新数据插入到分区表*/
select count(*) from tab_part;
count
-------
10
(1 row)

DELETE 规则


CREATE or replace RULE rul_del_tab_view
AS ON DELETE TO tab_view
DO INSTEAD (
delete
from tab_single
where row (tab_single.*) = row (old.*) ;
delete
from tab_part
where row (tab_part.*) = row (old.*);
); delete
from tab_view
where id = 10; /*旧数据从普通表删除*/
select *
from tab_single
where id = 10;
id | c1 | name
----+----+------
(0 rows)

UPDATE 规则

/*
* 1. 更新分区表的数据
* 2. 如果分区表没有旧数据,则分区表插入新新数据
* 3. 删除普通表的旧数据
*/ CREATE or replace RULE rul_upd_tab_view
AS ON UPDATE TO tab_view
DO INSTEAD (
insert into tab_part
select new.*
where (select count(*) cnt
from tab_part
where row (tab_part.*) = row (new.*)) = 0; delete
from tab_single
where row (tab_single.*) = row (old.*); delete
from tab_part
where row (tab_part.*) = row (old.*)
and row (tab_part.*) != row (new.*)
and old <> new;
); /*更新在普通表数据,可以更新主键值*/
update tab_view
set name='abcde'
where id = 200; /*数据从普通表删除*/
select id, c1, name
from tab_single
where id = 200; id | c1 | name
----+----+------
(0 rows) /*数据在分区表中插入或更新*/
select id, c1, name
from tab_part
where id = 200;
id | c1 | name
-----+----+-------
200 | 89 | abcde
(1 row) /*更新在分区表数据,可以更新主键值*/
update tab_view
set id=20000000+200 ,
name='xxxxxxxx'
where id = 200; /*在分区表的数据*/
select id, c1, name
from tab_part
where id = 200;
id | c1 | name
----------+----+----------
20000200 | 52 | xxxxxxxx
(1 row)

分步转移数据


do
$$
declare
stprow int;
chgrow int;
movrow int; timstm timestamp;
begin
stprow := 10000; /*每步迁移10000行数据*/
chgrow := 0; /*实际影响的行*/
movrow := 0; /*累计迁移的行*/ loop
timstm := clock_timestamp();
with del as (delete from tab_single
where ctid = any (array(select ctid from tab_single limit stprow))
returning *)
insert into tab_part
select * from del;
commit;
get diagnostics chgrow = row_count;
exit when chgrow = 0;
movrow := movrow + chgrow;
raise info 'moved rows : % / % , % ms',chgrow, movrow, (date_part('sec',clock_timestamp()-timstm)*1000)::numeric(10,3);
end loop; end;
$$
;

SHELL脚本高并发迁移数据

time seq 0 1000 | xargs -i -n1 -P10 psql -c "update tab_view set id = id where id between 10000*{}+0 and 10000*({}+1)-1"

real    0m49.630s
user 0m0.740s
sys 0m1.315s

抛弃普通表,保留分区表

/*分区表代替视图*/
do
$$
begin
drop view tab_view;
alter table tab_part
rename to tab_view;
commit;
end;
$$
;

或者

/*保留数据入口视图,删除视图的规则,修改视图定义*/
do
$$
begin
drop RULE rul_ins_tab_view TO tab_view;
drop RULE rul_del_tab_view TO tab_view;
drop RULE rul_upd_tab_view TO tab_view; create or replace view tab_view as
select *
from tab_part; commit;
end;
$$
;

注意

DML操作,主键值可能会出现重复,但可以通过校验语句避免。

KingbaseES例程_普通表在线转分区表(基于规则)的更多相关文章

  1. Oracle在线重定义(online redefinition)--将普通表改为分区表

    使用Oracle的在线重定义技术,可以将Oracle的普通表改为分区表.操作如下: STEP1:测试表是否可以在线重定义,这里以unixdev数据库的LIJIAMAN.BSTEST为例 EXEC DB ...

  2. Oracle表空间及分区表

    (1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应 ...

  3. 使用导出导入(datapump)方式将普通表切换为分区表

    随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式. 有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表:使用EXCHANGE PARTITION方式来 ...

  4. ORACLE普通表转换成分区表

    转http://mp.weixin.qq.com/s?__biz=MzAwMjkyMjEwNg==&mid=2247484761&idx=1&sn=ce080581145931 ...

  5. Oracle大表改为分区表及表空间切换方案

    Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分 ...

  6. KingbaseES R3 读写分离集群在线扩容案例

    案例说明: 1. 通过sys_basebackup创建新备库. 2. 将备库加入到Cluster nodes管理,可以用kingbase_monitor.sh一键启停. 3. 主备复制切换测试. 此次 ...

  7. SQL Server 2005中的分区表(三):将普通表转换成分区表(转)

    在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...

  8. Docker入门实战_正版电子书在线阅读_百度阅读

    Docker入门实战_正版电子书在线阅读_百度阅读 Docker入门实战

  9. SQL Server 2005中的分区表(三):将普通表转换成分区表

    在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...

  10. 关于我们_ | 腕表时代watchtimes.com.cn

    关于我们_ | 腕表时代watchtimes.com.cn 关于我们         腕表时代是北京兰会时光科技有限公司旗下运营的手表网站.腕表时代于2013年5月17日正式上线.秉承专业.生动.实用 ...

随机推荐

  1. win32 - WM_DROPFILES的用法

    WM_DROPFILES: 当用户将文件拖放到已注册为丢弃文件的接收者的应用程序窗口中时发送该消息 我们可以利用这个消息获取文件名称,并将它们保存到容器里. LRESULT CALLBACK Stat ...

  2. Redis 缓存过期删除/淘汰策略分析

    Redis 缓存过期删除/淘汰策略分析 Redis 缓存删除 Redis 键过期删除,定期删除(主动)和惰性删除(被动) Redis 内存不足时,缓存淘汰策略 key 键过期删除 我们用 redis ...

  3. 【Android 逆向】【攻防世界】easy-dex

    这一题不easy,不知为何叫这个名字.... 1. apk 安装到手机,不知所云,各种亮瞎眼闪光 2. jadx 打开apk,一行java代码都没有,打开AndroidManifest看看 <? ...

  4. MySQL Boolean类型的坑

    MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...

  5. 项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936各位读者,知识无穷而人力有穷,要 ...

  6. 项目实战:Qt+OSG三维2D文字实时效果查看工具

    需求   OSG三维中2D文字的基本属性较多,方便实时查看效果,并出对应文本代码.   Demo      工具下载地址   CSDN免积分下载地址:https://download.csdn.net ...

  7. Sourcetree 如何关联自己的gitlab仓库

    现在有些企业自己搭建了gitlab服务器,通过sourcetree从企业服务器拉取代码的时候会提示认证失败.今天搞了大半天才搞懂,给我自己做个笔记. 添加账户 托管服务商 选择 GitLab CE 托 ...

  8. javascript浮点数相减、相乘出现一长串小数

    149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...

  9. Java 韩顺平老师的课,记的(前6章)笔记

    https://www.bilibili.com/video/BV1fh411y7R8/?p=110&spm_id_from=333.880.my_history.page.click& ...

  10. Android---Android 开发四大组件

    Android 应用程序组件 应用程序组件是一个Android应用程序的基本构建块.这些组件由应用清单文件松耦合的组织.AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互 ...