看到这个标题后,也许会有很多人发问,真会有这样的错误吗?是的,这样错误的提示一般是 ORA-12838: 无法在并行模式下修改之后读/修改对象
让通过一系列实验来模拟出这种错误:
当前表是有并行度的,并行度为4
SQL> select table_name,degree from user_tables where table_name=LJB_PARALLEL;
TABLE_NAME DEGREE
------------------------------
-----------------------------------
LJB_PARALLEL 4
向表中插入数据
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted
不提交继续插入数据,问题马上出现了
SQL> insert into
ljb_parallel select * from ljb_parallel2;
insert into ljb_parallel select
* from ljb_parallel2
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> select count(*) from
ljb_parallel;
select count(*) from
ljb_parallel
ORA-12838: 无法在并行模式下修改之后读/修改对象
真的报错了,这个时候对ljb_parallel表无论是更新还是查询都做不了了,咋回事?
SQL> commit;
Commit complete
提交后发现可以查询了
SQL> select count(*) from
ljb_parallel;
COUNT(*)
---------
187932
提交后更新也可以了
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted
总结:通
过实验可以看出,如果并行的表更新未提交,在此基础上做任何操作无论更新还是查询都会失败,因此并行度的表其实还是有危险性的。从这里至少得出一个结论,
如果应用是多表分别插入带并行度的表,并且是有事务性,需要最后一起提交的,这个应用一定会失败!所以尽量避免把表本身的属性设置为并行,这样的话会留下
隐患,还是建议应用如果一定要用并行度,用HINT做设置就好了,因此最好最后要做如下操作
SQL> alter table ljb_parallel noparallel;
Table altered
另外如果表中只是索引有并行度,会存在这样的问题吗,实验如下,得出结论,只是表中索引有并行度,并不存在表带并行度的问题,不提交继续操作是不会报错的。
SQL> create index
idx_ljb_parallel on ljb_parallel(object_id);
Index created
SQL> select
table_name,index_name,degree from
user_indexes where table_name=LJB_PARALLEL;
TABLE_NAME INDEX_NAME DEGREE
------------------------------
------------------------------ -----------------------------------------------------
LJB_PARALLEL IDX_LJB_PARALLEL 1
SQL> alter index IDX_LJB_PARALLEL parallel 4;
Index altered
SQL> select
table_name,index_name,degree from
user_indexes where
table_name=LJB_PARALLEL;
TABLE_NAME INDEX_NAME DEGREE
------------------------------
-------------------------------------------------------------------------------------
LJB_PARALLEL IDX_LJB_PARALLEL 4
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted
曾
有一次,我把结算系统互联互通指标报表的过程做了修改,修改处就是将其中的语句增加并行度,想提高运行的效率,修改完后我发现前台操作界面好象真的快了许
多。可是还没高兴多久,我发现前台查询的结果都是空的。再去跟踪数据库执行日志才发现,该过程执行根本中间就出错了,报ORA-12838。原来我这个过
程也是对结果表进行多次插入后一起提交了,结果表被我增加并行度后就不能继续操作未提交的数据,所以我的修改根本就是失败了!
这里说完了大家还记得我在前面的DML无法生效的时候说卖了个关子吗,希望看完本小节后,再回头考虑考虑,应该能明白了。
引申联想:高水平位插入的时候,也有类似的问题,比如使用append的时候,具体实验如下:
SQL> insert /*+append*/ into ljb_test
select * from ljb_test;
4 rows inserted
SQL> select * from ljb_test;
select * from ljb_test
ORA-12838: 无法在并行模式下修改之后读/修改对象
该贴由koei转至本版2014-5-2 16:13:42