暂无图片
暂无图片
6
暂无图片
暂无图片
1
暂无图片

八千字带你了解 Oracle 并行那些事(四)

304

大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看八千字带你了解 Oracle 并行那些事,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

facebook_pro_light_1920 × 1080  副本.png

一)并行执行的工作原理	
	SQL 语句的并行执行过程	
	生产者/消费者模型	
	并行粒度	
	生产者和消费者之间的分配方式	
	并行执行服务器如何通信	
二)并行的相关概念	
	并行执行相关视图	
三)并行查询	
四)并行DML	
	默认并行度	
	LOB 列的并行
        并行 DML 的限制		
五)并行创建表	
六)并行创建索引	
七)并行收集统计信息	
八)Rman 备份的并行	
九)23ai 并行新特性	
十)参考链接
复制

废话不多说,干货来了,赶快收藏点赞转发起来吧,接上文:

八千字带你了解 Oracle 并行那些事(一)
八千字带你了解 Oracle 并行那些事(二)
八千字带你了解 Oracle 并行那些事(三)

七)并行收集统计信息

关于统计信息去年已经写过一篇很详细的内容,并输出了脑图,感兴趣的可以去看看。并行收集统计信息可以使用DEGREE并行执行,但同一个表的分区之间还是串行执行,使用 CONCURRENT 并发收集,分区之间可以并行收,DEGREE 和 CONCURRENT 同时使用。

单个对象的并行统计信息收集 通过 GATHER_*_STATS 参数 DEGREE 控制 假设 EMP1 表的 degree 定义为 4, 那么收集统计信息时候有 4 个进程运行。

exec dbms_stats.gather_table_stats('SCOTT','EMP1',degree=>4);
复制

单个对象并行统计信息收集的限制

Exec DBMS_STATS.GATHER_TABLE_STATS(null,'SALES');
复制

单个分区可以并行收集,收集完一个分区,再收集下一个,多个分区不能同时收集,对于分区表首次采集时间可能比较长。

同一时间收集多个对象统计信息,通过 DBMS_STATS 的 CONCURRENT 属性控制(MANUAL、AUTOMATIC、ALL、OFF默认),使用 Scheduler 和高级队列调度,并发进程数由参数 job_queue_processes 决定,每个正在运行的任务仍然可以是并行的。

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DEFAULT_PLAN';
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=8;
EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','ALL');
SELECT DBMS_STATS.GET_PREFS('CONCURRENT') FROM DUAL;
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SH');
--关闭并发
EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','OFF');
复制

查看并发收集进度

SET LINESIZE 1000
COLUMN TARGET FORMAT a8
COLUMN TARGET_TYPE FORMAT a25
COLUMN JOB_NAME FORMAT a14
COLUMN START_TIME FORMAT a40
SELECT TARGET, TARGET_TYPE, JOB_NAME, 
       TO_CHAR(START_TIME, 'dd-mon-yyyy hh24:mi:ss')
FROM   DBA_OPTSTAT_OPERATION_TASKS 
WHERE  STATUS = 'IN PROGRESS' 
AND    OPID = (SELECT MAX(ID) 
               FROM   DBA_OPTSTAT_OPERATIONS 
               WHERE  OPERATION = 'gather_schema_stats');
复制
官方链接:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/gathering-optimizer-statistics.html#GUID-3D36585C-5850-402E-9DB5-2EE9AAAD8C36
复制

八)Rman 备份的并行

如下通过分配通道,则可以实现并行。

run {
  allocate channel c1 type disk ;
  allocate channel c2 type disk ;
  allocate channel c3 type disk ;
  allocate channel c4 type disk ;
  backup as compressed backupset datafile 10,11,12  format '/backup/%d_%I_%s_%p.bak';
  --backup as compressed backupset database format '/backup/%d_%I_%s_%p.bak';
  release channel c1;
  release channel c2;
  release channel c3;
  release channel c4;
}
复制

查看备份进度

Select inst_id,username,opname,target,sofar,totalwork*100/totalwork from gv$session_longops where sofar < totalwork;
复制

九)23ai 并行新特性

在 Oracle 23ai 之前的版本中,开启了DML的并行后,接下来的DML语句将会产生一个表锁,在commit之前,当前session 不能对该表做查询和dml操作,其他session也不能对该表做DML操作,否则会报错 ORA-12838。

alter session enable parallel dml;
create table scott.jiekexu as select * from dba_objects ;
insert /*+ append parallel(t0,16) */ into scott.jiekexu select * from scott.jiekexu t1;
Select count(*) from scott.jiekexu;

ORA-12838: cannot read/modify an object after modifying it in parallel
复制

图片.png

当然,这个问题在 Oracle 23ai 版本出来之前一直都存在,直到今年发布的 Oracle 23ai 版本才解决了这个问题。如下所示,并行之后可以继续其他的 DML 语句,无 ORA-12838 报错。

图片.png

十)参考链接

https://www.alfredzhao.cn/index.php/2021/01/08/i-love-parallel/ 
https://blogs.oracle.com/datawarehousing/post/parallel-dml-on-tables-with-lob-columns 
https://docs.oracle.com/en/database/oracle/oracle-database/23/admin/managing-processes.html#GUID-B3798D1E-E259-4EDB-815E-8ED36205A5B5
https://docs.oracle.com/en/database/oracle/oracle-database/23/vldbg/using-parallel.html#GUID-68ED8F5E-DD97-4762-985C-4C3AF85F9629
https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/types-parallelism.html#GUID-6626C70C-876C-47A4-8C01-9B66574062D8
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/gathering-optimizer-statistics.html#GUID-3D36585C-5850-402E-9DB5-2EE9AAAD8C36
https://www.modb.pro/course/article/110?lsId=5346&catalogId=4

陈焕生:深入理解Oracle 的并行执行(一)到(五)
http://www.uml.org.cn/sjjm/2015030210.asp
http://www.uml.org.cn/sjjm/2015030310.asp
http://www.uml.org.cn/sjjm/2015030411.asp
http://www.uml.org.cn/sjjm/2015030511.asp
http://www.uml.org.cn/sjjm/2015030610.asp
复制

终于算是完结了,文章太长了,大家不喜欢看,太短了感觉又没有干货,就这吧~

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————
facebook_pro_light_1920 × 1080  副本.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

筱悦星辰
暂无图片
3月前
评论
暂无图片 0
不囿于固有的认知,不困在自己的世界,不断和外界交换能量,才不会与生活中的美好擦肩而过。
3月前
暂无图片 点赞
评论