当前位置: 首页 > article >正文

运用PARALLEL方式成倍提升Oracle数据分析效率

 Oracle作为一种大型数据库,在我国已成为大型企事业单位(如公立医院)的主流数据库并占有了绝对的市场份额。这就意味着审计工作同Oracle的交集越来越多,同时这种数据库的使用也意味着远超SQL SERVER的海量数据信息,其数据分析效率成为严重制约审计工作进度的瓶颈。本文将介绍在Oracle中如何通过采用PARALLEL(并行)方式最大化调用计算机资源来成倍提高数据分析效率。

什么是PARALLEL

  在Oracle中,对于一条执行语句,默认是用一个CPU进程进行串行执行(就好比我们一个审计项目从审计调查到最后出报告都只由一个人来一步一步执行,执行效率的低下是显而易见的)。而现在的CPU一般都拥有多核心多线程,这时我们就可以将一条执行语句交由这些多线程进行并行执行(就像一个审计项目成立了一个审计组,由各不同的人员分任务分别执行,最后汇总出报告)。这也就是Oracle的PARALLEL方式的基本原理。排除存储介质带宽等因素,理论上来说,调用了多少个CPU线程就可以缩短语句执行时间多少倍。以较为常见的单路至强处理E3-1230V3服务器为例,CPU总线程为8,因此如果采用PARALLEL调取8个线程执行查询语句,理论上会使执行时间缩短8倍。如果在双路甚至四路服务器上更会有几十倍的效率提升。

如何查看能够利用的并行进程数

  如上所说,CPU的总线程决定了PARALLEL能调用的最大资源,因此,要知道计算机的总线程数才能确定能利用的最大资源数。一般来说计算机总线程数=CPU个数×每个CPU的物理核心数量×每个核心的线程数量。以上面提到的单路至强E3-1230V3 CPU为例,总线程数为=1(1个CPU)×4(4个物理核心)×2(每个核心2个线程)=8。如果用的Windows操作系统,查看计算机总线程数最简单的办法是查看“任务管理器-资源监视器-CPU”资源监视窗口个数,有几个CPU监视窗口就表示有几个线程。非Windows操作系统可以在Oracle命令提示符中输入Show Parameters CPU来查看CPU线程数。

如何使用PARALLEL执行查询

  Oracle中PARALLEL的查询执行方式有三种。一是修改会话(Session)级别默认的并行度;二是修改表级别的并行度;三是采用Hint方式设置语句级别的并行度。因为Hint方式具有灵活度较高的优点,因此本文主要介绍通过Hint方式现实PARALLEL的查询执行。其查询执行语句格式为:

SELECT  /*+PARALLEL(n)*/  *  FROM table
  • 1
  • 1

  其中的(n)为设置要调用的并行度数量。

PARALLEL的运用实例

  下面以某医院的入院费用明细表inp_bill_detail(含有记录23704010行)为例,实测运用PARALLEL方式查询效率。

1.查看Oracle能利用的最大并行度:

SQL> show parameters cpuNAME                                       TYPE        VALUE
------------------------------------   -----------    -------
cpu_count                                integer         8
parallel_threads_per_cpu                 integer         2
resource_manager_cpu_allocation          integer         8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  结果显示CPU逻辑核心数为8,每个CPU的并行线程数为2(物理核心数为8/2=4核),这个8就是本计算机的总线程数也就是PARALLEL能利用的最大并行度。

2.PARALLEL效率测试。先测试在默认状态下对此表进行全表查询的计划用时:

SQL> EXPLAIN PLAN FOR2  SELECT  *  FROM  inp_bill_detail ;已解释。SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------
Plan hash value: 1223321316
-------------------------------------------------------------------------------------
| Id  | Operation         | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                 |    23M|  4362M|   204K  (2)| 00:40:54 |
|   1 |  TABLE ACCESS FULL| INP_BILL_DETAIL |    23M|  4362M|   204K  (2)| 00:40:54 |
-------------------------------------------------------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

  可以看到进行全表查询的预计执行时间为40分54秒。

