|
"你说的外部表是最佳的加载方式,不知道你外部表加载数据用的什么driver,不也是sqlldr吗。
外部表在使用上确实更加灵活,对数据的处理也比sqlldr要好,但是速度上最多和sqlldr一样快。"
虽然我不知道其内部实现,但可以猜测外部表是借鉴了SQLLDR代码。但是SQLLDR有“写”的动作,而外部表纯粹是“读”,这两者不可比。
单纯就“读”的部分而言,外部表可以并行读,可以JOIN其他表,可以用复杂的过滤,这是SQLLDR比不上的。
再看看“写”的部分。外部表用INSERT SELECT, CTAS 可以完成类似SQLLDR的写操作。这里是TOM的书中的数据:
------------------------------------------------------------------------------
Method CPU Elapsed Rows
SQLLDR direct=true 29 42 1,833,792
External table INSERT /*+ APPEND */ 33 38 1,833,792
External table CREATE TABLE AS SELECT 32 37 1,833,792
External table INSERT (conventional path) 42 130 1,833,792
SQLLDR (conventional path) 50 410 1,833,792
------------------------------------------------------------------------------
可以看到传统路径加载把SQLLDR远远抛在身后。
"但是,如果我有几千万数据要快速处理完,dblink肯定不如proc同时建立多个长连接快。"
你说的是什么?长连接是指C/S结构下的连接?
如果你是指在数据库之间传输大批数据(如ETL),那么DB LINK肯定不合适,通常做法是
导出->压缩->传输->解压缩->导入
如果是指数据处理,那么我们可以通过DB LINK调用远程存储过程,该存储过程还是处理它的本地数据。
分布式事务肯定是要用DB LINK,让ORACLE处理两段提交最方便,你在客户端建立多个连接只会把问题复杂化。
"先确定一点,SQL肯定都是绕不过去。
但是存储过程至少在多线程或者多进程,内存申请上肯定比不过proc或者oci灵活,效率肯定就比不上。"
举个例子?
我到目前为止还没有过申请内存的需求。PLSQL的自动分配内存、自动垃圾回收非常方便,ORACLE也提供了几个参数让你在一定程度上手动分配。
"存储过程是最佳选择也只是在某些情况下(估计你也是这个意思)。"
如果是做数据库应用,我还没发现有例外的。如果你有的例子的话举一个出来。
"如果你业务繁忙的时候需要应急修改一下程序,这个时候我可以杀掉程序修改编译,存储过程可能就比较麻烦了,太多人在调用存储过程,编译的时候肯定会卡死(当然这种情况压根就不应该发生)。"
这正是存储过程的优点啊?难道你希望有些人是用旧版本的程序生成数据,而另外一些人则用新版本?
你的程序可以杀掉,数据库连接也可以杀掉的。
|
|