在 PARALLEL QUERY/DML/DDL 中使用 FORCE、ENABLE、DISABLE 关键字有什么区别

What is the Difference in using FORCE, ENABLE, DISABLE keyword in PARALLEL QUERY/DML/DDL

以下语句有什么区别

ALTER SESSION FORCE   PARALLEL QUERY;
ALTER SESSION ENABLE  PARALLEL DDL;
ALTER SESSION DISABLE PARALLEL DML;

从优化的角度来说,更推荐哪一个。最初,我使用的是 DISABLE,后来我用 ENABLE 进行了测试,它的性能更好,现在 FORCE 的性能更好。在任何情况下,FORCE 是否有可能适得其反。

请参考http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2013.htm

并行 DML |动态描述语言 |查询

PARALLEL 参数确定会话中所有后续的 DML、DDL 或查询语句是否将被考虑并行执行。此子句使您能够在当前会话期间覆盖 tables 的并行度,而无需更改 tables 本身。在为 DML 执行此子句之前,必须提交或回滚未提交的事务。

启用子句

指定启用以并行执行会话中的后续语句。这是 DDL 和查询语句的默认值。 • DML:如果指定了并行提示或并行子句,则 DML 语句以并行模式执行。

• DDL:如果指定了并行子句,则DDL语句以并行模式执行。

• QUERY:如果指定了并行提示或并行子句,查询将以并行模式执行。

ENABLE 子句的限制不能用 ENABLE 指定可选的 PARALLEL 整数。

禁用子句

指定 DISABLE 以串行执行会话中的后续语句。这是 DML 语句的默认值。 • DML:DML语句串行执行。

• DDL:DDL语句串行执行。

• QUERY:查询是串行执行的。

DISABLE 子句的限制您不能使用 DISABLE 指定可选的 PARALLEL 整数。

FORCE 条款

FORCE 强制并行执行会话中的后续语句。如果未指定并行子句或提示,则使用默认的并行度。此子句覆盖会话中后续语句中指定的任何 parallel_clause,但被并行提示覆盖。 • DML:如果不违反并行 DML 限制,会话中的后续 DML 语句将以默认并行度执行,除非在此子句中指定了并行度。

• DDL:会话中的后续 DDL 语句以默认并行度执行,除非在该子句中指定了并行度。生成的数据库对象将具有与其相关联的普遍并行度。

指定 FORCE DDL 会自动导致在此会话中创建的所有 tables 以默认的并行级别创建。效果与在 CREATE TABLE 语句中指定 parallel_clause(具有默认度数)相同。

• QUERY:后续查询将以默认并行度执行,除非在此子句中指定了并行度。

PARALLEL integer 指定一个整数以明确指定并行度: • 对于 FORCE DDL,度数覆盖后续 DDL 语句中的任何并行子句。

• 对于 FORCE DML 和 QUERY,度数覆盖当前存储在数据字典中的 table 的度数。

• 通过提示在语句中指定的度数将覆盖强制的度数。

无论此子句如何,以下类型的 DML 操作都不会并行化: • 集群 tables

上的操作

• 具有写入或读取数据库或包状态的嵌入式函数的操作

• 对 tables 的操作可能会触发

• 对 table 或包含对象类型或 LONG 或 LOB 数据类型的模式对象的操作