Oracle多插入语句

| 在我的应用程序中,我必须添加许多记录。我正在使用以下构造:
   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行的插入将比500个行的插入快得多。 (通常,这与Oracle性能调整的方式正好相反。由于与解析大型SQL语句有关的错误,因此这是特例。)     
仅INSERT语句的子查询语法支持APPEND提示,而不支持VALUES子句。如果使用VALUES子句指定APPEND提示,则将其忽略,并将使用常规插入。要将直接路径INSERT与VALUES子句一起使用,请参考\“ APPEND_VALUES提示\”。     
在某些情况下,并行性被禁用。包括,从 Oracle文档:   DML禁用并行   您所拥有的表上的操作   定义触发器或引用   完整性约束。 对我来说,这似乎是一个很大的限制。桌上有触发器或外键吗?     
为30条记录启用并行处理将浪费资源。并行涉及昂贵的开销(拆分工作,分配过程,同步结果...),这对于这么小的操作来说是不值得的。 我想如果要优化它的话,您将执行该语句数百万次。在这种情况下,找到一种将这些数百万条语句转换为大型集合操作的方法可能会更有效率-这可以很好地受益于并行性。 更新:另一个想法可能是在多个会话中运行语句,从而有效地实现DIY并行性。您是否可以设计过程,以便多个会话读取输入数据并同时插入?     

要回复问题请先登录注册