运用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

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

PARALLEL的运用实例

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

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

SQL> show parameters cpu

NAME                                       TYPE        VALUE
------------------------------------   -----------    -------
cpu_count                                integer         8
parallel_threads_per_cpu                 integer         2
resource_manager_cpu_allocation          integer         8

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

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

SQL> EXPLAIN PLAN FOR
   2  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 |
-------------------------------------------------------------------------------------

  可以看到进行全表查询的预计执行时间为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

  可以看到将并行度设置为8后,进行全表查询的预计执行时间大大缩短到5分41秒,效率提升近七倍。
值得注意的是,在实际使用中,计算机除了运行Oracle外,同时还在运行其他程序(如系统程序)。因此,用PARALLEL调用CPU线程值应设定为小于最大CPU线程的数值(笔者一般采用的值为:CPU线程总数-2)以避免将所有CPU资源强行分配给Oracle使用后导致系统无响应等情况发生。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值