Oracle“并行执行”之二——并行执行类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle“并行执行”之二——并行执行类型相关的知识,希望对你有一定的参考价值。

摘自《VLDB and Partitioning Guide》

并行执行主要有以下几种:

1)并行查询

2)并行DDL

3)并行DML

4)并行执行函数

5)其它类型并行

下面分别对其进行介绍,主要包括两方面:能否并行、确定DOP。

1、并行查询

你可以在SELECT语句中并行执行查询和子查询,也可以在DDL和DML语句中并行执行查询部分。你也可以并行查询外部表。并行包括两部分工作:确定是否并行、确定并行度(DOP)。对于查询、DDL和DML,这两部分的确定方法各不相同。为了确定DOP,ORACLE数据库需要检查参考对象(决定DOP的对象):

1)对于并行查询(将要并行执行的查询部分),数据库通过检查语句中的每一个表和索引,来决定哪一个对象作为参考对象。基本原则为选取那个最高DOP的表或索引。

2)对于并行DML(INSERT, UPDATE, MERGE, and DELETE)来说,参考对象就是修改数据的那个表。并行DML对DOP增加了一些限制以防止死锁。如果并行DML语句中包含子查询,那子查询的DOP就等于DML语句的DOP。

3)对于并行DDL,参考对象就是正在created, rebuilt, split, or moved的那个表、索引或分区。如果并行DDL语句中包含子查询,那么子查询的DOP等于DDL语句的DOP。

确定是否并行

SELECT语句能否并行执行,取决于是否满足以下条件:

1)语句中包含PARALLEL提示(PARALLEL或PARALLEL_INDEX),或者参考对象具有PARALLEL属性。

2)语句中至少有一个表包括以下操作:

–A full table scan

–An index range scan spanning multiple partitions

3)SELECT列表中没有scalar子查询

确定并行度(DOP)

查询的DOP取决于以下规则:

1)查询的DOP取决于语句中参考对象的最大DOP。

2)如果一个表既有PARALLEL提示,又有PARALLEL属性,那么PARALLEL提示的DOP优先于PARALLEL属性的DOP。

2、并行DDL

能够并行执行的DDL语句

对于非分区的表或索引,包括以下语句:

■CREATE INDEX

■CREATE TABLE ... AS SELECT

■ALTER INDEX ... REBUILD

对于分区表或索引,包括以下语句:

■CREATE INDEX

■CREATE TABLE ... AS SELECT

■ALTER TABLE ... [MOVE|SPLIT|COALESCE] PARTITION

■ALTER INDEX ... [REBUILD|SPLIT] PARTITION

所有这些DDL操作都可以NOLOGGING方式执行,不论是否并行。

对于IOT表,CREATE TABLE操作能够并行执行,不论是否包含AS SELECT从句。

不同操作有不同并行度(见Table 8–2)。基于分区表的CREATE TABLE ... AS SELECT并行语句、基于分区索引的CREATE INDEX并行语句,它们的DOP等于分区数量。

包含对象类型列的表,不能执行并行DDL。包含LOB列的非分区表,不能执行并行DDL。

并行执行CREATE TABLE ... AS SELECT语句

这个语句在创建汇总表时特别有用。

簇表不能以并行的方式创建和操作。

Figure 8–4描述了并行创建汇总表。

技术分享

并行DDL与数据恢复

并行DDL经常被用来在一个事务中创建汇总表或者大批量数据加载,通常不要求可恢复。关闭LOGGING功能,系统不会产生UNDO和REDO日志,并行DDL操作的性能会更好一些,不过这个操作变成“all or nothing”操作。换句话,如果这个操作失败了,你必须从头重做,而不能从中间开始重启。

如果并行创建表过程中禁用logging,那创建成功后需要备份一下表空间,以防止数据丢失。

对于CREATE TABLE, CREATE INDEX, ALTER TABLE, and ALTER INDEX操作,都可以使用NOLOGGING从句禁止UNDO和REDO的生成。

