Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

62

积分

0

好友

8

主题
1#
发表于 2012-8-21 16:09:05 | 查看: 6128| 回复: 6
在做一个大数据量插入的时候速度没有达到预期,检查发现插入没有并行。测试插入其他表都可以并行插入,对比发现这个表比其他表多了lob字段。含lob字段的表不能并行插入吗?请教各位老师同学。
测试记录:
--表定义
SQL> desc t_blob;
Name        Type       Nullable Default Comments
----------- ---------- -------- ------- --------
BLOB_ID     NUMBER(12)                           
CONTENT     BLOB       Y                        
CREATE_DATE DATE                SYSDATE         
--创建一个同原表结构一样的测试表
SQL> create table wz_t_blob as select * from t_blob where 1<>1;
Table created
--启用pdml
SQL> alter session enable parallel dml;
Session altered
--查看执行计划
SQL> explain plan for
  2  INSERT /*+append parallel(a 16)*/ INTO WZ_T_BLOB a
  3   SELECT /*+parallel(b 16)*/ * FROM T_BLOB b;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 512139731
--------------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | INSERT STATEMENT      |           |  1587K|   151M|  2400   (1)| 00:00:2
|   1 |  LOAD AS SELECT       | WZ_T_BLOB |       |       |            |
|   2 |   PX COORDINATOR      |           |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000  |  1587K|   151M|  2400   (1)| 00:00:2
|   4 |     PX BLOCK ITERATOR |           |  1587K|   151M|  2400   (1)| 00:00:2
|   5 |      TABLE ACCESS FULL| T_BLOB    |  1587K|   151M|  2400   (1)| 00:00:2
--------------------------------------------------------------------------------
12 rows selected
注:上面未见并行插入!
--不查询和插入blob字段,查看执行计划
SQL> explain plan for
  2  INSERT /*+append parallel(WZ_T_BLOB 16)*/ INTO WZ_T_BLOB(blob_id,create_date)
  3   SELECT /*+parallel(b 16)*/ blob_id,create_date FROM T_BLOB b;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 512139731
--------------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | INSERT STATEMENT      |           |  1587K|    21M|  2400   (1)| 00:00:2
|   1 |  LOAD AS SELECT       | WZ_T_BLOB |       |       |            |
|   2 |   PX COORDINATOR      |           |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000  |  1587K|    21M|  2400   (1)| 00:00:2
|   4 |     PX BLOCK ITERATOR |           |  1587K|    21M|  2400   (1)| 00:00:2
|   5 |      TABLE ACCESS FULL| T_BLOB    |  1587K|    21M|  2400   (1)| 00:00:2
--------------------------------------------------------------------------------

12 rows selected
注:仍未见并行插入!
--删除表的blob字段
SQL> alter table wz_t_blob drop column content;
Table altered
--查看不含blob字段表插入时候的执行计划
SQL> explain plan for
  2  INSERT /*+append parallel(a 16)*/ INTO WZ_T_BLOB a
  3   SELECT /*+parallel(b 16)*/ blob_id,create_date FROM T_BLOB b;

Explained

SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 582208549
--------------------------------------------------------------------------------
| Id  | Operation               | Name      | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | INSERT STATEMENT        |           |  1587K|    21M|  2400   (1)| 00:00
|   1 |  PX COORDINATOR         |           |       |       |            |
|   2 |   PX SEND QC (RANDOM)   | :TQ10001  |  1587K|    21M|  2400   (1)| 00:00
|   3 |    LOAD AS SELECT       | WZ_T_BLOB |       |       |            |
|   4 |     PX RECEIVE          |           |  1587K|    21M|  2400   (1)| 00:00
|   5 |      PX SEND ROUND-ROBIN| :TQ10000  |  1587K|    21M|  2400   (1)| 00:00
|   6 |       PX BLOCK ITERATOR |           |  1587K|    21M|  2400   (1)| 00:00
|   7 |        TABLE ACCESS FULL| T_BLOB    |  1587K|    21M|  2400   (1)| 00:00
--------------------------------------------------------------------------------

14 rows selected

注:可以看到执行计划显示了使用了并行DML
以上测试每次执行完实际语句后从v$pq_sesstat里面看到的上面的结果,含blob字段的表插入时不能并行插入。
2#
发表于 2012-8-21 16:20:45
参考下sql reference中的parallel_clause部分:
Notes on the parallel_clause The following notes apply to the parallel_clause:
■ Parallelism is disabled for DML operations on tables on which you have defined a
trigger or referential integrity constraint.
■ When you specify the parallel_clause during creation of a table, if the table
contains any columns of LOB or user-defined object type, then subsequent
INSERT, UPDATE, DELETE or MERGE operations that modify the LOB or object
type column are executed serially without notification. Subsequent queries,
however, will be executed in parallel.
■ A parallel hint overrides the effect of the parallel_clause.
■ DML statements and CREATE TABLE ... AS SELECT statements that reference
remote objects can run in parallel. However, the remote object must really be on a
remote database. The reference cannot loop back to an object on the local database,
for example, by way of a synonym on the remote database pointing back to an
object on the local database.
■ DML operations on tables with LOB columns can be parallelized. However,
intrapartition parallelism is not supported.
Note: The syntax of the parallel_clause supersedes syntax
appearing in earlier releases of Oracle. Superseded syntax is still
supported for backward compatibility but may result in slightly
different behavior from that documented.
See Also: Oracle Database Performance Tuning Guide, Oracle Database
Concepts, and Oracle Database Data Warehousing Guide for more
information on parallelized operations, and "PARALLEL Example" on
page 16-51

回复 只看该作者 道具 举报

3#
发表于 2012-8-21 16:39:47

回复 2# 的帖子

HI,kevinlin兄,这段参考内容里,没有符合我的SQL情况的啊。
我的表示ctas创建的空表,无索触发器约束...不能并行insert

回复 只看该作者 道具 举报

4#
发表于 2012-8-21 17:35:13
应该是不行的吧。lob本身是要写到磁盘的。。。好吧, 不知道怎么表达,但是我感觉,不能并行的原因应该和lob不知道实际需要写多长的内容到磁盘有关系吧~

也就是说,一个lob不想一个varchar2一样,事先可以得知有多长。lob的长度是未知的,所以不好并行。

请ML及各位高手指正。

回复 只看该作者 道具 举报

5#
发表于 2012-8-21 18:02:45
是不是这个
■ DML operations on tables with LOB columns can be parallelized. However,
intrapartition parallelism is not supported.


把wz_t_blob建成分区表试试

[ 本帖最后由 warmbreeze 于 2012-8-21 18:58 编辑 ]

回复 只看该作者 道具 举报

6#
发表于 2012-8-21 19:12:08
我试了wz_t_blob改成分区表,可以

回复 只看该作者 道具 举报

7#
发表于 2012-8-22 10:12:18

回复 6# 的帖子

经测试含lob字段的分区表可以并行插入。
谢谢kevinlin提供的参考资料。

[ 本帖最后由 repentance 于 2012-8-22 11:20 编辑 ]

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-26 04:13 , Processed in 0.046339 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569