Oracle并行操作之并行查询实例解析

Oracle数据库的并行操作特性,其本质上就是强行榨取除数据库服务器空闲资源(主要是CPU资源),对一些高负荷大数据量数据进行分治处理。并行操作是一种非确定性的优化策略,在选择的时候需要小心对待。目前,使用并行操作特性的主要有下面几个方面:

Parallel Query:并行查询,使用多个操作系统级别的Server Process来同时完成一个SQL查询;
Parallel DML:并行DML操作。类似于Parallel Query。当要对大数据量表进行DML操作,如insert、update和delete的时候,可以考虑使用;
Parallel DDL:并行DDL操作。如进行大容量数据表构建、索引rebuild等操作;
Parallel Recovery,并行恢复。当数据库实例崩溃重新启动,或者进行存储介质恢复的时候,可以启动并行恢复技术。从而达到减少恢复时间的目的;
Procedural Parallel,过程代码并行化。对我们编写的代码片段、存储过程或者函数,可以实现执行的并行化,从而加快执行效率;
 
1、并行查询Parallel Query
 
Oracle数据库的并行查询是比较基础的技术,也是OLAP和Oracle Data Warehouse经常使用的一种并行技术。同本系列前面一直强调的要素相同,在确定使用并行技术之前,要确定软硬件的一些先决条件:
 
任务task必要条件。备选进行并行操作的任务task必须是一个大任务作业,比如,长时间的查询。任务时间通常可以以分钟、小时进行计数。只有这样的任务和需要,才值得让我们冒险使用并行操作方案;
资源闲置条件。只有在数据库服务器资源存在闲置的时候,才可以考虑进行并行处理。如果经常性的繁忙,贸然使用并行只能加剧资源的争用。

并行操作最大的风险在于并行争用引起的效率不升反降。所以,要在确定两个前提之后,再进行并行规划处理。

2、环境准备

首先,准备实验环境。由于笔者使用的一般家用PC虚拟机,所以并行度和存储量不能反映真实条件需求,见谅。

SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> select count(*) from t;
 COUNT(*)
----------
1160704

选择11gR2服务器环境,数据表T总数据量超过一百万。
 
首先,我们观察一下不使用并行的执行情况。

//提取出使用游标信息;
SQL> select sql_text, sql_id, version_count from v$sqlarea where sql_text like 'select count(*) from t%';
SQL_TEXT            SQL_ID    VERSION_COUNT
------------------------------ ------------- -------------
select count(*) from t     2jkn7rpsbj64t       2
SQL> select * from table(dbms_xplan.display_cursor('2jkn7rpsbj64t',format => 'advanced', cursor_child_no => 0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 2jkn7rpsbj64t, child number 0
-------------------------------------
select count(*) from t
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id | Operation     | Name | Rows | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|  0 | SELECT STATEMENT  |   |    | 4464 (100)|     |
|  1 | SORT AGGREGATE  |   |   1 |      |     |
|  2 |  TABLE ACCESS FULL| T  | 1160K| 4464  (1)| 00:00:54 |
------------------------------------------------------------------- 

该执行计划中没有使用并行特性,进行全表扫描。执行时间为54s。
 
3、并行查询计划
 
首先,我们设置相应的并行度。设置并行度有两种方式,一种是使用hint加在特定的SQL语句上。另一种是对大对象设置并行度属性。
 
前者的优点是带有一定的强制性和针对性。就是指定特定的SQL语句进行并行处理。这样的优点是易于控制并行度,缺点是带有很强的强制力,当数据量偏小的时候,使用并行优势不大。而且如果是显示指定并行度,又会带来移植伸缩性差的缺点。
 
后者通过对象的属性指定并行度。就将并行作为一种执行手段,提供给优化器进行选择。这样,CBO会根据系统中资源的情况和数据的实际,进行执行计划生成。计划中可能是并行,也可能不是并行。这样的优点是将并行与否交予优化器CBO去判断,缺点是并行的滥用风险。
 
此处,笔者设置自动确定并行度的方式。

SQL> alter table t parallel;
Table altered
SQL> select count(*) from t;
 COUNT(*)
----------
1160704

当启动查询时,Oracle中的并行伺候进程池会根据系统中的负荷和实际因素,确定分配出的并行进程数量。此时,我们可以通过视图v$px_process来查看进程池中的连接信息。

SQL> select * from v$px_process;
SERVER_NAME STATUS      PID SPID       SID  SERIAL#
----------- --------- ---------- ------------------------ ---------- ----------
P000    AVAILABLE     25 5776
P001    AVAILABLE     26 5778 

注意,并行伺候进程是一种特殊的Server Process,本质上是一种可共享的slave进程。专用连接模式下,一般的Server Process与Client Process是“同生共死”的关系,终身服务于一个Client Process。而伺候slave进程是通过进程池进行管理的,一旦启动初始化,就会在一定时间内驻留在系统中,等待下次并行处理到来。
 
此时,我们检查v$process视图,也可以找到对应的信息。

SQL> select * from v$process;
PID SPID     PNAME USERNAME      SERIAL# PROGRAM
-------- ---------- ------------------------ ----- --------------- ---------- -------------------------------
25 5776      P000 oracle         13 oracle@oracle11g (P000)
26 5778      P001 oracle          6 oracle@oracle11g (P001)
(篇幅由于原因,予以省略……)
32 rows selected

对应的OS中,也存在相应的真实进程伺候。

[oracle@oracle11g ~]$ ps -ef | grep oracle
(篇幅由于原因,予以省略……)
oracle  5700   1 0 17:29 ?    00:00:02 oraclewilson (LOCAL=NO)
oracle  5723   1 0 17:33 ?    00:00:00 ora_smco_wilson
oracle  5764   1 2 17:40 ?    00:00:05 oraclewilson (LOCAL=NO)
oracle  5774   1 0 17:42 ?    00:00:00 oraclewilson (LOCAL=NO)
oracle  5776   1 0 17:43 ?    00:00:00 ora_p000_wilson
oracle  5778   1 0 17:43 ?    00:00:00 ora_p001_wilson
oracle  5820   1 1 17:44 ?    00:00:00 ora_w000_wilson

由于此时查询已经结束,对应的并行会话信息,已经消失不可见。

SQL> select * from v$px_session;
SADDR      SID  SERIAL#   QCSID QCSERIAL#
-------- ---------- ---------- ---------- ----------

但是,如果任务的时间长,是可以捕获到对应信息的。
 
从上面的情况看,我们执行一个并行操作时,Oracle会从伺候进程池中获取到对应的并行进程,来进行操作。当操作完成后,伺候进程还会等待一定时间,之后回收。
 
并行操作进程的资源消耗,通过v$px_sysstat视图查看。

SQL> col statistic for a30;
SQL> select * from v$px_process_sysstat;
STATISTIC              VALUE
------------------------------ ----------
Servers In Use             0
Servers Available            0
Servers Started             2
Servers Shutdown            2
Servers Highwater            2
Servers Cleaned Up           0
Server Sessions             6
Memory Chunks Allocated         4
Memory Chunks Freed           0
Memory Chunks Current          4
Memory Chunks HWM            4
Buffers Allocated           30
Buffers Freed             30
Buffers Current             0
Buffers HWM               8
15 rows selected

下面,我们检查一下执行计划信息。

SQL> set pagesize 10000;
SQL> select * from table(dbms_xplan.display_cursor('2jkn7rpsbj64t',format => 'advanced',cursor_child
_no => 1));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID 2jkn7rpsbj64t, child number 1
-------------------------------------
select count(*) from t
Plan hash value: 3126468333
----------------------------------------------------------------------------------------------------
| Id | Operation       | Name   | Rows | Cost (%CPU)| Time   |  TQ |IN-OUT| PQ Distrib
----------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |     |    | 2478 (100)|     |    |   |
|  1 | SORT AGGREGATE    |     |   1 |      |     |    |   |
|  2 |  PX COORDINATOR    |     |    |      |     |    |   |
|  3 |  PX SEND QC (RANDOM) | :TQ10000 |   1 |      |     | Q1,00 | P->S | QC (RAND)
|  4 |   SORT AGGREGATE   |     |   1 |      |     | Q1,00 | PCWP |
|  5 |   PX BLOCK ITERATOR |     | 1160K| 2478  (1)| 00:00:30 | Q1,00 | PCWC |
|* 6 |    TABLE ACCESS FULL| T    | 1160K| 2478  (1)| 00:00:30 | Q1,00 | PCWP |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
6 - access(:Z>=:Z AND :Z<=:Z)

从执行计划的条件(6 - access(:Z>=:Z AND :Z<=:Z))中,我们可以看到任务分配,之后分别进行全表扫描。最后排序计算count,合并结果的过程。
 
4、结论
 
Oracle Parallel Query是经常使用到的一种并行操作技术。相对于DDL、DML等类型操作,并行查询更可以作为系统功能的一个步骤来进行。
 
进行并行查询最大的风险就是并行滥用和失控的出现。这也是Oracle一直致力解决的问题。在Oracle11gR2中,引入了Parallel Statement Queuing(PSQ)技术特性。通常,只要并行伺候池允许,Oracle会引入尽可能多的并行进程进行操作。PSQ技术的出现,就是从资源角度加入了并行控制。
 
当系统繁忙的时候,PSQ会将一些要进行的并行操作进入等待状态,防止并行环境的恶化。当环境好转之后,等待队列中的并行语句就进入执行状态。这个特性就可以有效的防止并行滥用的出现。

(0)

相关推荐

  • Oracle中scott表结构与简单查询实例分析

    本文实例讲述了Oracle中scott表结构与简单查询的方法.分享给大家供大家参考.具体分析如下: 1.scott用户的表的结构 查看表结构 desc 表名;//desc emp; emp表: SQL> desc emp; 名称 是否为空? 类型 ----------------- -------- ------------ EMPNO NOT NULL NUMBER(4) 雇员编号 ENAME VARCHAR2(10) 雇员姓名 JOB VARCHAR2(9) 雇员职位 MGR NUMBER(

  • 45个非常有用的 Oracle 查询语句小结

    日期/时间 相关查询 1.获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 "SYSDATE"来指定查询的日期. 复制代码 代码如下: SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"     FROM DUAL; 2.获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 .你可以用任

  • ORACLE学习笔记-查询篇

    一.普通查询 /*查询表数据*/ select * from STU /*取出前3行数据*/ select * from stu where ROWNUM<=3 /*模糊查询*/ select * from stu where stu_id like 'stu001%' 说明:通配符"%"代表一个或者多个字符,通配符"_"代表一个字符. /*别名*/ select STU_ID as 学号 from stu 二.联合查询 /*普通联合查询*/ SELECT S

  • Oracle 跨库 查询 复制表数据 分布式查询介绍

    方法一: 在目前绝大部分数据库有分布式查询的需要.下面简单的介绍如何在oracle中配置实现跨库访问. 比如现在有2个数据库服务器,安装了2个数据库.数据库server A和B.现在来实现在A库中访问B的数据库. 第一步.配置A服务器端的tnsnames.ora文件(TNSNAMES.ORA Network Configuration File),该文件存放的位置为: $ORACLE_HOME/network/admin/tnsnames.ora 添加如下行,其中DBLINK为连接名(可自定义)

  • oracle查询字符集语句分享

    (1)查看字符集(三条都是等价的) 复制代码 代码如下: select * from v$nls_parameters  where parameter='NLS_CHARACTERSET'select * from  nls_database_parameters where parameter='NLS_CHARACTERSET'select * from props$ where name='NLS_CHARACTERSET' (2)查看国家字符集(三条都是等价的) 复制代码 代码如下:

  • oracle通过行范围查询取4至10行

    不能直接用rownum,要查询出来以后用别名转换. 以EMP表为范例,取4至10行: select * from (select rownum id,t.* from emp t) where id between 4 and 10; 有需要排序的,一定要这样处理: select * from ( select rownum rn,t.* from ( select a.* from eba02 a order by eba003) t where rownum <= 110) where rn

  • oracle通过行范围查询取4至10行并排序

    不能直接用rownum,要查询出来以后用别名转换. 以EMP表为范例,取4至10行: select * from (select rownum id,t.* from emp t) where id between 4 and 10; 有需要排序的,一定要这样处理: select * from ( select rownum rn,t.* from ( select a.* from eba02 a order by eba003) t where rownum <= 110) where rn

  • Oracle中查看慢查询进度的脚本分享

    Oracle一个大事务的SQL往往不知道运行到了哪里,可以使用如下SQL查看执行进度. 复制代码 代码如下: set linesize 400; set pagesize 400; col sql_text format a100; col opname format a15; SELECT se.sid,          opname,          TRUNC (sofar / totalwork * 100, 2) pct_work,          elapsed_seconds

  • Oracle CBO几种基本的查询转换详解

    在执行计划的开发过程中,转换和选择有这个不同的任务:实际上,在一个查询进行完语法和权限检查后,首先发生通称为"查询转换"的步骤,这里会进行一系列查询块的转换,然后才是"优选"(优化器为了决定最终的执行计划而为不同的计划计算成本从而选择最终的执行计划). 我们知道查询块是以SELECT关键字区分的,查询的书写方式决定了查询块之间的关系,各个查询块通常都是嵌在另一个查询块中或者以某种方式与其相联结:例如: 复制代码 代码如下: select * from employe

  • Oracle并行操作之并行查询实例解析

    Oracle数据库的并行操作特性,其本质上就是强行榨取除数据库服务器空闲资源(主要是CPU资源),对一些高负荷大数据量数据进行分治处理.并行操作是一种非确定性的优化策略,在选择的时候需要小心对待.目前,使用并行操作特性的主要有下面几个方面: Parallel Query:并行查询,使用多个操作系统级别的Server Process来同时完成一个SQL查询: Parallel DML:并行DML操作.类似于Parallel Query.当要对大数据量表进行DML操作,如insert.update和

  • mysql oracle和sqlserver分页查询实例解析

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一).mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: selecto.*from(sql)o limit firstIndex,pageSize 如下面的截图,每页显示的记录数为20: 查询(1-20)这20条记录 查询(21-40)这20条记录 mysql的分页查询就这么简单...... (二).sqls

  • oracle多表简单查询实例代码

    目录 多表查询基本语法 oracle多表查询 总结 多表查询基本语法 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合. -- 笛卡尔积 select * from emp, dept; oracle多表查询 prompt Importing table dept... set feedback off set define off insert into dept (DEPT

  • Oracle游标使用参考语句实例解析

    游标是从表中检索出结果集,从中每次指向一条记录进行交互的机制. 作用 指定结果集中特定行的位置. 基于当前的结果集位置检索一行或连续的几行. 在结果集的当前位置修改行中的数据. 对其他用户所做的数据更改定义不同的敏感性级别. 可以以编程的方式访问数据库. 一个简单实用: Declare -- 声明游标 Cursor Mycur Is Select * From Emp; Empinfo Emp%Rowtype; Cou Number; Begin -- 游标操作使用循环,但是在操作之前必须先将游

  • 用Oracle并行查询发挥多CPU的威力

    正在看的ORACLE教程是:用Oracle并行查询发挥多CPU的威力.参数 让我们进一步看看CPU的数量是如何影响这些参数的. 参数fast_start_parallel_rollback Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚得能力.当Oracle数据库发生少有的崩溃时,Oracle能自动检测未完成的事务并回滚到起始状态.这被称为并行热启动,而Oracle使用基于cpu_count的fast_start_parallel_rollback参数来决定未完成事务的秉性程度

  • MYSQL子查询和嵌套查询优化实例解析

    查询游戏历史成绩最高分前100 Sql代码 SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=(select MAX(credits) FROM cdb_playsgame ps1 where ps.uid=ps1.uid AND ps.gametag=ps1.gametag) AND ps.gametag='yeti3' GROUP BY ps.uid order by ps.credits desc LIMIT 100; Sql代码 SEL

  • Oracle数据库并行查询出错的解决方法

    Oracle的并行查询是使用多个操作系统级别的Server Process来同时完成一个SQL查询,本文讲解Oracle数据库并行查询出错的解决方法如下: 1.错误描述 ORA-12801: 并行查询服务器P007中发出错误信号 ORA-01722:无效数字 12801.00000 -"error signaled in parallel query server %s" *Cause: A parallel query server reached an exception cond

  • 通过实例解析java8中的parallelStream

    这篇文章主要介绍了通过实例解析java8中的parallelStream,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作:高级版本的 Stream

  • oracle横向纵向求和代码实例

    有一张工资表SALARY如下, (NO 员工编号 ,MONEY 工资) NO    NAME     ITEM       MONEY 001    张三        工资        80 001    张三        补贴        86 001    张三        奖金        75 002    李四        工资        78 002    李四        补贴        85 002    李四        奖金        78 求每

  • Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w

随机推荐