并行DDL的空间管理

并行创建表和索引都有一个空间管理的暗示,既包括并行操作执行过程中的存储空间要求,也包括创建成功后可用空闲空间大小。

使用字典管理表空间时的空间要求

并行创建表或索引时,每个并行服务器会使用CREATE语句中的STORAGE从句创建临时段进行存储数据行。因此,创建一个NEXT属性为4MB、PARALLEL DEGREE为16的表的过程至少需要64MB空间,每个并行服务器都以4MB的EXTENT开始。当并行协调器合并这些段时,有些段可能会被修剪掉,最后的空间可能有小于64MB。

空闲空间和并行DDL

串行创建一个对象时最少可以有一个EXTENT,而并行创建表或索引时,每个并行服务器都至少有一个EXTENT。当这些临时段的大小超过所需的空间大小时,就有可能产生空闲区。

1)当临时段剩余空间大于表空间MINIMUM EXTENT属性大小时,并行协调器合并临时段中的数据行时会将这些未使用空间修剪掉,并释放回系统。这些空闲空间可以作为新EXTENT分配使用,但不能被合并为一个更大的EXTENT进行使用,因为它们不是连续空间。

2)当临时段剩余空间小于表空间MINIMUM EXTENT属性大小时,这些未使用空间不会被修剪释放回系统。它们会成为表或索引空间的一部分,只能在后面的INSERT\UPDATE操作需要额外空间时使用。

见Figure 8-5所示。

技术分享

DDL语句规则

  • 确定是否并行

如果在语法中指定PARALLEL从句,则DDL语句会并行执行。对于CREATE INDEX and ALTER INDEX ... REBUILD or ALTER INDEX ... REBUILD PARTITION语句,PARALLEL从句属性存储到数据字典中。

你可以使用ALTER SESSION FORCE PARALLEL DDL语句覆盖同一会话中后续DDL语句的PARALLEL属性。

  • 确定并行度

DOP由对象或索引的PARALLEL属性决定,除非被ALTER SESSION FORCE PARALLEL DDL语句覆盖。

当DDL语句包含一个显式PARALLEL提示时,它也会覆盖PARALLEL属性。

[CREATE | REBUILD] INDEX or [MOVE | SPLIT] PARTITION语句规则

创建或修改索引的规则如下。

  • 并行CREATE INDEX或ALTER INDEX ... REBUILD

CREATE INDEX and ALTER INDEX ... REBUILD语句只能通过PARALLEL从句或ALTER SESSION FORCE PARALLEL DDL语句进行并行执行。

ALTER INDEX ... REBUILD语句只能对非分区索引并行操作。

ALTER INDEX ... REBUILD (非分区), ALTER INDEX ... REBUILD PARTITION, 和CREATE INDEX这些语句的扫描操作同样并行执行,并行度同REBUILD和CREATE操作一样。如果REBUILD或CREATE操作没有指定并行度,并行度默认为CPU数量。

  • 并行MOVE PARTITION或SPLIT PARTITION

ALTER INDEX ... MOVE PARTITION 和 ALTER INDEX ...SPLIT PARTITION语句只能通过PARALLEL从句或ALTER SESSION FORCE PARALLEL DDL语句进行并行执行。它们的扫描操作同样并行执行,并行度同对应的MOVE 或 SPLIT操作一致。如果没有指定并行度,并行度默认为CPU数量。

CREATE TABLE AS SELECT语句规则

CREATE TABLE ... AS SELECT语句包含两部分:CREATE部分(DDL)和SELECT部分(查询)。这两部分都可以并行执行。DDL部分的并行规则同其它DDL一致。

  • 查询部分是否并行

CREATE TABLE ... AS SELECT语句的查询部分只有满足以下条件才可并行:

1)查询部分中包含PARALLEL或PARALLEL_INDEX提示,或者DDL部分中包含PARALLEL语句,或者查询部分中参考对象明确指定PARALLEL属性。

