阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 11.2中控制并行的新参数

486次阅读
没有评论

共计 14275 个字符,预计需要花费 36 分钟才能阅读完成。

在 Oracle 11.2 中引入了几个新的并行查询参数。对于数据仓库应用来说经常利用并行处理来快速有效地处理信息,尤其是查询非常大的表或加入了复杂的算式更应该使用并行查询。在 Oracle 之前的版本中,我们不得不或多或秒的来决定自动并行度。决定一个最佳并行度是非常困难的。真实最佳并行度依赖于数据块在磁盘上的物理位置以及服务器的 CPU 数量(cpu_count),为了解决并行查询的这些问题,在 Oracle11.2 中引入了以下新的并行查询参数。

1.parallel_degree_policy
 parallel_degree_policy 参数可以被设置为 manual,auto 或 limited 在 Oracle11.1 中 parallel_degree_policy 缺省设置为 manual(禁用了 automatic degree of parallelism,statement queuing 与 in-memory parallel execution)
SQL> show parameter parallel_degree_policy;

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      manual
SQL> set autotrace on 
SQL> select count(*) from t1;

  COUNT(*)
———-
  22040576

Execution Plan
———————————————————-
Plan hash value: 3724264953

——————————————————————-
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time    |
——————————————————————-
|  0 | SELECT STATEMENT  |      |    1 | 84998  (1)| 00:00:06 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| T1  |    21M| 84998  (1)| 00:00:06 |
——————————————————————-

Note
—–
  – dynamic sampling used for this statement (level=2)

Statistics
———————————————————-
        22  recursive calls
          0  db block gets
    469904  consistent gets
    313229  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed

但我们可以手动指定并行度
SQL> show parameter parallel_degree_policy

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      manual
SQL> set autotrace on
SQL> select /*+ parallel */ count(*) from t1;

  COUNT(*)
———-
  22040576

Execution Plan
———————————————————-
Plan hash value: 3110199320

——————————————————————————————————–
| Id  | Operation              | Name    | Rows  | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
——————————————————————————————————–
|  0 | SELECT STATEMENT      |          |    1 | 47183  (1)| 00:00:04 |        |      |            |
|  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 |          |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWC |            |
|  6 |      TABLE ACCESS FULL| T1      |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWP |            |
——————————————————————————————————–

Note
—–
  – dynamic sampling used for this statement (level=5)
  – automatic DOP: Computed Degree of Parallelism is 2

Statistics
———————————————————-
        20  recursive calls
          4  db block gets
    470138  consistent gets
    313225  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

 

parallel_degree_policy=auto 就会启用以下新功能:
并行度 (DOP) 将会基于 SQL 语句中的操作类型和表的大小来自动计算。例如对大表排序的并行度 (DOP) 可能比对小表操作的并行度高。

如果请求或请求的并行度 (DOP) 因为并行服务进程正处于繁忙状态而不能获得满足,那么 Oracle 直到有足够的并行子进程可用之前将不会执行语句,而不是降低并行度或串行执行 SQL 语句。在 11gr2 之前的版本中,当没有足够的并行进程服务进程满足所请求的并行度 (DOP) 时,可以会出现以下三种情况中的一种:
SQL 语句将会降低并行度 (DOP) 来以并行方式执行
SQL 语句以串行方式来执行
 如果 parallel_min_percent 被设置将收到 ”ORA-12827:insufficient parallel query slaves available”

Oracle 并行子进程可能使用 buffered IO 而不是直接 IO。例如 ”in-memory parallel execution”
SQL> show parameter parallel_degree_policy

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      AUTO

SQL> select degree,instances from user_tables where table_name = ‘T1’;

DEGREE              INSTANCES
——————– ——————–
        1                    1

Elapsed: 00:00:00.00
SQL> set autotrace on
SQL> select count(*) from t1;

  COUNT(*)
———-
  22040576

Elapsed: 00:00:18.50

Execution Plan
———————————————————-
Plan hash value: 3110199320

