我们正在使用直接路径方法来填充我们的数据集市之一。我们还指向应该插入的确切子分区。下面是SQL:
INSERT /*+ APPEND_VALUES */ INTO DWH.DM_CORE_AC_SALDOS SUBPARTITION(SYS_SUBP7709) VALUES (:B1 ,:B2 ,:B3 ,:B4 ,:B5 ,:B6 ,:B7 ,:B8 ,:B9 ,:B10 ,:B11 ,:B12 ,:B13 ,:B14 ,:B15 ,:B16 ,:B17 ,:B18 ,:B19 ,:B20 ,:B21 )
所有进程由dbms_parallel_execute控制,并行级别为40。也就是说,有40个单独的会话执行它们自己的插入到单独的子分区。但是,这个过程需要很长时间才能完成,在会话窗口中,我们可以看到会话没有相互锁定,但是它们有等待类“User I/O”和等待状态“WAITING”。以下是会话窗口在此过程中的外观快照:
我们做错了什么吗?也许我们应该设置一些数据库参数的权利或改变表结构(initrans或pctfree)?
编辑:几乎所有会话都有事件'db file sequential read'。我想它运行缓慢的原因可能是因为索引维护操作。我检查了dba_data_files中的file#和大多数为索引表空间分配的show文件。我读到直接路径插入在插入结束时做索引维护,所以可能这是一个问题。在这种情况下,我应该避免使用直接路径插入吗?
1条答案
按热度按时间yv5phkfx1#
使用直接路径写入会在相应的表/分区上获取排他锁。一次只能有一个会话对对象执行直接路径写入。
运行40个并行进程在这里没有帮助。你正在一个接一个地运行40个事务。如果您想使用直接路径写入,最好在同一个事务中运行它; ditch dbms_parallel_execute.