我正在PL / SQL中编写一个应用程序,它接受一个.csv平面文件,读取它,对它进行一些数据处理,然后决定更新,插入或删除几个表中的哪一个。
我可以选择使用UTL_FILE.GET_LINE功能一次处理单个记录,使用各种REGEX工具解析它,将数据临时存储在某些变量中,然后使用它(做出决策,更新表)等等。)
我也有选择,创建一个外部表,然后只是使用所述外部表上的游标(使用每个循环的性能)单步执行它我仍然可以做所有相同的事情数据(制定决策,更新表格等)
我环顾四周,有几个论坛建议外部表格是首选的解决方案,因为它们可以更好地扩展,更快,更可靠。但是,我没有听到过原因。关于utl_file和/或外部表的Oracles文档没有讨论为什么一个可能比另一个更快,所以我很好奇是否有人有更多的信息或参考,我不知道什么会使一个人比另一个更好。
答案 0 :(得分:1)
性能差异非常简单:UTL_FILE是一个PL / SQL包,而外部表使用用C编写的SQL * Loader代码。
如果你有足够的数据,你甚至可以用最小的努力f.i来并行加载外部表。 ALTER TABLE my_external_table PARALLEL 4;
外部表可以在批量模式下使用(INSERT INTO my_table SELECT ... FROM my_external_table JOIN my_lookup_table USING(lookup_column))。
外部表可以设置为事务安全模式(REJECT LIMIT 0),因此上面的INSERT可以工作或回滚。
您需要更多理由吗?
答案 1 :(得分:0)
如果文件包含具有已知结构/文件格式的数据,则可以使用外部表。 UTL_FILE处于不同的抽象级别 - 您现在只是处理一个文件 - 您对UTL_FILE的使用会很脆弱并且可能会引入错误。决定因素不应该是表现;但是我怀疑你能否超越' Oracle使用REGEX和UTL_FILE滚动自己的外部表实现。