Oracle多插入语句

Oracle多插入语句,oracle,query-hints,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, co

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

   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;

我还使用了追加和并行提示。请注意,我正在两个不同的表中插入数据。似乎并行被忽略了(DBA告诉我)。那么我如何知道它是否被使用?在这种构造中可以使用并行提示吗?它有效吗?

这可能足以让它发挥作用:

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语句相关的错误。)

有些情况下会禁用并行性。包括 :

DML的并行性已禁用 对已创建的表的操作 定义了触发器或引用 完整性约束


这对我来说是个很大的限制。您的表上有触发器或外键吗?

为30条记录启用并行性会浪费资源。并行性涉及昂贵的开销(拆分工作、分配进程、同步结果…),这对于如此小的操作来说是不值得的

我想如果你想优化它那么糟糕的话,你会执行这个语句数百万次。在这种情况下,找到一种方法将这一百万条语句转换成大集合操作可能会更有效——这可以很好地从并行性中获益



更新:另一个想法可能是使用多个会话运行语句,有效地实现DIY并行。您能否设计流程,使多个会话同时读取输入数据和insert?

只支持insert语句的子查询语法,而不支持VALUES子句。如果使用VALUES子句指定APPEND提示,将忽略该提示,并使用常规insert。要在VALUES子句中使用直接路径插入,请参阅“追加值提示”。

语句中的提示在哪里?这就是你正在使用的语句吗?你到底想同时做什么?您是否有一个实际的查询作为多表插入的一部分,或者使用DUAL仅仅是对您所做工作的一个总体简化?你在使用并行DML吗?我添加了提示。我正在尝试使用直接路径和并行性,通过单个命令添加多个记录。问题在于,insert没有利用并行性。我想知道为什么以及如何检查它是否被使用。多少是“许多记录”,几十条还是几百万条?每个语句大约30条记录。所有答案都非常有用。不幸的是,我不能全部选择。非常感谢。你好。这是不可能的。我的应用程序正在读取数百万条记录,对它们进行处理并写入结果(合并)。我尝试了几种解决方案,比如在内存中收集记录并使用大容量操作写入记录的包,但它降低了性能(为每条记录调用存储过程的开销)。@Eduardo:你能分工合作,让多个进程同时处理插入内容吗?