大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看八千字带你了解 Oracle 并行那些事,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
一)并行执行的工作原理 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
复制
当然,这个问题在 Oracle 23ai 版本出来之前一直都存在,直到今年发布的 Oracle 23ai 版本才解决了这个问题。如下所示,并行之后可以继续其他的 DML 语句,无 ORA-12838 报错。
十)参考链接
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
——————————————————————————
评论
