Oracle 多插入语句

标签 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;

我还使用 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%'

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

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

关于Oracle 多插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035924/

相关文章:

sql - oracle db中具有多个字段的条件唯一约束

sql - 如何在oracle sql中获取小时和分钟?

sql - 我应该使用快速查询提示 number_rows/FASTFIRSTROW 吗?

sql-server - 在 SQL Server 中将查询提示 (OPTION) 置于 View 中

linq-to-sql - 如何在 Linq to SQL 中使用 NOEXPAND 提示?

python - 如何在django查询中传递oracle优化提示

sql - oracle同表select两次不重复

sql-server - 如何在 NHibernate 中使用 READPAST 提示?

Oracle 将 Select Union All 转换为 Parallel Select

java - 如何将父表和子表数据移动到存档表(具有相同的列)