So, I often have to load data into holding tables to run some data validation checks and then return the results. Normally, I create the holding table, then a sqlldr control file and load the data into the table, then I run my queries. Is there any reason I should be using external tables for thing instead? In what way will they make my life easier?
4 回答
外部表的最大优点是我们可以使用 SQL 从数据库内部查询它们。因此,我们可以将验证检查作为 SELECT 语句运行,而不需要保留表。同样,如果我们需要对加载的数据进行一些操作,使用 SQL 而不是 SQLLDR 命令几乎总是更容易做到这一点。我们还可以使用 DBMS_JOB/DBMS_SCHEDULER 例程管理数据加载,这进一步减少了对 shell 脚本和 cron 作业的需求。
但是,如果您已经拥有使用 SQLLDR 的成熟且稳定的流程,那么我承认您不太可能从移植到外部表中获得巨大的好处。
在某些情况下——尤其是在加载数百万行的情况下——SQLLDR 方法可能要快得多。但是,差异不会像数据库的更新版本那样标记。我完全期望 SQLLDR 最终会被弃用,转而支持外部表。
我会使用外部表来提高灵活性。
将它们上的数据源修改为不同的文件更容易alter table ... location ('my_file.txt1','myfile.txt2')
您可以进行多表插入、合并、通过流水线函数运行等...
并行查询更容易...
它还可以更好地建立依赖关系...
代码存储在数据库中,因此会自动备份...
如果您查看 External Table 语法,它看起来很像 SQL*Loader 控制文件语法 :-)
如果您的外部表将在多个查询中重复使用,那么加载一个表(就像您现在正在做的那样)可能会更快,而不是为每个查询重新扫描您的外部表。正如@APC 所说,Oracle 正在对它们进行改进,因此取决于您的数据库版本 YMMV。
您可以使用外部表做的另一件事是读取压缩文件。例如,如果您的文件是 gzip 压缩的,那么您可以在外部表定义中使用 PREPROCESSOR 指令,在读取文件时对其进行解压缩。