在我的应用程序中,我必须添加许多记录。我使用以下构造:
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提示?它有效吗?
答案 0 :(得分:4)
这可能足以让它发挥作用:
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语句有关的错误。)
答案 1 :(得分:2)
APPEND hint仅支持INSERT语句的子查询语法,而不支持VALUES子句。如果使用VALUES子句指定APPEND提示,则会忽略该提示并使用常规插入。要使用带有VALUES子句的直接路径INSERT,请参阅" APPEND_VALUES提示"。
答案 2 :(得分:1)
有些情况下禁用并行性。包括,来自 Oracle documentation:
DML禁用并行性 对您拥有的表格的操作 定义了触发器或参考 诚信约束。
这对我来说似乎是一个非常大的限制。你的桌子上有触发器或外键吗?
答案 3 :(得分:1)
为30条记录启用并行性将浪费资源。并行性涉及昂贵的开销(拆分工作,分配流程,同步结果......),这对于这么小的操作来说是不值得的。
如果你想要优化它那么糟糕,我想你正在执行这个语句数百万次。在这种情况下,找到一种方法将这些百万个语句转换为大集合操作可能会更有效 - 这可以很好地从并行性中获益。
更新:另一个想法可能是运行具有多个会话的语句,从而有效地实现DIY并行性。您是否可以设计您的流程,以便多个会话读取输入数据并同时插入?