【问题标题】:Is it possible to change a query's parallelism while running on Oracle DB?在 Oracle DB 上运行时是否可以更改查询的并行度?
【发布时间】:2013-01-14 04:54:09
【问题描述】:

我在 Oracle 11gR2 数据库上运行 TOAD 查询。在查询运行时(根据并行度需要 60 到 400 秒),我从 TOAD 的会话浏览器中检查了它的状态,当我第一次查看会话时,我意识到并行度可以在执行过程中改变浏览器好像查询有16并行度,当我刷新屏幕时它可能变成8,或2,或1。或者它可能增加到32。

是否有一种机制可以在 Oracle 上运行时更改查询的并行度,或者 TOAD 在显示会话的并行度时是否出现故障?

【问题讨论】:

  • 顺便说一下,我有 TOAD 版本 11.6.0.43。

标签: oracle plsql toad


【解决方案1】:

可以从 Oracle 数据库请求特定的并行度 (DOP)。例如,您可以在表或索引级别设置固定 DOP:

例如:

ALTER TABLES sales PARALLEL 8;
ALTER TABLE customers PARALLEL 4;

在这种情况下,仅访问 sales 表的查询使用请求的 DOP 8,而访问 customers 表的查询请求的 DOP 为 4。同时访问 sales 和 customers 表的查询使用 8 的 DOP 进行处理,并且可能分配 16 个并行服务器(生产者或消费者);无论何时指定不同的 DOP,Oracle 数据库都会使用更高的 DOP。

如果指定了 PARALLEL 子句但未列出并行度,则对象获取默认 DOP。默认并行度使用公式根据系统配置确定 DOP,如下所示:

对于单个实例,

DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT

对于 Oracle RAC 配置,

DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

默认情况下,INSTANCE_COUNT 是集群中的所有节点。但是,如果您使用 Oracle RAC 服务来限制可以执行并行操作的节点数量,那么参与节点的数量就是属于该服务的节点数量。例如,在 4 节点 Oracle RAC 集群上,每个节点有 8 个 CPU 内核且没有 Oracle RAC 服务,default DOP would be 2 x 8 x 4 = 64

默认的 DOP 算法旨在使用最大资源,并假定如果可以使用更多资源,操作完成得更快。默认并行性针对单用户工作负载。在多用户环境中,不建议使用默认并行。

优化器根据语句的资源需求自动确定语句的 DOP。优化器使用执行计划中所有扫描操作(全表扫描、索引快速全扫描等)的成本来确定语句所需的 DOP。

但是,优化器会限制实际的 DOP,以确保并行服务器进程不会使系统不堪重负。此限制由参数PARALLEL_DEGREE_LIMIT. 设置

为简洁起见,我在这里列出了重要的部分。

Oracle 官方文档中的所有这些以及更多内容 -

http://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel002.htm#BEICCFIE

这是一个非常有趣的设置,我建议你仔细阅读整个过程,因为它很有帮助

【讨论】:

    【解决方案2】:

    我认为您在这里看到的是不同程度的并行性,因为查询中的不同操作各有自己的程度。扫描不同的表会涉及到不同的度数,基于连接结果集的合并可能与连接本身有不同的度数。

    一个经常被遗忘的问题是 PQ 从属的数量通常是查询并行度的两倍,因为读取表是在表的 D.o.P 处进行的。但可能需要另一组从属设备才能使用这些行(例如,对于聚合)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2021-03-13
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多