簡體   English   中英

如何加快在Oracle表中加載數據的速度?

[英]How can I speed up loading data in Oracle tables?

我有一些非常大的表(無論如何對我來說),如數百萬行。 我正在從舊版系統中加載它們,並且這是永遠的。 假設硬件可以很快。 我怎樣才能加快速度? 我嘗試從一個系統導出到CSV並使用Sql loader-速度慢。 我還嘗試了從一個系統到另一個系統的直接鏈接,因此沒有中間的csv文件,只是從一個負載卸載到另一個負載。

一個人說了一些關於預登台的事情,這可以使事情更快。 我不知道那是什么,或者是否有幫助。 我希望輸入。 謝謝。

正在使用Oracle 11g。

更新:我的數據庫是群集的,所以我不知道我是否可以做任何事情來加快速度。

您可以嘗試的方法:

  • 禁用所有約束,僅在加載過程之后啟用它們
  • CTAS(創建表作為選擇)

您真正應該做的是:了解瓶頸。 是網絡,文件I / O,檢查約束...然后解決該問題。 在我看來,大部分時間都是第一步。

正如Jens Schauder所建議的那樣,如果您可以通過DB鏈接連接到您的源舊系統,那么只要您不需要源端的任何聯接,CTAS便是性能和簡單性之間的最佳折衷方案。

否則,您應該考慮使用SQL * Loader並調整一些設置。 使用直接路徑,我能夠在6歲的ProLaint上在12分鍾內加載100M記錄(〜10GB)。

編輯:我使用為Datamation排序基准定義的數據格式。 它的生成器在Apache Hadoop發行版中可用。 它生成具有固定寬度字段的記錄,其中包含99個字節的數據,以及每行文件一個換行符。 我用於上面引用的數字的SQL * Loader控制文件是:

OPTIONS (SILENT=FEEDBACK, DIRECT=TRUE, ROWS=1000)
LOAD DATA
INFILE 'rec100M.txt' "FIX 99"
INTO TABLE BENCH (
BENCH_KEY POSITION(1:10),
BENCH_REC_NBR POSITION(13:44),
BENCH_FILLER POSITION(47:98))

您正在使用什么配置? 導入數據的數據庫是否有與之關聯的備用數據庫之類的東西? 如果是這樣,是否很有可能啟用了force_logging的配置? 您可以使用

SELECT FORCE_logging from v$database;

也可以在表空間級別啟用它:

SELECT TABLESPACE_name,FORCE_logging from DBA_tablespaces

如果您的數據庫正在使用force_logging運行,或者您的表空間具有force_logging,則這將影響導入速度。 如果不是這種情況,請檢查是否啟用了存檔日志模式。

SELECT LOG_mode from v$database;

如果是這樣,則可能是歸檔的寫入速度不夠快。 在這種情況下,請增加在線重做日志文件的大小。 如果數據庫未運行archivelog模式,則如果未使用直接路徑插入,它仍必須寫入重做文件。 在這種情況下,請檢查重做的寫入速度。 通常,當索引不起作用時,非常有可能達到200GB / h。

重要的是找到導致性能不足的鏈接。 它可以是輸入,也可以是輸出。 在這里,我專注於輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM