标签:
摘自《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 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数量。
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。
CREATE TABLE ... AS SELECT语句查询部分的DOP由以下条件之一来决定:
1)查询部分使用DDL部分中PARALLEL从句指定的值。
2)如果DDL部分没有指定PARALLEL从句,缺省DOP为CPU数量。
3)如果DDL部分串行执行,DOP由查询自身决定。
注:查询部分PARALLEL提示指定的值会被忽略。
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部分会并行执行。
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操作的并行,是独立于查询操作的并行的。
同查询部分相同的规则。
优先次序为: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: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 t4@dblink;
Example 8–8,DELETE操作不会并行,因为它参考了一个远程对象。
Example 8–8
DELETE /*+ PARALLEL (t1, 2) */ FROM t1@dblink;
Example 8–9,DML操作是一个分布式事务。DELETE操作不会并行,因为它发生在分布式事务中(这个分布式事务以SELECT语句开始)。
Example 8–9
SELECT * FROM t1@dblink;
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语句如何并行执行,以及指定并行的方法的优先次序。
标签:
原文地址:http://laoxue.blog.51cto.com/2179224/1787585