Oracle多插入语句

Edu*_*uro 6 oracle query-hints

在我的应用程序中,我必须添加许多记录.我使用以下构造:

   INSERT /*+ append parallel(t1, 4) parallel(t2, 4) */ ALL
   INTO t1 (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t2 (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t2 (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

我也在使用APPEND和PARALLEL提示.请注意,我在两个不同的表中插入数据.似乎并行被忽略了(DBA告诉我).那我怎么知道它是否被使用?是否可以在此类构造中使用PARALLEL提示?有效吗?

Jon*_*ler 4

这可能足以让它工作:

alter session enable parallel dml;
Run Code Online (Sandbox Code Playgroud)

您可以使用如下查询检查实际并行度:

select px_servers_executions, v$sql.*
from v$sql where lower(sql_text) like '%insert%parallel%' order by last_load_time desc;
Run Code Online (Sandbox Code Playgroud)

如果您仍然没有获得并行性,可能有很多原因。首先,查看这些参数:

select * from v$parameter where name like 'parallel%'
Run Code Online (Sandbox Code Playgroud)

但您可能不希望插入语句具有并行性。并行性具有大量开销,并且通常仅在处理数千或数百万条记录时才有用。

我猜你真正的问题是解析大型 SQL 语句的时间。多表插入尤其糟糕。如果您尝试插入超过几百行,您的查询将花费很多秒来进行解析。根据您的 Oracle 版本,如果您尝试使用 501 表,它将永远挂起。运行多个较小的查询比运行一个大型查询要快得多。例如,5 次插入 100 行的运行速度比 1 次插入 500 行的运行速度快得多。(一般来说,这与如何调整 Oracle 性能完全相反。这是一种特殊情况,因为与解析大型 SQL 语句相关的错误。)