如何解决使用Oracle并行化插入查询的问题
在与
并行运行的查询中出现问题“ CREATE TABLE ... AS SELECT”语句,
但它不能与之并行运行
“ INSERT INTO ... SELECT”查询。
我在程序中使用了以下语句
立即执行“更改会话启用/强制并行DML”
。它适用于"delete from "
语句,但对带有/*+parallel(30)*/
提示的插入不起作用。
这可能是什么问题,并行插入是否存在其他解决方案?预先感谢。
解决方法
您不能很好地解释您的数据模型,所以让我解释一下有关Oracle Parallel Execution的不同可能性。对于insert / select语句,有两个操作可能会并行运行,也可能不会并行运行。一个是选择,另一个是插入。
测试用例表
SQL> create table t ( id number,c1 varchar2(130) ) ;
Table created.
SQL> create table x as select object_id,object_name from dba_objects ;
Table created.
SQL> select count(*) from x ;
COUNT(*)
----------
172514
场景1
表没有并行定义,没有通知提示,也没有启用alter session parallel。插入和选择将以串行模式运行。
SQL> explain plan for
2 insert into t select * from x ;
Explained.
SQL> select * from table(dbms_xplan.display) ;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2941724873
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 194K| 14M| 172 (1)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | T | | | | |
| 2 | TABLE ACCESS FULL | X | 194K| 14M| 172 (1)| 00:00:01 |
---------------------------------------------------------------------------------
场景2
在插入语句中使用了提示并行,表没有并行定义,并且没有启用alter session。查询将以插入和选择两种串行模式运行。
SQL> explain plan for insert /*+parallel(t,10)*/ into t select * from x ;
Explained.
SQL> select * from table(dbms_xplan.display) ;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------Plan hash value: 2941724873
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 194K| 14M| 172 (1)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | T | | | | |
| 2 | TABLE ACCESS FULL | X | 194K| 14M| 172 (1)| 00:00:01 |
---------------------------------------------------------------------------------
场景3
提示同时用于选择和插入。任何表中都没有并行定义,也没有使用alter session。插入将以串行模式运行,但是选择将并行运行。 (请在说明计划的末尾查看注释)
SQL> explain plan for insert /*+parallel(t,10)*/ into t select /*+parallel(x,10)*/ * from x ;
Explained.
SQL> select * from table(dbms_xplan.display) ;
PLAN_TABLE_OUTPUT
----------------------------------------
Plan hash value: 3828196258
--------------------------------------------------------------------------------------
----------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 194K| 14M| 172 (1)| 00:00:01 | | | |
| 1 | LOAD TABLE CONVENTIONAL | T | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 194K| 14M| 172 (1)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | 194K| 14M| 172 (1)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | X | 194K| 14M| 172 (1)| 00:00:01 | Q1,00 | PCWP | |
------------------------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 10 because of table property
- PDML is disabled in current session
正如您在上面的解释计划中所见,由于提示,选择并行运行。原因是,默认情况下,为每个会话设置了enable parallel query
,因此,如果在选择中使用并行提示,则选择将并行运行。
场景4
在插入和选择上都使用了提示,但是这次我们启用了并行dml。这些表没有并行定义。插入将与选择并行运行。检查说明计划的注释。
SQL> alter session enable parallel dml ;
Session altered.
SQL> explain plan for insert /*+parallel(t,10)*/ * from x ;
Explained.
SQL> select * from table(dbms_xplan.display) ;
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2234885790
----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 194K| 14M| 19 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 194K| 14M| 19 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD AS SELECT (HYBRID TSM/HWMB)| T | | | | | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | 194K| 14M| 19 (0)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | X | 194K| 14M| 19 (0)| 00:00:01 | Q1,00 | PCWP | |
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 10 because of table property
如果在启用并行dml时对插入操作使用了提示并行,则插入将作为直接路径语句而不是常规插入运行。请记住,直接路径操作是表锁定的,因此在这种情况下,表将被其他dml操作锁定,直到提交事务为止。
场景5
您还可以更改表的并行属性,则无需使用任何提示。仅启用并行dml。
SQL> alter table t parallel 8 ;
Table altered.
SQL> alter table x parallel 8 ;
Table altered.
SQL> alter session enable parallel dml ;
Session altered.
SQL> explain plan for insert into t select * from x ;
Explained.
SQL> select * from table(dbms_xplan.display) ;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------Plan hash value: 2234885790
----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 194K| 14M| 24 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 194K| 14M| 24 (0)| 00:00:01 | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | 194K| 14M| 24 (0)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | X | 194K| 14M| 24 (0)| 00:00:01 | Q1,00 | PCWP | |
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 8 because of table property
请记住一些限制:
- 如果要在其中进行插入的表启用了触发器,则该操作将不会并行运行。
- 如果希望插入并行运行,则必须始终启用并行DML。在这种情况下,请使用并行提示或更改表的程度。提示使用不当将不会引发任何错误,只是它们将无法工作。
- 如果并行运行插入/选择,则在大多数情况下,并行运行两个操作非常重要,因此每个QC的使用者可以共同工作。如果仅并行运行选择,则选择的使用者最终将处于空闲状态,而单个威胁正在运行插入。
- 此模式(启用并行dml)是必需的,因为并行DML和串行DML具有不同的锁定,事务和磁盘空间要求,并且默认情况下禁用会话的并行DML。禁用并行DML时,即使使用PARALLEL提示,也不会并行执行DML。
您可以在此处阅读有关并行dml限制的更多信息
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。