exp  中direct 参数默认为N , 即采用普通路径导出,和使用程序导出恢复数据一样,和执行其他查询一样, 从磁盘和高速缓冲区读取数据, 从那里,数据被移到一个工作区,在工作区,行被提出来, 检查和查询中的where子句是否匹配,然后将数据送到导出程序。

exp direct =y , 表示直接路径导出, 比普通路径导出速度快很多, 不能使用query子查询, SQL查询仍然被执行,存储表的块仍然被读入数据库的高速缓存区,但是它们从高速缓存区直接传给exp导出程序, 相对普通路径,少了检查行是否匹配的这个过程, 所以Query子句不能在direct=y 的情况下使用。 表包含Lob的时候也不能使用y 。

-------------------------------------------------------------------------------------------------------------------------------------

oracle是9204,数据通过exp导出,以前使用direct=n的方式导出,考虑到效率问题,使用了direct=y参数,虽说效率得到大幅提高,但是再恢复数据库是会提示imp-00051,imp-00008等的相关错误;经metalink查询发现这是9204的bug,就是再exp时如果指定了direct=y可能导致exp的输出文件存在中断的情况。解决办法是,升级到9207或者使用direct=n.  这个问题提示我们不管用什么方式进行备份,一定要定时将备份文件进行恢复测试,及时发现问题,以防真正出现问题时候,备份无法使用的情况

-----------------------------------------------------------------------------------------------------------------------------------------

在导入数据的时候,假如commit=Y,则由参数Buffer决定导入过程中什么时候做Commit操作。*(Note:"For tables containing LONG, LOB, BFILE, REF, ROWID, UROWID columns, array inserts are not done. If COMMIT=y, Import commits these tables after each row.")   导入的时候,Oracle使用Array Insert.将record从dmp file中读取到imp process buffer中,当buffer“满”的时候,Bind Array,执行Insert.   看来Oracle也通过批量绑定来提高imp性能,以前还以为是read one record,insert one record,read one record,insert one record…… ******************************************************************************** INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T_1K" ("X")VALUES (:1) call count cpu elapsed disk query current rows

------- ------ -------- ---------- ---------- ---------- ---------- -------

Parse 1 0.00 0.01 0 4 0 0

Execute 102 0.02 0.04 0 11 174 6601

Fetch 0 0.00 0.00 0 0 0 0

------- ------ -------- ---------- ---------- ---------- ---------- -------

total 103 0.02 0.05 0 15 174 6601 Misses in library cache during parse: 1 ********************************************************************************   表T_1K每个记录在imp的时候占用大概1k的buffer,如上是设置了buffer=64k imp的结果。  Array Bind (Commit)102次,导入纪录6601条  6601/102 =64.7156863 about 64 rows/insert, using a 64k buffer —— that makes sense   看不出Oracle内部使用array bind 的地方挺多的: arraysize in sqlplus, Forall bind / fetch in PL/SQL……

-

资料引用:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