理解exp, imp 使用direct=y 及imp commit=y

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……

-

资料引用:http://www.knowsky.com/385965.html 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-613531/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-613531/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值