在我的应用程序中,我必须添加许多记录.我使用以下构造:
INSERT /*+ append parallel(t1,4) parallel(t2,4) */ ALL INTO t1 (col1,col2,col3) VALUES ('val1_1','val1_2','val1_3') INTO t2 (col1,col3) VALUES ('val2_1','val2_2','val2_3') INTO t2 (col1,col3) VALUES ('val3_1','val3_2','val3_3') . . . SELECT 1 FROM DUAL;
我也在使用APPEND和PARALLEL提示.请注意,我在两个不同的表中插入数据.似乎并行被忽略了(DBA告诉我).那我怎么知道它是否被使用?是否可以在此类构造中使用PARALLEL提示?有效吗?
这可能足以使它工作:
alter session enable parallel dml;
您可以使用以下查询检查实际的并行度:
select px_servers_executions,v$sql.* from v$sql where lower(sql_text) like '%insert%parallel%' order by last_load_time desc;
如果你仍然没有得到并行性,那么有很多可能的原因.首先,看看这些参数:
select * from v$parameter where name like 'parallel%'
但是您可能不希望insert语句具有并行性.并行性具有大量开销,并且通常仅在处理数千或数百万条记录时才有用.
我猜你真正的问题是解析大型sql语句的时间.多表插页特别糟糕.如果您尝试插入超过几百行,则查询将花费很多秒来进行解析.根据您的Oracle版本,如果您尝试使用501表,它将永远挂起.运行几个较小的查询而不是一个大查询要快得多.例如,100行的5个插入将比500行的一个插入快得多. (一般来说,这与Oracle的性能调整完全相反.这是一种特殊情况,因为与解析大型sql语句有关的错误.)