——————————————————————————————————–
| Id  | Operation              | Name    | Rows  | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
——————————————————————————————————–
|  0 | SELECT STATEMENT      |          |    1 | 47183  (1)| 00:00:04 |        |      |            |
|  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 |          |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWC |            |
|  6 |      TABLE ACCESS FULL| T1      |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWP |            |
——————————————————————————————————–

Note
—–
  – dynamic sampling used for this statement (level=2)
  – automatic DOP: Computed Degree of Parallelism is 2

Statistics
———————————————————-
          0  recursive calls
          0  db block gets
    469841  consistent gets
    313226  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

 

parallel_degree_policy 设置为 limited
对某些语句启用自动并行度,但 statement queuing 与 in-memory parallel execution 被禁用。只会对访问使用 parallel 子句来设置 DEFAULT 并行度的表或索引应用自动并行度。
SQL> select degree,instances from user_tables where table_name = ‘T1’;

DEGREE              INSTANCES
——————– ——————–
        1                    1

SQL> show parameter parallel_degree_policy

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      LIMITED
SQL> set autotrace on;
SQL> select count(*) from t1;

  COUNT(*)
———-
  22040576

Execution Plan
———————————————————-
Plan hash value: 3724264953

——————————————————————-
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time    |
——————————————————————-
|  0 | SELECT STATEMENT  |      |    1 | 84998  (1)| 00:00:06 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| T1  |    21M| 84998  (1)| 00:00:06 |
——————————————————————-

Note
—–
  – dynamic sampling used for this statement (level=2)

Statistics
———————————————————-
          5  recursive calls
          0  db block gets
    469898  consistent gets
    313399  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

因为表的并行度是 1, 而不是 default, 现在使用 parallel 子句来修改表 t1 的并行度
SQL> alter table t1 parallel;

Table altered.

SQL> select degree,instances from user_tables where table_name = ‘T1’;

DEGREE              INSTANCES
——————– ——————–
  DEFAULT              DEFAULT

SQL> set autotrace on
SQL> select count(*) from t1;

  COUNT(*)
———-
  22040576

Execution Plan
———————————————————-
Plan hash value: 3110199320

——————————————————————————————————–
| Id  | Operation              | Name    | Rows  | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
——————————————————————————————————–
|  0 | SELECT STATEMENT      |          |    1 | 47183  (1)| 00:00:04 |        |      |            |
|  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 |          |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWC |            |
|  6 |      TABLE ACCESS FULL| T1      |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWP |            |
——————————————————————————————————–

Note
—–
  – dynamic sampling used for this statement (level=5)
  – automatic DOP: Computed Degree of Parallelism is 2

Statistics
———————————————————-
        83  recursive calls
          0  db block gets
    470167  consistent gets
    313413  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed

 

 

2.parallel_min_time_threshold
 parallel_min_time_threshold 参数用来指定 SQL 语句是否并行执行一个阈值,也就是当优化器根据统计信息所估算的执行时间如果大于这个参数值就是使用并行,如果估算的执行时间小于这个参数值就会串行执行。这个参数值缺省值是 10 秒。并且自动并行度只要在 parallel_degree_policy 参数被设置为 auto 或 limited 时才会生效。从下面的信息可以看到到语句的执行时间小于 10 秒时,优化器以是串行而不是并行方式来执行的
SQL> show parameter parallel_degree_policy

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      AUTO
SQL> set autotrace on
SQL> select count(*) from t1;

  COUNT(*)
———-
  2755072

Elapsed: 00:00:02.66

Execution Plan
———————————————————-
Plan hash value: 3724264953

——————————————————————-
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time    |
——————————————————————-
|  0 | SELECT STATEMENT  |      |    1 | 10627  (1)| 00:00:01 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| T1  |  2569K| 10627  (1)| 00:00:01 |
——————————————————————-

Note
—–
  – dynamic sampling used for this statement (level=2)
  – automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold

Statistics
———————————————————-
          0  recursive calls
          0  db block gets
      57150  consistent gets
      39162  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

再次增加表 t1 的数据记录
SQL> insert into t1 select * from t1;

5510144 rows created.

SQL> commit;

Commit complete.

 

SQL> alter system flush buffer_cache;

System altered.

SQL> set autotrace on
SQL> select count(*) from t1;

  COUNT(*)
———-
  11020288