3.将并行度设置为8,测试在此状态下进行全表查询的计划用时:

SQL> EXPLAIN PLAN FOR
  2  SELECT  /*+PARALLEL(8)*/ *  FROM  inp_bill_detail ;已解释。SQL> SELECT × FROM TABLE(dbms_xplan.display);PLAN_TABLE_OUTPUT
---------------------------------------------------------------------
Plan hash value: 2466333535
---------------------------------------------------------------------
| Id  | Operation            | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                 |    23M|  4362M| 28341   (2)| 00:05:41 |
|   1 |  PX COORDINATOR      |                 |       |       |            |          |
|   2 |   PX SEND QC (RANDOM)| :TQ10000        |    23M|  4362M| 28341   (2)| 00:05:41 |
|   3 |    PX BLOCK ITERATOR |                 |    23M|  4362M| 28341   (2)| 00:05:41 |
|   4 |     TABLE ACCESS FULL| INP_BILL_DETAIL |    23M|  4362M| 28341   (2)| 00:05:41 |
---------------------------------------------------------------------Note
-----
   - Degree of Parallelism is 8 because of hint
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

  可以看到将并行度设置为8后,进行全表查询的预计执行时间大大缩短到5分41秒,效率提升近七倍。 

值得注意的是,在实际使用中,计算机除了运行Oracle外,同时还在运行其他程序(如系统程序)。因此,用PARALLEL调用CPU线程值应设定为小于最大CPU线程的数值(笔者一般采用的值为:CPU线程总数-2)以避免将所有CPU资源强行分配给Oracle使用后导致系统无响应等情况发生。


转载地址:http://blog.csdn.net/keueng/article/details/50817914

http://www.lryc.cn/news/2412557.html

相关文章:

  • /dev/null的总结
  • Ubuntu chmod 命令修改文件chmod读写权限
  • LDAP服务器搭建Linux
  • 中国互联网公司员工平均年龄出炉,平均年龄最低 27 岁,最高 33 岁
  • 数据库系统课设--人事管理系统
  • 我发的文章变成了0和1,那0和1是怎么发送给你的?计算机网络(二)物理层
  • 矢量图形引擎库VectorDraw Developer Framework 更新v7.7011.0.3
  • 据说这是北大教师孔庆东的韩国游记
  • 2024护网热门面试题总结(精华版)
  • SVN用户操作手册
  • ASN1 基础知识4
  • SAP ABAP 查找更改文档对象(SCDO)和表关系的在线字典1/2(全)
  • 火遍全国的网络热梗“yyds”,创造者被判刑3年
  • 贵州省2021年理科高考成绩查询,2021年贵州高考后多久能查到分数,贵州高考成绩查询时间...
  • 绍兴14岁女孩被德云社录取,她究竟有什么来历呢?
  • HTTP 状态码(网页错误代码)
  • HTML中正确设置表格table边框border的三种办法
  • apn描述文件下载_iOS 14/iPadOS14升级方法,附开发者预览版及公测版描述文件下载...
  • 如何正确做 Web 应用的压力测试?
  • 开源淘客APP源码抖客京东客多多客uniapp开发模板
  • 基于Java+MySQL+SpringBoot纺织品企业财务管理系统设计与实现
  • 【Android进阶学习】Android-广播接收器(Broadcast-Receivers)
  • OpenStack组件详解——Nova
  • 一周新闻纵览:100款App违法采集个人信息 ;三部门规范网络音视频信息服务;
  • rfid超高频与高频区别
  • 4.4、配置交换机vlan
  • 常用12个自动化测试工具
  • 加密算法先锋 —— MD5算法
  • CMMI 4高级别过程改进案例介绍
  • 大学生必备软件免费自学视频教程,让那些培训班都见鬼去吧