设为首页 收藏本站
查看: 672|回复: 0

[经验分享] oracle 并行学习 ( 二)

[复制链接]

尚未签到

发表于 2016-7-17 08:34:02 | 显示全部楼层 |阅读模式
  并行查询
   
  下面的操作不管是在查询中还是在子查询中都可以并行的执行:
  1.全表扫描、全分区扫描以及快速全索引扫描
  2.索引完全或范围扫描,但只是在索引被分区的情况下
  3.表连接
  4.集合操作符
  5.排序操作
  6.聚合操作
  以上操作:全表扫描、全分区扫描和快速全索引扫描在并行执行时是使用直接读(direct read)操作,从而可以避开高速缓存。然而,索引完全和范围扫描还是使用普通的物理读。
   
  并行查询默认是启用的。在绘画级别,可以使用下面的SQL语句启用或禁用并行查询:
   
  ALTER SESSION ENABLE PARALLEL QUERY
   
  ALTER SESSION DISABLE PARALLEL QUERY
   
  另外,还可以通过使用下面的SQL语句来启动并行查询,并同时覆盖表或索引级别定义的并行度:
   
  ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4
   
  需要注意的是:提示可以覆盖会话级别的设置。一方面,即使在绘画级别禁用了并行查询,提示可以强制执行一个并行操作。唯一可以用来关闭并行查询的方法是将初始化参数parallel_max_servers设置为0.另一方面,即使在绘画级别强制设置了一个并行度,提示还是可以改变成另外一个并行度。
  查询在会话级别启用或禁用并行:
  select pq_status from v$session where sid=sys_context('userenv','sid')
   
  操作如下:
  创建测试表:
  已用时间:  00: 00: 00.43
LIBIN@orac>
LIBIN@orac>CREATE TABLE t1 AS
  2  SELECT rownum AS id, rpad('*',100,'*') AS pad
  3  FROM dual
  4  CONNECT BY level <= 10000;
  表已创建。
  已用时间:  00: 00: 00.68
LIBIN@orac>
LIBIN@orac>execute dbms_stats.gather_table_stats(user, 't1')
  PL/SQL 过程已成功完成。
  已用时间:  00: 00: 12.20
LIBIN@orac>
LIBIN@orac>DROP TABLE t2;
DROP TABLE t2
           *
第 1 行出现错误:
ORA-00942: table or view does not exist
  
已用时间:  00: 00: 00.09
LIBIN@orac>
LIBIN@orac>CREATE TABLE t2 AS SELECT * FROM t1;
  表已创建。
  已用时间:  00: 00: 01.56
LIBIN@orac>
LIBIN@orac>execute dbms_stats.gather_table_stats(user, 't2')
  PL/SQL 过程已成功完成。
  已用时间:  00: 00: 03.45
LIBIN@orac>
  会话级别显示并行状态
  LIBIN@orac>ALTER SESSION DISABLE PARALLEL QUERY;
  会话已更改。
  已用时间:  00: 00: 00.01
LIBIN@orac>
LIBIN@orac>SELECT pq_status
  2  FROM v$session
  3  WHERE /* sid = sys_context('userenv','sid') */
  4        audsid = sys_context('userenv','sessionid');
PQ_STATUS
----------------
DISABLED
  已用时间:  00: 00: 00.04
  LIBIN@orac>ALTER SESSION ENABLE PARALLEL QUERY;
  会话已更改。
  已用时间:  00: 00: 00.03
LIBIN@orac>SELECT pq_status
  2  FROM v$session
  3  WHERE /* sid = sys_context('userenv','sid') */
  4        audsid = sys_context('userenv','sessionid');
PQ_STATUS
----------------
ENABLED
  已用时间:  00: 00: 00.03
  LIBIN@orac>ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
  会话已更改。
  已用时间:  00: 00: 00.01
LIBIN@orac>
LIBIN@orac>SELECT pq_status
  2  FROM v$session
  3  WHERE /* sid = sys_context('userenv','sid') */
  4        audsid = sys_context('userenv','sessionid');
PQ_STATUS
----------------
FORCED
  已用时间:  00: 00: 00.03
  用提示覆盖会话级别的设置
LIBIN@orac>ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
  会话已更改。
  已用时间:  00: 00: 00.01
LIBIN@orac>explain plan for select /*+ noparallel(t1) */ count(*) from t1;
  已解释。
  已用时间:  00: 00: 00.04
LIBIN@orac>select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
Plan hash value: 3724264953
  -------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |    38   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T1   | 10000 |    38   (0)| 00:00:01 |
-------------------------------------------------------------------
  已选择9行。
  已用时间:  00: 00: 00.40
  LIBIN@orac>ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
  会话已更改。
  已用时间:  00: 00: 00.01
LIBIN@orac>explain plan for select /*+ parallel(t1 4) */ count(*) from t1;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3110199320
  --------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |     1 |    11   (0)| 00:00:01 |        |      |            |
|   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 |          | 10000 |    11   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL| T1       | 10000 |    11   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------
  已选择13行。
  已用时间:  00: 00: 00.11
LIBIN@orac>ALTER SESSION ENABLE PARALLEL QUERY;
  会话已更改。
  已用时间:  00: 00: 00.01
  全表扫描测试
  LIBIN@orac>EXPLAIN PLAN FOR SELECT count(*) FROM t1;
  已解释。
  已用时间:  00: 00: 00.06
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3724264953
  -------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |    38   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T1   | 10000 |    38   (0)| 00:00:01 |
-------------------------------------------------------------------
  已选择9行。
  已用时间:  00: 00: 00.46
  带并行提示的全表扫描
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ parallel(t1 2) */ count(*) FROM t1;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3110199320
  --------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |     1 |    21   (0)| 00:00:01 |        |      |            |
|   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 |          | 10000 |    21   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL| T1       | 10000 |    21   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------
  已选择13行。
  已用时间:  00: 00: 00.07
  并行快速索引扫描测试
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ index_ffs(t1) parallel_index(t1 4) */ count(id) FROM t1;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2596547647
  -------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |          |     1 |     4 |     6   (0)| 00:00:01 |        |      |            |
|   1 |  SORT AGGREGATE           |          |     1 |     4 |            |          |        |      |            |
|   2 |   PX COORDINATOR          |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)    | :TQ10000 |     1 |     4 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE        |          |     1 |     4 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR    |          | 10000 | 40000 |     6   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       INDEX FAST FULL SCAN| I1       | 10000 | 40000 |     6   (0)| 00:00:01 |  Q1,00 | PCWP |            |
-------------------------------------------------------------------------------------------------------------------
  已选择13行。
  已用时间:  00: 00: 00.09
  并行索引完全扫描
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ index(t1) parallel_index(t1 4) */ count(id) FROM t1;
  已解释。
  已用时间:  00: 00: 00.15
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2594672137
  -------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     4 |    22   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |      |     1 |     4 |            |          |
|   2 |   INDEX FULL SCAN| I1   | 10000 | 40000 |    22   (0)| 00:00:01 |
-------------------------------------------------------------------------
  已选择9行。
  已用时间:  00: 00: 00.07
  索引范围扫描测试
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ index(t1) parallel_index(t1 4) */ * FROM t1 WHERE id > 9000;
  已解释。
  已用时间:  00: 00: 00.04
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1704772559
  ------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |  1000 |   101K|    20   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1   |  1000 |   101K|    20   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I1   |  1000 |       |     4   (0)| 00:00:01 |
------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  2 - access("ID">9000)
  已选择14行。
  已用时间:  00: 00: 00.09
  分区索引并行测试
  LIBIN@orac>CREATE INDEX i1 ON t1 (id) GLOBAL PARTITION BY HASH (id) PARTITIONS 4;
  索引已创建。
  已用时间:  00: 00: 00.34
  索引完全扫描,并行度为4
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ index(t1) parallel_index(t1 4) */ count(id) FROM t1;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2520697847
  -----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |          |     1 |     4 |    25   (0)| 00:00:01 |       |       |        |      |            |
