我在 Oracle 11gR2 数据库上运行来自 TOAD 的查询。在查询运行时(根据并行度需要 60 到 400 秒),我从 TOAD 的会话浏览器中检查了它的状态,当我第一次查看会话时,我意识到并行度可以在执行过程中改变浏览器似乎查询有16个并行度,当我刷新屏幕时它可能变成8,或2,或1。或者它可能增加到32。
是否有一种机制可以在 Oracle 上运行时更改查询的并行度,或者 TOAD 在显示会话的并行度时是否出现故障?
可以从 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
这是一个非常有趣的设置,我建议您通过整个过程,因为它非常有用
我认为您在这里看到的是不同程度的并行性,因为查询中的不同操作都有自己的程度。扫描不同的表会涉及到不同的度数,基于连接结果集的合并可能与连接本身有不同的度数。
一个经常被遗忘的问题是 PQ 从属的数量通常是查询并行度的两倍,因为读取表是在表的 DoP 处执行的,但可能需要另一组从属来消耗行(对于聚合,例如)。