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

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

[复制链接]

尚未签到

发表于 2016-7-17 08:41:05 | 显示全部楼层 |阅读模式
  提示parallel和parallel_index并不会强制查询优化器使用并行处理,理解这一点很重要。它们会覆盖掉表或索引级别定义的并行度。相应地,这个变化将容许查询优化器考虑是否用指定的并行度来并行处理。查询优化器将考虑有以及没有并行处理的情况,并照常选择开销较低的那个执行计划。
  
  示例如下:
  LIBIN@orac>CREATE TABLE t
  2  AS
  3  SELECT rownum AS id, rpad('*',100,'*') AS pad
  4  FROM dual
  5  CONNECT BY level <= 100000;
  表已创建。
  已用时间:  00: 00: 02.95
LIBIN@orac>CREATE INDEX i ON t (id);
  索引已创建。
  已用时间:  00: 00: 09.20
LIBIN@orac>
LIBIN@orac>execute dbms_stats.gather_table_stats(ownname => user, tabname => 't')
  PL/SQL 过程已成功完成。
  已用时间:  00: 00: 04.85
LIBIN@orac>DELETE plan_table;
  已删除0行。
  已用时间:  00: 00: 00.12
  查看设置不同的并行度情况下,全表扫描的成本花费
  随着并行度的增加,全表扫描的成本成比例地下降
  LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop1' FOR
  2  SELECT /*+ full(t) parallel(t 1) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.14
LIBIN@orac>
LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop2' FOR
  2  SELECT /*+ full(t) parallel(t 2) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.20
LIBIN@orac>
LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop3' FOR
  2  SELECT /*+ full(t) parallel(t 3) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.18
LIBIN@orac>
LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop4' FOR
  2  SELECT /*+ full(t) parallel(t 4) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>
LIBIN@orac>SELECT statement_id, cost
  2  FROM plan_table
  3  WHERE id = 0
  4  ORDER BY statement_id;
STATEMENT_ID                                                       COST
------------------------------------------------------------ ----------
dop1                                                                350
dop2                                                                194
dop3                                                                129
dop4                                                                 97
  已用时间:  00: 00: 00.07
例如下面SQL语句,如果SQL语句在没有提示并且并行度为1的情况下执行,查询优化器将选择索引范围扫描。
LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop1' FOR SELECT * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.06
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 242607798
  ------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |  9910 |  1016K|   179   (1)| 00:00:03 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |  9910 |  1016K|   179   (1)| 00:00:03 |
|*  2 |   INDEX RANGE SCAN          | I    |  9993 |       |    24   (0)| 00:00:01 |
------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  2 - access("ID">90000)
  已选择14行。
  已用时间:  00: 00: 01.78
例如下面SQL语句,如果SQL语句在添加提示并且并行度为2的情况下执行,COSE还是179,查询优化器继续选择索引范围扫描。
LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop1' FOR SELECT /*+ parallel(t 2) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.06
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 242607798
  ------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |  9910 |  1016K|   179   (1)| 00:00:03 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |  9910 |  1016K|   179   (1)| 00:00:03 |
|*  2 |   INDEX RANGE SCAN          | I    |  9993 |       |    24   (0)| 00:00:01 |
------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  2 - access("ID">90000)
  已选择14行。
  已用时间:  00: 00: 00.12
例如下面SQL语句,如果SQL语句在添加提示并且并行度为3的情况下执行,COSE是129,查询优化器选择了一个并行的全表扫描.
  LIBIN@orac>EXPLAIN PLAN SET STATEMENT_ID 'dop1' FOR SELECT /*+ parallel(t 3) */ * FROM t WHERE id > 90000;
  已解释。
  已用时间:  00: 00: 00.03
LIBIN@orac>SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3050126167
  --------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          |  9910 |  1016K|   129   (1)| 00:00:02 |        |      |            |
|   1 |  PX COORDINATOR      |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |  9910 |  1016K|   129   (1)| 00:00:02 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |          |  9910 |  1016K|   129   (1)| 00:00:02 |  Q1,00 | PCWC |            |
|*  4 |     TABLE ACCESS FULL| T        |  9910 |  1016K|   129   (1)| 00:00:02 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------------
  Predicate Information (identified by operation id):
---------------------------------------------------
  4 - filter("ID">90000)
  已选择16行。
  已用时间:  00: 00: 00.12

运维网声明 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-245132-1-1.html 上篇帖子: oracle 并行学习 (四) 下篇帖子: Oracle语句收集
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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