|   1 |  SORT AGGREGATE           |          |     1 |     4 |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR          |          |       |       |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM)    | :TQ10000 |     1 |     4 |            |          |       |       |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE        |          |     1 |     4 |            |          |       |       |  Q1,00 | PCWP |            |
|   5 |      PX PARTITION HASH ALL|          | 10000 | 40000 |    25   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWC |            |
|   6 |       INDEX FULL SCAN     | I1       | 10000 | 40000 |    25   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWP |            |
-----------------------------------------------------------------------------------------------------------------------------------
  已选择13行。
  已用时间:  00: 00: 00.09
  索引范围扫描,并行度为4
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ index(t1) parallel_index(t1 4) */ * FROM t1 WHERE id > 9000;
  已解释。
  已用时间:  00: 00: 00.01
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1630224034
  ----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |          |  1000 |   101K|    20   (0)| 00:00:01 |       |       |        |      |            |
|   1 |  PX COORDINATOR                |          |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)          | :TQ10000 |  1000 |   101K|    20   (0)| 00:00:01 |       |       |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX PARTITION HASH ALL       |          |  1000 |   101K|    20   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWC |            |
|   4 |     TABLE ACCESS BY INDEX ROWID| T1       |  1000 |   101K|    20   (0)| 00:00:01 |       |       |  Q1,00 | PCWP |            |
|*  5 |      INDEX RANGE SCAN          | I1       |  1000 |       |     4   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  5 - access("ID">9000)
  已选择17行。
  已用时间:  00: 00: 00.09
  综合测试
  LIBIN@orac>EXPLAIN PLAN FOR SELECT /*+ leading(t1) use_hash(t2) index(t1) parallel_index(t1 2) full(t2) parallel(t2 2) pq_distribute(t2 hash,hash) */ *
  2  FROM t1, t2
  3  WHERE t1.id > 9000 AND t1.id = t2.id+1;
  已解释。
  已用时间:  00: 00: 00.01
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3513713489
  -------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |          |    50 | 10400 |    33   (4)| 00:00:01 |       |       |        |      |            |
|   1 |  PX COORDINATOR                   |          |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)             | :TQ10002 |    50 | 10400 |    33   (4)| 00:00:01 |       |       |  Q1,02 | P->S | QC (RAND)  |
|*  3 |    HASH JOIN BUFFERED             |          |    50 | 10400 |    33   (4)| 00:00:01 |       |       |  Q1,02 | PCWP |            |
|   4 |     PX RECEIVE                    |          |  1000 |   101K|    11   (0)| 00:00:01 |       |       |  Q1,02 | PCWP |            |
|   5 |      PX SEND HASH                 | :TQ10000 |  1000 |   101K|    11   (0)| 00:00:01 |       |       |  Q1,00 | P->P | HASH       |
|   6 |       PX PARTITION HASH ALL       |          |  1000 |   101K|    11   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWC |            |
|   7 |        TABLE ACCESS BY INDEX ROWID| T1       |  1000 |   101K|    11   (0)| 00:00:01 |       |       |  Q1,00 | PCWP |            |
|*  8 |         INDEX RANGE SCAN          | I1       |  1000 |       |     2   (0)| 00:00:01 |     1 |     4 |  Q1,00 | PCWP |            |
|   9 |     PX RECEIVE                    |          |   500 | 52000 |    21   (0)| 00:00:01 |       |       |  Q1,02 | PCWP |            |
|  10 |      PX SEND HASH                 | :TQ10001 |   500 | 52000 |    21   (0)| 00:00:01 |       |       |  Q1,01 | P->P | HASH       |
|  11 |       PX BLOCK ITERATOR           |          |   500 | 52000 |    21   (0)| 00:00:01 |       |       |  Q1,01 | PCWC |            |
|* 12 |        TABLE ACCESS FULL          | T2       |   500 | 52000 |    21   (0)| 00:00:01 |       |       |  Q1,01 | PCWP |            |
-------------------------------------------------------------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  3 - access("T1"."ID"="T2"."ID"+1)
   8 - access("T1"."ID">9000)
  12 - filter("T2"."ID"+1>9000)
  已选择26行。
  已用时间:  00: 00: 00.14

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245127-1-1.html 上篇帖子: ORACLE下如何创建DBLink 下篇帖子: oracle 并行学习 (三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表