2)查询部分中至少有一个表是full table scan或者多分区index range scan。

  • 查询部分DOP

CREATE TABLE ... AS SELECT语句查询部分的DOP由以下条件之一来决定:

1)查询部分使用DDL部分中PARALLEL从句指定的值。

2)如果DDL部分没有指定PARALLEL从句,缺省DOP为CPU数量。

3)如果DDL部分串行执行,DOP由查询自身决定。

注:查询部分PARALLEL提示指定的值会被忽略。

  • DDL部分是否并行

CREATE TABLE ... AS SELECT语句的CREATE操作,只能通过PARALLEL从句或ALTER SESSION FORCE PARALLEL DDL来并行执行。

当CREATE TABLE ... AS SELECT语句的CREATE操作并行执行后,相对应的SCAN操作也尽可能并行执行。当发生以下情况时,SCAN操作不会并行执行:

1)SELECT从句有NO_PARALLEL提示;

2)扫描一个非分区的索引。

当CREATE操作串行执行时,SELECT部分如果有PARALLEL提示或者参考对象指定PARALLEL属性,那SELECT部分会并行执行。

  • DDL部分DOP

CREATE语句的DOP,取决于CREATE语句的PARALLEL从句,以及ALTER SESSION FORCE PARALLEL DDL语句。如果PARALLEL从句没有具体指定DOP,则默认为CPU的数量。

3、并行DML

并行DML(PARALLEL INSERT, UPDATE, DELETE, and MERGE)使用并行执行机制来加速大表或索引上的大的DML操作。

注:尽管DML操作包含查询,但本章的DML只是指INSERT, UPDATE, MERGE, 和DELETE操作。

何时使用并行DML

DSS环境中由于经常需要存取大对象,所以并行DML很重要。并行DML补充了并行查询的功能,为你的DSS环境同时提供查询和更新的能力。

而对于OLTP环境,过度设置并行DML并不可行,但可用来加速批量任务的执行。

1)数据仓库环境中定时刷新大表数据。可考虑使用MERGE语句。

2)创建中间汇总表。

3)Scoring表。

4)更新历史表。

5)运行批量任务。

启用并行DML

并行DML只能显式启用,这是因为并行DML和串行DML有不同锁、事务和磁盘空间要求。使用以下语句启用:

ALTER SESSION ENABLE PARALLEL DML;

一个会话中的并行DML缺省是禁用的,这时即使指定PARALLEL提示,也不会启用并行DML。

当并行DML启用后,如果没有PARALLEL提示,或者对象没有PARALLEL属性,或者违反并行操作限制条件,DML仍然不会并行。

会话的PARALLEL DML模式不会影响SELECT语句、DDL语句、DML语句查询部分的并行度。因此,如果没有设置并行DML模式,DML操作不会并行,DML语句中扫描或连接操作仍然可以并行操作。

UPDATE, MERGE, 和DELETE并行规则

对于UPDATE, MERGE, and DELETE操作,你有两种方法来指定并行指令(当然是在已启用并行DML情况下):

1)对待操作的表使用PARALLEL从句定义其属性。

2)使用PARALLEL提示。这个提示也会作用于待操作表的扫描操作。

你可以使用ALTER SESSION FORCE PARALLEL DML语句覆盖待操作表的PARALLEL属性。PARALLEL提示又可以覆盖ALTER SESSION FORCE PARALLEL DML语句的并行特性。

  • 确定是否并行

以下规则决定了UPDATE, MERGE, or DELETE是否并行执行。UPDATE 或DELETE操作有且只有至少满足以下一个条件,才会并行执行:

1)待操作的表有PARALLEL属性。

2)DML语句中有PARALLEL提示。

3)会话中执行ALTER SESSION FORCE PARALLEL DML。

DML语句中可能包含子查询或可更新视图,那么这些子查询或可更新视图就可能有它们自己的PARALLE提示或PARALLEL属性。但这些并行指令不会影响UPDATE, MERGE, 或 DELETE操作的并行。

