这种办法为导入数据掀开了新的一扇门。你可以很方便的将内部文件与数据库相干联,并且在数据库中设立设置装备摆设对应的 External Table,然后就可以立刻盘问数据,就象内部数据已经导入到数据库表中一样。独一的缺乏需求清楚,数据并未真正导入到数据库中,当内部文件被删除或掩盖时,数据库将不能访问 External Table 里的数据,并且索引没有被设立设置装备摆设,访问数据速度将有所迟缓。设立设置装备摆设 CALLS_EXTERNAL(External Table表)如下,使之与内部数据文件关联:
CREATE TABLE calls_external
(call_id NUMBER,
call_date DATE,
emp_id NUMBER,
call_type VARCHAR2(12),
details VARCHAR2(25))
ORGANIZATION EXTERNAL
( TYPE oracle_loader
DEFAULT DIRECTORY extract_files_dir
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ’,’
MISSING FIELD VALUES ARE NULL
(
call_id, call_date CHAR DATE_FORMAT DATE MASK
"yyyy-mm-dd:hh24:mi:ss",
emp_id, call_type, details
)
)
LOCATION (’calls.dat’)
);
然后将 External Table 与真正被利用的表 CALLS 关联同步,删除 CALLS 表偏重修它:
CREATE TABLE calls
(
call_id NUMBER NOT NULL,
call_date DATE NOT NULL,
emp_id NUMBER NOT NULL,
call_type VARCHAR2(12) NOT NULL,
details VARCHAR2(25)
)
TABLESPACE tbs1 NOLOGGING
AS
SELECT call_id, call_date, emp_id, call_type, details
FROM calls_external;
由于 CALLS 表是真正的数据库表,可以设立设置装备摆设索引来加速访问,表中的数据将被保留,纵然内部数据文件被更新或被删除。在建表语句中NOLOGGING要害字用于加速索引重修。
运用这种办法导入数据,总的导入时光为 15 秒,进程占用 CPU 的时光为8秒,这比前一种办法略微慢些,但不能就此以为利用 External Table 导入数据一定比 OCI 批量拔出慢。
这种办法的甜头是,未经胁制年夜量的编写代码就取得了不错的结果,不象 OCI 批量拔出存在编码错误风险,它还可以利用 dbms_job 包调节数据导入进程,完成数据导入的主动化。其缺陷是目标表必须先删除后重修,要是只需求导入增量数据时此办法就分歧适了,其他用户在表的重修进程中访问数据时会碰到 "table or view does not exist" 的错误,它仅实用于 Oracle 9i 以上版本的数据库。
INSERT Append as SELECT,利用 Oracle9i 的 External Table
上一种办法演示了如何设立设置装备摆设与内部数据文件关联的数据库表,其表的数据是由内部数据文件映射以前。缺陷是数据库表需求被先删除再重修来对峙与内部数据文件的一律和同步,对导入增量的数据而不需求删除已稀有据的征象分歧适。针对这种需求,Oracle 供给了 INSERT 语句外带 APPEND 提示来满足。
INSERT /* APPEND */ INTO calls
(call_id, call_date, emp_id, call_type, details)
SELECT call_id, call_date, emp_id, call_type, details
FROM calls_external;
该语句读取引用内部数据文件的 CALLS_EXTERNAL 表中内容,并将之增长到表 CALLS 中。Append 提示看护 Oracle 利用快速机制来拔出数据,同时可以配合利用表的 NOLOGGING 要害字。
可以预见这种办法与前一办法消费了相反的时光,究竟它们是利用 External Table 特性导入数据的不合阶段处置责罚办法。要是目标表不是空的,那将会消费略微长的时光(由于要重修更长的索引),而前一 CREATE TABLE as SELECT 办法是个人设立设置装备摆设索引。
SQL*Loader的茂盛功用
SQL*Loader 是 Oracle 供给的导入实用递次,分外针对从内部文件导入年夜批量数据进入数据库表。该对象已经有多年的历史,每一次版本晋级都使其更加茂盛、灵敏和快捷,但遗憾的是它的语法倒是诡秘而不直不雅观,并且只能从命令行窗口处胁制挪用。
虽然它有不直不雅观的缺陷,但倒是最快最有用的导入数据办法。缺省征象下它利用 "conventional path" 通例选项来批量导入数据,其功用进步度并不显着。我倡议利用更快速的导入参数选项,在命令行添加"direct=true" 选项挪用 "direct path" 导中选项。在 "direct path" 导入完成中,递次在数据库表的新数据块的 high water mark 处间接写入导入数据,延伸了数据拔出的处置责罚时光,同时优化利用了极度有用的B 二叉树办法来更新表的索引。
运用这种办法,要是利用缺省的 conventional path 导中选项,总的导入时光是 81 秒,进程占用 CPU 时光年夜约是 12 秒,这搜罗了更新表的索引时光。要是利用 direct path 导中选项,总的导入时光竟是 9 秒,进程占用 CPU 时光也仅仅是 3 秒,也搜罗了更新表的索引时光。
由此可见,虽然表中的索引在数据导入之前并没有被删除,利用SQL*Loader的direct path 导中选项仍然是快速和有用的。虽然它也出缺陷,就像NOLOGGING要害字一样该办法不天生REDO日记数据,导入进程蜕化后将无法例复到先前状况;在数据导入进程中表的索引是不起传染的,用户此时访问该表时将呈现迟缓,虽然在数据导入的进程中最好不要让用户访问表。
分区互换 (Partition Exchange)
以上讨论的数据导入办法都有一个限定,就是要求用户在导入数据完成之后才可以访问数据库表。面对7×24不中缀访问数据库来说,要是我们只是导入需求增长的数据时,这种限定将对用户的及时访问孕育发生发火影响。Oracle在这方面供给了表分区功用,它可以添加导入数据操纵对用户及时访问数据的影响,操纵体式样式就象利用可热插拔的硬盘一样,只不过这里的硬盘换成了分区(Partition)而已。需求声明的是 Partitioning 分区功用只要在企业版数据库中才供给。
在一个被分区过的表中,呈现给用户的表是多个分区段(segments)的聚集。分区可以在需求时被添加,在维护时被卸载或删除,分区表可以和数据库中的表互换数据,只需它们的表结构和字段类型是一律的,互换后的分区表将拥有与之互动的表的数据。需求具体的是,这种互换只是在Oracle数据库的数据字典层面上胁制,并没稀有据被理论挪动,以是分区表互换是极度快速的。
为了设立设置装备摆设尝试情况,先假定CALLS表是个分区表,要设立设置装备摆设一个空的分区PART_01012004,用来保管2004年1月1日的呼唤数据。然后需求再设立设置装备摆设一暂且表为CALLS_TEMP,该表与CALLS表拥有相反的字段和数据类型。
我们利用先前先容的导入办法将十万条数据导入到CALLS_TEMP表中,可以耐性守候数据完全导入到CALLS_TEMP表中,并且设立设置装备摆设好索引和相干束厄局促条件,一切这完好绝对操纵并不影响用户及时访问CALLS表,由于我们只对CALLS_TEMP暂且表胁制了操纵。一旦数据导入完成,CALLS_TEMP表就存有2004年1月1日的呼唤数据。同时利用CALLS表中名为PART_01012004的空分区,利用如下语句实行分区互换:
ALTER TABLE calls
EXCHANGE PARTITION part_01012004 WITH TABLE calls_temp
INCLUDING INDEXES WITHOUT VALIDATION;
分区互换操纵将极度快速地只更新CALLS表的数据字典,PART_01012004分区表马上拥有CALLS_TEMP表的所稀有据,而CALLS_TEMP表变为空表。假定CALLS表利用部分索引而非全局索引,上述语句中的INCLUDING INDEXES将担保分区互换搜罗索引的可用性,WITHOUT VALIDATION 指明不反省瓜代表中数据的结婚,加速了互换的速度。
结论
以上商量了Oracle数据库的多种数据导入办法,每种办法都有其优缺陷和实用情况,可以满足你不合的导入需求,虽然你需求在观念了这些办法后,在速度、浅易性、灵敏性、可恢复性和数据可用性之间追求最佳导入方案。
为了比照各种办法的结果,我们设立设置装备摆设了一个实例来展示各种办法的导入遵守和结果,从中你可以选择最得当的办法用于此后的数据导入任务。同时请记着,本文并未囊括一切的ORACLE数据导入技术(歧并行数据导入技术),这需求我们继续不懈的探索和尝试。
数据导入办法 总体导入时光(秒) 导入进程占用CPU时光(秒)
逐条数据拔出INSERT 172 52
逐条数据拔出INSERT,表暂无索引 130 35
批量拔出,表暂无索引 14 7
Create As Select,利用Oracle9i的External Table 15 8
INSERT Append as SELECT,利用Oracle9i的External Table 15 8
SQL*Loader conventional path 缺省导中选项 81 12
SQL*Loader direct path 导中选项 9 3
版权声明: 原创作品,容许转载,转载时请务必以超链接情势标明文章 原始情由 、作者信息和本声明。否则将追查司法责任。