了解 Oracle 并行性最重要的一点是它很复杂。优化并行性需要大量的 Oracle 知识、阅读手册、检查许多参数、测试长时间运行的查询以及大量的怀疑精神。
提出正确的问题
并行问题实际上涉及三个不同的问题:
- 请求了多少个并行服务器?
- 分配了多少个并行服务器?
- 有多少并行服务器被有效使用?
使用最好的工具
Go straight to the best tool - SQL Monitoring with active reports. Find your SQL_ID and generate the HTML report: select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;
. This is the only way to know how much time was spent on each step in the execution plan. And it will tell you how much parallelism was effectively used, and where. For example:
另一个不错的选择是type => 'text'
。它没有那么多信息,但查看起来更快,也更容易共享。
SQL Monitoring also includes the DOP requested and the DOP allocated:
100线平行select
可能会运行得很好,但是由于未缓存的序列,一切都会在一步中停止。您可以盯着解释计划、跟踪或 AWR 报告几个小时,却看不到问题。活跃的报告使得缓慢的步骤变得几乎微不足道。不要浪费时间猜测问题出在哪里。
然而,仍然需要其他工具。生成的解释计划explain plan for ...
and select * from table(dbms_xplan.display)
;将提供一些关键信息。具体来说Notes
部分可以包含查询不请求并行性的许多原因。
但为什么我要获得这么多并行服务器呢?
相关信息分布在几个不同的手册中,这些手册非常有用,但有时不准确或具有误导性。关于并行性有很多误解和很多不好的建议。每个版本的技术都会发生显着变化。
当您将所有信誉良好的来源放在一起时,影响并行服务器数量的因素列表非常大。下面的列表大致按我认为最重要的因素排序:
-
操作间并行性任何使用排序或分组的查询将分配两倍于 DOP 的并行服务器。这可能就是“Oracle 分配尽可能多的并行服务器!”这一神话的原因。
-
查询提示最好是语句级提示,例如
/*+ parallel */
,或者可能是对象级提示,例如/*+ noparallel(table1) */
。如果计划的特定步骤连续运行,通常是因为仅对部分查询进行了对象级提示。
-
递归SQL某些操作可能并行运行,但可以通过递归 SQL 有效地序列化。例如,大型插入上的未缓存序列。生成解析语句的递归SQL也将是串行的;例如动态采样查询。
-
改变会话
alter session [force|enable] parallel [query|dml|ddl];
请注意,默认情况下禁用并行 DML。
- 表度
- 指标度
-
指数更便宜并行提示仅告诉优化器考虑使用特定 DOP 进行全表扫描。它们实际上并不强制并行。如果优化器认为串行索引访问更便宜,它仍然可以自由地使用它。 (这
FULL
提示可能有助于解决这个问题。)
-
计划管理SQL 计划基线、大纲、概要文件、高级重写和 SQL 翻译器都可以在您背后改变并行度。检查计划的注释部分。
-
Edition只有企业版和个人版允许并行操作。除了包裹DBMS_PARALLEL_EXECUTE.
- PARALLEL_ADAPTIVE_MULTI_USER
- 并行自动调整
- PARALLEL_DEGREE_LIMIT
- PARALLEL_DEGREE_POLICY
- PARALLEL_FORCE_LOCAL
- 并行实例组
- PARALLEL_IO_CAP_ENABLED
-
PARALLEL_MAX_SERVERS这是整个系统的上限。这里有一个权衡。同时运行太多并行服务器对系统不利。但是对于某些查询来说,将查询降级为串行查询可能会带来灾难性的后果。
- PARALLEL_MIN_PERCENT
- PARALLEL_MIN_SERVERS 个
- PARALLEL_MIN_TIME_THRESHOLD
- PARALLEL_SERVERS_TARGET
- 每个 CPU 并行线程数
-
RAC节点数量默认 DOP 的另一个乘数。
-
CPU_COUNT如果使用默认的 DOP。
- 恢复并行
- FAST_START_PARALLEL_ROLLBACK
-
Profile
SESSIONS_PER_USER
还限制并行服务器。
- 资源管理器
-
系统负载如果parallel_adaptive_multi_user为true。可能无法猜测 Oracle 何时会开始限制。
- 流程
-
Parallel DML restrictions Parallel DML will not work if any of these cases:
- 对于分区内兼容
- INSERT VALUES,带有触发器的表
- 复制
- 自引用完整性或删除级联或延迟完整性约束
- 访问对象列
- 带有 LOB 的非分区表
- 具有 LOB 的分区内并行性
- 分布式事务
- 聚簇表
- 临时表
-
标量子查询不并行运行?这是手册上的,我希望这个was确实如此,但我的测试表明并行性在 11g 中有效。
-
排队资源10g 中的隐藏参数,这还有关系吗?
-
索引组织表无法并行直接路径插入到物联网吗? (这仍然是真的吗?)
-
并行流水线功能需求必须使用一个
CURSOR
(?)。去做。
- 函数必须是 PARALLEL_ENABLE
-
声明类型旧版本根据分区限制 DML 的并行性。当前的一些手册仍然包含这一点,但它肯定不再正确了。
-
分区数量仅适用于旧版本上的分区明智连接。(?)
-
Bugs具体来说,我看到了很多解析错误。 Oracle 将分配正确数量的并行服务器,但什么也不会发生,因为它们都在等待类似的事件
cursor: pin s wait on x
.
这个列表当然不完整,并且不包括 12c 功能。而且它不解决操作系统和硬件问题。而且它没有回答这个极其困难的问题:“最好的并行度是多少?” (简短的回答:通常越多越好,但会牺牲其他流程。)希望它至少能让您了解这些问题有多么困难,并且是一个开始寻找的好地方。