oracle数据库数据加载(Direct Load)
一.
对oracle数据库来说有很多数据加载方式,如 imp,sql*loader,directLoad。这些都是为了方便对oracle数据库进行快速的数据加载。 imp,sql*loader这两种工具的数据来源都依赖于外部文件。而directLoad却是一种不依赖外部文件,在不同数据库之间和数据库内部进行数据加载的方式。 现在就主要对directLoad进行说明。
二.
其实DirectLoad的功能就是一个表到一表的数据copy, 这过程中 oracle 允许有一些特殊的选项来加快数据的加载, 比如 并行DML , nologging 的方式。 正是有了这些加快数据加载的选项,才对此加载方式多了几分考虑(其实也算得上是忧虑)
下面来看忧虑何来,首先来看看下面这个加载操作:
insert /*+ append */ into target_tab nologging
select * from source_tab ;
这个操作绕过数据redo,undo机制,sql引擎的方式直接将数据插入到target_tab表中。 如果你作为一数据管理者来说的话,你看这个这个操作之后第一反应就马上备份这个target_tab。 因为 append 和 nologging 这两个选项完全背离数据的基本机制,在数据恢复中会造成失败。 同时这个操作产生的新数据,是在来高水位之上的,这就会对部分空间的浪费,也会造成全表扫描减慢。
再来看一操作,
alter session enable parallel dml ;
insert /*+ paralle(target_tab , 2) */ into target_tab nologging
select * from source_tab ;
注意:这个操作必需在一个事物中完成。 如果还需此操作,还得另起事物。
这个操作是让DirectLoad并行加载,paralle(target_tab , 2)表示以两个并行会话对target_tab并行加载数据。 在oracle数据中,并行操作本质就是一种以牺牲物理资源,来换取时间(相当于空间换时间) 。 在这种情况下,做这种操作要仔细考虑你的硬件资源是否允许,盲目并行操作,有时适得其反。