以下是Anysql 的一篇文章, 比较了多种数据操作方式的速度, 其中提到expdp = exp + direct mode + parallel , expdp 默认方式下就是采用 直接路径导出的, 不过parallel 似乎必须设置才会生效吧 ? 也就是说必须设置parallel >0 才能使用到并行的 。 那么使用expdp 和 exp direct=y 应该速度相当, 不过很多实验还是证明 expdp速度要快于exp direct=y , 难道还有其他区别 ? 他们的direct 又有区别 ?
还有一个问题 : exp direct=y 是 " 直接从磁盘读取数据到导出session 的UGA中, 跳过了SQL命令处理层,避免了不必要的数据转化 " , 这里的不必要的数据转化是不是就是 SQL Select 语句从datafile读取到buffer cache 中 ? 还是还有其他步骤被避免了 ? 从磁盘读取的block导出到导出session 的UGA 的时候, 应该还需要SQL表达式将block中的数据行读出返回给用户 ?
---------------------------------------------------------------------------------------------------------------------------
exp direct=y
直接导出模式,
数据直接从磁盘中读取到导出session的UGA中,跳过了SQL命令处理层。避免了不必要的数据转换, 然后将纪录返回给导出客户端,然后写到dump文件 跳过了SQL命令处理层表示DIRECT导出不支持QUERY选项。
而传统默认下的exp
传统导出模式使用SQL SELECT语句抽取表数据。将数据从磁盘中读入到buffer cache缓冲区中,并应用SQL表达式,将纪录返回给导出客户端,然后写到dump文件。
---------------------------------------------------------------------------------------------------------------------------
http://www.anysql.net/dba/sqluldr2_exp_expdp.html 昨天测试了一下expdp, exp和sqluldr2的性能, 测试机器为Linux, 机器主频为3G, 测试时基本上sqluldr2的单个进程占用了一整个CPU, 也就是CPU的主频限制了sqluldr2和exp的速度. 以sqluldr2为参照物, 各个工具的速度对比结果如下.
expdp = (parallel degree – 1) * 2 * sqluldr2
exp direct = 2 * sqluldr2
89exp = 1 * sqluldr2
这时发现, expdp其实是exp的升级版本, exp + direct mode + parallel, 因为要支持并行生成几个文件, 所以Oracle通过控制后观的并行进程来实现, 如果文件是生成在客户端, 则没有办法控制后台进程来并行生成文件, 这个是expdp的文件只能生成在
服务器端的技术原因, 并且需要Oracle内部的目录对象来控制文件存放位置. 另外一个原因据说是因为安全, 导出文件并不表示得到了数据.
Direct模式导出可以得到一倍的性能提升, 但查遍了
google和metalink, 都没有找到direct unload有关的OCI API函数, 只找到一堆direct load有关的OCI API. 不知道有谁对这个有所了解? 难道是Oracle故意不开放这部份API, 以提升将数据迁移到其他类型
数据库的成本?
有点想搞清楚exp和expdp中的direct模式是如何
编程的, 用以改进一下sqluldr2.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/35489/viewspace-666058/
,如需转载,请注明出处,否则将追究法律责任。