Elapsed: 00:00:09.05

Execution Plan
———————————————————-
Plan hash value: 3724264953

——————————————————————-
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time    |
——————————————————————-
|  0 | SELECT STATEMENT  |      |    1 | 42507  (1)| 00:00:03 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| T1  |    11M| 42507  (1)| 00:00:03 |
——————————————————————-

Note
—–
  – dynamic sampling used for this statement (level=2)
  – automatic DOP: Computed Degree of Parallelism is 1

Statistics
———————————————————-
          0  recursive calls
          0  db block gets
    223549  consistent gets
    156619  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

可以看到执行时间为 9.05 秒,Oracle 使用串行执行,继续向表 t1 增加记录
SQL> insert into t1 select * from t1;

11020288 rows created.

SQL> commit;

Commit complete.

SQL> alter system flush buffer_cache;

System altered.

SQL> show parameter parallel_degree_policy

NAME                                TYPE        VALUE
———————————— ———– ——————————
parallel_degree_policy              string      AUTO
SQL> select * from V$IO_CALIBRATION_STATUS;

STATUS        CALIBRATION_TIME
————- —————————————————————————
READY        13-APR-16 10.12.58.413 PM

Elapsed: 00:00:00.08
SQL> set autotrace on
SQL> select count(*) from t1;

  COUNT(*)
———-
  22040576

Elapsed: 00:00:18.50

Execution Plan
———————————————————-
Plan hash value: 3110199320

——————————————————————————————————–
| Id  | Operation              | Name    | Rows  | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
——————————————————————————————————–
|  0 | SELECT STATEMENT      |          |    1 | 47183  (1)| 00:00:04 |        |      |            |
|  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 |          |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWC |            |
|  6 |      TABLE ACCESS FULL| T1      |    21M| 47183  (1)| 00:00:04 |  Q1,00 | PCWP |            |
——————————————————————————————————–

Note
—–
  – dynamic sampling used for this statement (level=2)
  – automatic DOP: Computed Degree of Parallelism is 2

Statistics
———————————————————-
          0  recursive calls
          0  db block gets
    469841  consistent gets
    313226  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

现在可以看到当 parallel_degree_policy=auto,parallel_min_time_threshold=auto 时,sql 执行时间超长 10 秒时就会使用自动并行。

3.parallel_degree_limit
使用自动并行度时,Oracle 会自动决定是否以并行方式来执行 SQL 语句以及所使用的并行度。优化根据语句所请求的资源来决定一个语句的并行度。然而优化器所使用的并行度是受限制的以防止并行进程击垮系统。也就是是系统中所能使用的并行度的上限为 parallel_degree_limit 参数值。它有三个参数值可以选择:
CPU
最大并行度由系统中的 CPU 数量来限制。其计算公式为 parallel_degree_limit=parallel_thread_per_cpu*cpu_count
当然,你也可以将 parallel_degree_limit 的值设置为一个具体的值,以达到明确控制实际并行度的目的。

IO
优化器能使用的最大并行度由系统的 I / O 能力来限制。这个值等于系统总吞吐量除以每个进程的最大 I / O 带宽。但在 Oracle 11.2 中为了将 parallel_degree_limit 设置为 IO 必须执行 dbms_resource_manager.calibrate_io 过程来收集系统的 I / O 统计信息。这个过程将会计算系统的总吞吐量与每个进程的最大 IO 带宽。

具体数字
 当自动并行度被激活时,指定一个 SQL 语句所能使用的最大并行度。这个参数只有当 parallel_degree_policy 设置为 auto 或 limited 时才生效。

4.parallel_force_local
 parallel_force_local 参数控制 RAC 环境中的并行执行。缺省情况下,优化器可以从 RAC 中的任何节点或所有节点中选择并行执行 SQL 语句的并行进程。当 parallel_force_local 设置为 true 时,那么并行进程就只能是与查询协调者 (执行 sql 语句的节点) 在同一个 RAC 节点中,也就是说并行进程是不能跨节点的.

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/130545.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计14275字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7802825
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流! 大家好,我是星哥,今天才思枯竭,不写技术文章了!来吐槽一下 CSDN。...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...