使用dbms_parallel_execute来完成DML的并行

简介: 在工作中使用并行可以极大的提高工作效率。可以Object,session.hint级别引入并行。可以使大量的数据处理更加高效。 比如现在有一个表 t 有1000万行,如果想以这个表为基础,把数据选择性的插入另外一个表t2, 使用Insert into t2 select *from t; 使用并行来处理也没有问题,但是如果使用dbms_parallel_execute也是一种很不错的选择。

在工作中使用并行可以极大的提高工作效率。可以Object,session.hint级别引入并行。可以使大量的数据处理更加高效。

比如现在有一个表 t 有1000万行,如果想以这个表为基础,把数据选择性的插入另外一个表t2,
使用Insert into t2 select *from t;
使用并行来处理也没有问题,但是如果使用dbms_parallel_execute也是一种很不错的选择。
使用dbms_parallel_execute的实现方式和parallel还有一定的差别。
这个包在11g开始引入,可能初次接触的时候会被它大量的功能所淹没,不知道从何开始。

举个例子来说明一下。
我们创建一个表 t,限于环境的情况,目前做一个百万级别的数据dml操作,使用dbms_parallel_execute来完成。
创建表t.

SQL> drop table t;

Table dropped.

SQL> create table t as select object_id,object_name from dba_objects;

Table created.

创建表t2,我们专门专门多加了一个字段。session_id。到时候会有用处。

SQL> drop table t2;

Table dropped.

SQL> create table t2 as select t1.*,0 session_id from t t1 where 1=0;

Table created.

使用如下的存储过程来模拟一个dml的处理过程。传入的参数,是根据rowid来处理。
create or replace procedure serial(p_lo_rid in rowid,p_hi_rid in rowid)
is
begin
for x in (select object_id object_id,object_name object_name from t where rowid between p_lo_rid and p_hi_rid)
loop
insert into t2(object_id,object_name,session_id)
values(x.object_id,x.object_name,sys_context('userenv','sessionid'));
end loop;
end;
/

使用dbms_parallel_execute来创建一个Job,以1万条数据分单位进行数据的rowid切分。

begin
dbms_parallel_execute.create_task('PROCESS TASK');
dbms_parallel_execute.create_chunks_by_rowid
( task_name=>'PROCESS TASK',
  table_owner=>user,
  table_name=>'T',
  by_row=>false,
  chunk_size=>10000);
  end;
 /

通过dba_parallel_execute_chunks可以查看到切分后的rowid情况。

set pages 200
select *from (
select chunk_id,status,start_rowid,end_rowid
from dba_parallel_execute_chunks
where task_name='PROCESS TASK'
order by chunk_id
);

查看切分后的情况,我们可以把切分后的每一个子块称为chunk。可以通过这个语句来简单的监控进度。
 CHUNK_ID STATUS               START_ROWID        END_ROWID
---------- -------------------- ------------------ ------------------
       600 UNASSIGNED           AAAEQCAAFAAAACAAAA AAAEQCAAFAAAAD/CcP
       601 UNASSIGNED           AAAEQCAAFAAAAEAAAA AAAEQCAAFAAAAF/CcP
       602 UNASSIGNED           AAAEQCAAFAAAAGAAAA AAAEQCAAFAAAAH/CcP
       603 UNASSIGNED           AAAEQCAAFAAAAIAAAA AAAEQCAAFAAAAJ/CcP
       604 UNASSIGNED           AAAEQCAAFAAAAKAAAA AAAEQCAAFAAAAL/CcP
       605 UNASSIGNED           AAAEQCAAFAAAAWAAAA AAAEQCAAFAAAAX/CcP
       606 UNASSIGNED           AAAEQCAAFAAAAYAAAA AAAEQCAAFAAAAZ/CcP
       607 UNASSIGNED           AAAEQCAAFAAAAaAAAA AAAEQCAAFAAAAb/CcP
       608 UNASSIGNED           AAAEQCAAFAAAAcAAAA AAAEQCAAFAAAAd/CcP
       609 UNASSIGNED           AAAEQCAAFAAAEsYAAA AAAEQCAAFAAAEsfCcP
       610 UNASSIGNED           AAAEQCAAFAAAEsgAAA AAAEQCAAFAAAEsnCcP

可以使用如下的部分来开始处理数据。启用了4个并行,并行度可以情况来提高。:start_id,:end_id是上面对应的rowid.

begin
dbms_parallel_execute.run_task
(task_name=>'PROCESS TASK',
sql_stmt=>'begin serial(:start_id,:end_id); end;',
language_flag=>DBMS_SQL.NATIVE,
parallel_level=>4);
end;
/



