2009-11-20 46 views
7

所以,我經常需要將數據加載到保留表中才能運行一些數據驗證檢查,然後返回結果。 通常,我創建保留表,然後創建一個sqlldr控制文件並將數據加載到表中,然後運行我的查詢。 是否有任何理由,我應該使用外部表的東西,而不是? 他們以何種方式讓我的生活更輕鬆?外部表與SQLLoader

回答

13

外部表的一大優點是我們可以使用SQL從數據庫中查詢它們。因此,我們可以將驗證檢查作爲SELECT語句運行,而不需要保存表。同樣,如果我們需要對加載的數據進行一些操作,那麼使用SQL而不是SQLLDR命令幾乎總是可以做到這一點。我們還可以使用DBMS_JOB/DBMS_SCHEDULER例程來管理數據加載,這進一步減少了對shell腳本和cron作業的需求。

但是,如果您已經有了一個成熟穩定的使用SQLLDR的流程,那麼我承認您不太可能從移植到外部表中獲得巨大的好處。

還有一些情況 - 特別是如果您正在加載數百萬行 - 其中SQLLDR方法可能會更快。不過,差異將不會像更新版本的數據庫那樣標記。我完全期望SQLLDR最終將被棄用,以支持外部表。

+1

+1,所有的優點。 – DCookie 2009-11-20 18:27:27

3

如果你看一下外部表的語法,它看起來很像:-)

SQL * Loader控制文件的語法如果外部表是要在多個查詢被反覆使用它可能會更快加載表(正如你現在所做的那樣),而不是重新掃描每個查詢的外部表。正如@APC所指出的,Oracle正在對它們進行改進,所以取決於您的數據庫版本YMMV。

+1

可疑相似,但不相同。 :) http://stackoverflow.com/questions/898872/oracle-external-tables-advanced-flat-file-layout – 2009-11-20 17:29:20

+0

好點。我不知道有多少SQL * Loader代碼至少在外部表的最初去... – DCookie 2009-11-20 18:26:12

+0

@DCookie。它由同一團隊開發:) – BobC 2017-02-09 18:33:49

3

我會使用外部表的靈活性。

它更容易修改其中的數據源是一個不同的文件alter table ... location ('my_file.txt1','myfile.txt2')

你可以做多表插入,合併,通過管道函數等運行...

並行查詢更加容易。 ..

它還建立依賴關係更好...

的代碼存儲在數據庫中,所以它會自動備份......

0

您可以對外部表執行的另一件事是讀取壓縮文件。例如,如果您的文件是gzip壓縮的,那麼您可以在外部表定義中使用PREPROCESSOR指令,以在讀取文件時解壓縮文件。