PARALLEL提示或表上的PARALLEL属性,同时适用于DML语句的查询、UPDATE, MERGE, 或 DELETE操作。然而,DML语句中UPDATE, MERGE, 或 DELETE操作的并行,是独立于查询操作的并行的。

  • 确定DOP

同查询部分相同的规则。

优先次序为:MERGE, UPDATE, DELETE上的提示;SESSION并行度;目标表的PARALLEL属性。

INSERT ... SELECT并行规则

INSERT ... SELECT语句能够将INSERT和SELECT操作对立地并行执行,但两部分操作的DOP要求是一致的。

你可以紧跟INSERT关键字指定PARALLEL提示,以指定INSERT操作的并行(SELECT部分中表经常不同于INSERT操作的对象,这个PARALLEL提示只是针对INSERT操作)。

对于INSERT ... SELECT语句,你有以下几种方式可以指定PARALLEL指令(PARALLEL DML已启用的前提下):

1)SELECT部分指定PARALLEL提示;

2)SELECT部分中的表指定PARALLEL属性;

3)INSERT部分指定PARALLEL提示;

4)待INSERT的表指定PARALLEL属性。

你可以用ALTER SESSION FORCE PARALLEL DML语句覆盖会话中INSERT操作对象的PARALLEL属性。PARALLEL提示又可以覆盖ALTER SESSION FORCE PARALLEL DML语句。

  • 确定是否并行

有且只有至少满足以下一个条件,INSERT操作才会并行执行:

1)INSERT操作指定PARALLEL提示;

2)待INSERT对象具有PARALLEL属性;

3)ALTER SESSION FORCE PARALLEL DML语句被执行。

注:INSERT操作的并行独立于SELECT操作的并行,反之亦然。

  • 确定DOP

根据以下次序确定DOP:Insert部分的PARALLE提示, Session的并行语句, 待INSERT表的PARALLEL属性, SELECT部分的最大DOP。

Example 8–6,根据INSERT中的PARALLEL提示确定DOP为2:

INSERT /*+ PARALLEL(tbl_ins,2) */ INTO tbl_ins

SELECT /*+ PARALLEL(tbl_sel,4) */ * FROM tbl_sel;

并行DML限制

并行DML的限制有(direct-path INSERT):

1)对于分区内(intra-partition)的并行UPDATE, MERGE, and DELETE,要求COMPATIBLE参数至少达到9.2。

2)INSERT VALUES操作从来不会并行。

3)一个事务包含修改不同表的多个并行DML语句。当某个并行DML语句修改某个表后,这个事务随后的任何串行或并行语句(DML或查询)都不能再次存取这个表。

这个限制也适用于direct-path INSERT语句:这个事务随后的任何串行或并行语句(DML或查询)都不能再次存取这个表。

并行DML或direct-path INSERT前允许查询同一个表,之后则不允许。

被拒绝的存取同一个表的串行或并行语句会报错。

4)有触发器的表不能并行DML。

5)复制功能不支持并行DML。

6)某些约束情况不支持并行DML:self-referential integrity, delete cascade, and deferred integrity。另外,对于direct-path INSERT,所有参考完整性约束都不支持并行DML。

7)对于包含有OBJECT列的表,如果没有存储此OBJECT列,则允许并行DML。

8)对于包含有LOB列的分区表,允许并行DML。但不允许分区内(intra-partition)并行。

9)分布式事务不允许并行DML。

10)簇表不支持并行DML。

11)临时表不支持并行UPDATE, DELETE, and MERGE操作。

几个分布式事务并行的例子:

Example 8–7,DML语句存取一个远程对象。查询操作会串行执行,因为它参考了一个远程对象。

Example 8–7

INSERT /*+ APPEND PARALLEL (t3,2) */ INTO t3 SELECT * FROM [email protected];