select *from (
select chunk_id,status,start_rowid,end_rowid
from dba_parallel_execute_chunks
where task_name='PROCESS TASK'
order by chunk_id
);

数据处理的进度可以查看得到。
 CHUNK_ID STATUS               START_ROWID        END_ROWID
---------- -------------------- ------------------ ------------------
       600 PROCESSED            AAAEQCAAFAAAACAAAA AAAEQCAAFAAAAD/CcP
       601 PROCESSED            AAAEQCAAFAAAAEAAAA AAAEQCAAFAAAAF/CcP
       602 PROCESSED            AAAEQCAAFAAAAGAAAA AAAEQCAAFAAAAH/CcP
       603 PROCESSED            AAAEQCAAFAAAAIAAAA AAAEQCAAFAAAAJ/CcP
       604 PROCESSED            AAAEQCAAFAAAAKAAAA AAAEQCAAFAAAAL/CcP
       605 PROCESSED            AAAEQCAAFAAAAWAAAA AAAEQCAAFAAAAX/CcP
       606 PROCESSED            AAAEQCAAFAAAAYAAAA AAAEQCAAFAAAAZ/CcP
       607 PROCESSED            AAAEQCAAFAAAAaAAAA AAAEQCAAFAAAAb/CcP
       608 PROCESSED            AAAEQCAAFAAAAcAAAA AAAEQCAAFAAAAd/CcP

处理完数据之后,就可以删除这个job了。

begin
dbms_parallel_execute.drop_task('PROCESS TASK');
end;
/


我们可以在t2的新增列中看到每个对应的parallel处理的数据情况,可以看到数据的处理还是很平均的。
select session_id,count(*)
from t2
group by session_id
order by session_id;

SESSION_ID   COUNT(*)
---------- ----------
   1670371     357834
   1670372     370487
   1670373     403604
   1670374     404679


在数据处理的时候。可以看到dbms_parallel_execute后台启用的处理进程和并行还是有一些不同的。
启用了4个并行之后,看到都是j00这样的进程。

top - 06:31:03 up 1 day,  5:21,  2 users,  load average: 3.97, 1.55, 0.61
Tasks: 167 total,   4 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s): 60.7%us,  7.7%sy,  0.0%ni,  1.0%id, 28.9%wa,  0.2%hi,  1.5%si,  0.0%st
Mem:   2030124k total,  1293220k used,   736904k free,   358400k buffers
Swap:  4063224k total,        0k used,  4063224k free,   476552k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                   
32630 ora11g    20   0  530m  67m  64m D 55.2  3.4   0:48.34 ora_j000_TEST01                                                                                           
32634 ora11g    20   0  529m  60m  57m R 38.4  3.0   0:46.88 ora_j002_TEST01                                                                                           
32632 ora11g    20   0  529m  62m  59m R 24.8  3.2   0:44.54 ora_j001_TEST01                                                                                           
32636 ora11g    20   0  529m  59m  56m R 17.5  3.0   0:44.88 ora_j003_TEST01                                                                                           
 2295 ora11g    20   0  541m  79m  67m D  1.3  4.0   0:11.93 ora_dbw0_TEST01                                                                                           
32706 ora11g    20   0 14940 1240  904 R  1.0  0.1   0:00.39 top -c                                                                                                    
  825 root      20   0     0    0    0 S  0.3  0.0   0:18.85 [jbd2/sdb3-8]  

如果调高parallel从4到16,可以看到j00的进程相应的增加了。

top - 06:32:59 up 1 day,  5:23,  2 users,  load average: 1.31, 1.29, 0.63
Tasks: 182 total,   4 running, 178 sleeping,   0 stopped,   0 zombie
Cpu(s): 77.2%us, 21.2%sy,  0.0%ni,  1.2%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   2030124k total,  1345284k used,   684840k free,   358500k buffers
Swap:  4063224k total,        0k used,  4063224k free,   476800k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                   
  404 ora11g    20   0  530m  39m  36m R 23.4  2.0   0:01.75 ora_j010_TEST01                                                                                           
  392 ora11g    20   0  529m  33m  30m S 17.1  1.7   0:01.39 ora_j004_TEST01                                                                                           
  402 ora11g    20   0  529m  31m  28m R 16.1  1.6   0:00.86 ora_j009_TEST01                                                                                           
  384 ora11g    20   0  530m  35m  32m S 12.2  1.8   0:01.21 ora_j000_TEST01                                                                                           
  386 ora11g    20   0  529m  32m  29m S 11.9  1.6   0:01.11 ora_j001_TEST01                                                                                           
  422 root      20   0  122m  19m  10m S 11.5  1.0   0:00.35 /u04/app/11.2.0/grid/bin/crsctl.bin check has                                                             
  394 ora11g    20   0  529m  31m  29m S 10.5  1.6   0:00.86 ora_j005_TEST01                                                                                           
  410 ora11g    20   0  530m  31m  28m R 10.5  1.6   0:00.63 ora_j013_TEST01                                                                                           
  408 ora11g    20   0  529m  32m  29m S  9.6  1.6   0:00.93 ora_j012_TEST01                                                                                           
  388 ora11g    20   0  529m  32m  29m S  8.9  1.6   0:01.14 ora_j002_TEST01                                                                                           
  398 ora11g    20   0  530m  32m  29m S  8.6  1.6   0:00.98 ora_j007_TEST01                                                                                           
  390 ora11g    20   0  529m  31m  28m S  7.6  1.6   0:00.74 ora_j003_TEST01                                                                                           
  396 ora11g    20   0  529m  32m  29m S  7.2  1.6   0:01.04 ora_j006_TEST01                                                                                           
  406 ora11g    20   0  530m  30m  27m S  5.6  1.5   0:00.49 ora_j011_TEST01                                                                                           
  414 ora11g    20   0  529m  29m  26m S  5.6  1.5   0:00.45 ora_j015_TEST01                                                                                           
  400 ora11g    20   0  529m  30m  27m S  4.9  1.5   0:00.64 ora_j008_TEST01                                                                                           
  412 ora11g    20   0  530m  30m  27m S  4.6  1.5   0:00.63 ora_j014_TEST01

目录
相关文章
|
存储 OLAP OLTP
漫谈OceanBase 列式存储
列式存储主要的目的有两个: 大部分OLAP查询只需要读取部分列而不是全部列数据,列式存储可以避免读取无用数据; 将同一列的数据在物理上存放在一起,能够极大地提高数据压缩率。 OLAP和OLTP OLAP,也叫联机分析处理(Online Analytical Processing)系统,有的时候也叫DSS决策支持系统,就是我们说的数据仓库。
6554 0
|
存储 SQL 运维
涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理
本文尝试解读ClickHouse存储层的设计与实现,剖析它的性能奥妙
3865 0
涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理
|
4月前
|
存储 SQL 数据库
【赵渝强老师】OceanBase的部署架构
OceanBase数据库支持两种部署架构:无共享(Shared-Nothing,SN)模式和共享存储(Shared-Storage,SS)模式。SN模式下,各节点对等,具备高扩展性、可用性和性能,运行于普通PC服务器集群;SS模式采用存算分离架构,租户数据存储在共享对象存储上,本地缓存热点数据。两种模式均支持高可用与多副本一致性,适用于不同业务场景。
364 1
|
10月前
|
Linux iOS开发 网络架构
如何使用 Ping 命令监测网络丢包情况?
如何使用 Ping 命令监测网络丢包情况?
7597 48
|
存储 关系型数据库 MySQL
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
深入OceanBase内部机制:高性能分布式(实时HTAP)关系数据库概述
|
SQL 数据库
`UPDATE FROM` 的语法以及常见的更新操作方式
`UPDATE FROM` 的语法以及常见的更新操作方式
2596 2
|
运维 自然语言处理 开发工具
【专栏】NeoVim正逐渐取代Vim成为运维人员首选的文本编辑器。这 8 个原因或许是答案,命令对比一目了然!
【4月更文挑战第28天】NeoVim正逐渐取代Vim成为运维人员首选的文本编辑器。其优势包括更好的扩展性、现代化界面、多语言编程支持、异步处理能力、协作功能、持续更新及活跃社区。NeoVim的命令与Vim相似,但在启动配置、插件管理和窗口管理等方面有所优化。总的来说,NeoVim提供了更强大、灵活和现代的编辑体验。
1020 0
|
SQL 存储 关系型数据库
分布式数据库——从线性扩展谈分布式JOIN
在首届阿里巴巴中间件峰会上,来自阿里巴巴DRDS团队的梦实分享了《分布式数据库——从线性扩展谈分布式JOIN》。他主要从OLTP数据库的线性扩展、水平扩容、IN查询、分布式JOIN四个方面进行了分享。在分享中,他主要通过买家与订单场景、家庭与孩子场景介绍了IN查询,通过同维度的JOIN、广播表的JOIN、Nested Loop Join详细介绍了分布式JOIN的坑与填坑。
9845 75
|
自然语言处理 JavaScript 前端开发
详解 clang-format 配置选项(基于 clang 8.0.0)
基于 clang 8.0.0 详解 clang-format 中涉及 C/C++ 配置选项的含义,跳过不相关的语言配置选项如 Java, Objective-C, JavaScript。
4059 0

热门文章

最新文章