Example 8–8,DELETE操作不会并行,因为它参考了一个远程对象。

Example 8–8

DELETE /*+ PARALLEL (t1, 2) */ FROM [email protected];

Example 8–9,DML操作是一个分布式事务。DELETE操作不会并行,因为它发生在分布式事务中(这个分布式事务以SELECT语句开始)。

Example 8–9

SELECT * FROM [email protected];

DELETE /*+ PARALLEL (t2,2) */ FROM t2;

COMMIT;

4、并行执行函数

SQL语句可能包含用户自定义的函数。当SQL语句并行执行时,这些函数就会被并行执行服务器在每一行数据进行执行。被函数调用的PL/SQL包变量或Java静态属性,在每个并行服务器间都是完全私有的;处理每行数据时,它们不是从原来的会话中复制过来,而是重新初始化。就因为如此,有些函数并行执行会返回不正确的结果。

用户自定义的表函数可以用在FROM从句中。它们就像源表一样输出数据行。SQL语句的每个并行服务器开始时都会初始化这些表函数。它们的所有变量,在每个并行服务器间也都是完全私有的。

并行查询中的函数

在SELECT语句或DML/DDL语句的子查询中,用户自定义函数在以下情况下都可以并行运行:

1)使用PARALLEL_ENABLE关键字进行声明;

2)在PACKAGE/TYPE中使用PRAGMA RESTRICT_REFERENCES从句进行声明(指明WNDS, RNPS, and WNPS);

3)使用CREATE FUNCTION进行声明,且系统通过分析其PL/SQL代码内容发现其没有写数据也没有读取、修改包中的变量。

注:即使函数只能串行执行,但查询或子查询语句的其它部分也可能并行执行。

并行DML和DDL中的函数

并行DML/DDL语句,同并行查询语句一样,用户自定义函数在以下情况下都可以并行运行:

1)使用PARALLEL_ENABLE关键字进行声明;

2)在PACKAGE/TYPE中使用PRAGMA RESTRICT_REFERENCES从句进行声明(指明WNDS, RNPS, and WNPS);

3)使用CREATE FUNCTION进行声明,且系统通过分析其PL/SQL代码内容发现其没有写数据也没有读取、修改包中的变量。

对于并行DML语句,如果函数调用不能并行执行,那整个DML语句就只能串行执行。对于INSERT ... SELECT 或CREATE TABLE ... AS SELECT语句,查询部分的函数调用可以并行执行(如上介绍的“并行查询中的函数”部分)。查询部分可能并行执行,即使语句中其它部分只能串行执行;反之亦然。

5、其它类型并行

除了并行SQL执行之外,ORACLE数据库还支持以下并行特性:

并行恢复

并行复制

并行数据加载(关于外部表和SQL LOADER工具)

同并行SQL执行一样,并行恢复、并行复制、外部表加载都是通过并行执行协调器、并行执行服务器来完成。通过SQL*Loader并行加载数据,则是另外一种机制。

并行协调器、并行服务器,根据并行类型(SQL、复制、外部表加载)不同,所表现出的行为也会不同。举例来说,当并行服务器池中的服务器进程均被占用,且并行服务器数量已达到系统设定的最大值,则:

1)在并行SQL执行和并行外部表加载的情况下,并行执行协调器会改为串行执行。

2)在并行复制情况下,并行协调器会报错。

对于给定一个会话,并行协调器只能协调一种类型的并行活动,比如,不能同时协调并行SQL、并行复制和并行外部表加载。

6、并行规则小结

Table 8–2描述了不同类型SQL语句如何并行执行,以及指定并行的方法的优先次序。

技术分享

技术分享

以上是关于Oracle“并行执行”之二——并行执行类型的主要内容,如果未能解决你的问题,请参考以下文章

Oracle“并行执行”之三——参数

Oracle“并行执行”之一——How to work

Oracle客户端执行exp命令设置

并行的假象和分时系统

并发,并行

Oracle-第一篇一些调优技巧