sqlldr理論深入學習

2021-07-07 10:11:01 字數 4527 閱讀 7455

原文:

sql*loader是oracle的高速批量資料載入工具。這是乙個非常有用的工具,可用於從多種平面檔案格式向oracle資料庫中載入資料。sqlldr可以在極短的時間內載入數量龐大的資料。它有兩種操作模式:

傳統路徑(conventional path):sqlldr 會利用sql插入為我們載入資料。

直接路徑(directpath):採用這種模式,sqlldr不使用sql;而是直接格式化資料庫塊,而繞過整個sql引擎和undo生成,同時還可能避開redo生成。要在乙個沒有任何資料的庫中充分載入資料,最快的方法就是採用並行直接路徑載入。

常規路徑裝載使用sql insert語句和記憶體中的鍵陣列快取(bond arraybuffers)將資料裝載到oracle資料庫的表中。這個過程與其他程序競爭sga內部的記憶體資源。如果資料庫已經有支援多個併發處理程序的開銷,常規路徑裝載會降低裝載的效能。

使用常規路徑裝載的另外乙個開銷是裝載程序必須搜尋資料庫,以查詢被裝載表的部分填充塊,並試圖填充這些塊。這對日常的事務處理是非常有效的,但是它是常規路徑裝載的乙個額外開銷。

最好或有時必須使用常規路徑裝載方法,而不能使用直接路徑裝載的情形:

1、如果被裝載的表是被索引的並且被併發訪問的,或者如果要對錶進行插入或刪除,必須使用常規路徑裝載。

2、當在控制檔案中使用sql函式時,必須使用常規路徑裝載。當使用直接路徑裝載時,sql函式將不適用。

3、當裝載的表是乙個簇表時。

4、當裝載少量記錄到乙個大型索引表,或當表具有引用完整性或檢查約束時。

5、當裝載工作是通過sql *net或net8在不同的平台上進行時,為使用直接路徑裝載,兩個節點必須屬於同乙個計算機家族並且使用同樣的字符集。

不需要使用sqlinsert語句和鍵陣列快取,直接路徑裝載格式化輸入資料到oracle資料塊並將它們直接寫入資料庫中。注意直接路徑裝載總是在表的最高水位之上插入資料,這種方式消除了用於搜尋部分填充塊的時間。

sqlldr是乙個命令工具,並非乙個api,不能從pl/sql呼叫。

sql*loader具有很多功能,包括以下能力:

可以從不同檔案型別的多個輸入資料檔案中載入資料;

輸入記錄可以是定長的或變長的記錄;

可以在同一次執行中載入多個表,還可以邏輯地將選定的記錄載入到每個表中;

在輸入資料載入表之前,可以對其使用sql函式;

多個物理記錄可以被編譯成乙個邏輯記錄,同樣,sql可以提取一條物理記錄並把它作為多個邏輯記錄載入;

支援巢狀、巢狀表、varrays和lobs(包括blogclobnlobbfile)。

sql*loader 元件:

0.控制檔案

控制檔案中包含描述輸入資料的資訊(如輸入資料的布局、資料型別等),另外還包含有關目標表的資訊,控制檔案甚至還可以包含要載入的資料。

1. sql*loader輸入資料:

sql*loader能夠接收多種不同格式的資料檔案。檔案可以儲存在磁碟或磁帶上,或記錄本身可以被巢狀到控制檔案中。記錄格式可以是定長的或變長的,定長記錄是指這樣的記錄:每條記錄具有相同的固定長度,並且每條記錄中的資料域也具有相同的固定長度、資料型別和位置

2.sql*loader輸出:

(1)load data

(2)infile *

(3)into table dept

(4)fields terminated by 『,』

(5)(deptno,dname,loc)

(6)begindata

(7)10,sales,virginia

(8)20,accounting,virginia

(9)30,consulting,virginia

(10)40,finance,virginia

loaddata(1):這會告訴sqlldr要做什麼(在這個例子中,則指示要載入資料)。sqlldr還可以執行continue_load,也就是繼續載入。只有在繼續乙個多表直接路徑載入時才能使用後面這個選項。

infile *(2):這會告訴sqlldr所要載入的資料實際上包含在控制檔案中,如第6-10行所示。也可以指定包含資料的另乙個檔案的檔名。如果願意可以使用乙個命令列引數覆蓋這個infile語句。[命令列選項會覆蓋控制檔案設定]。

into table dept(3):這告訴sqlldr要把資料載入到哪個表中。

fileds terminated by 『,』(4):告訴sqlldr資料的形式應該是用逗號分隔的值。

(deptno,dname,loc)(5):告訴sqlldr所要載入的列,這些列在輸入資料中的順序以及資料型別。這是指輸入流中資料的資料型別,而不是資料庫中的資料型別,在這個例子中,列的資料型別預設為char(255)。

begindata(6):告訴sqlldr你已經完成對輸入資料的描述,後面的行(第7-10行)是要載入到dept表的具體資料。

要使用以上的控制檔案,建立乙個空的dept表:

create table dept

(deptno number(2) constraint dept_pk primary key,

dname varchar2(14),

loc varchar2(13)

);並執行以下命令:

sqlldr userid=/ control=demo1.ctl

表裝載的方法:

insert 這是預設方法。該方法假設在資料裝載前表是空的,如果在表中有記錄,sqlldr退出,並報:sqlldr-601: forinsert option,table must be empty,error on table dept

replace這種方法首先刪除表中已經存在的記錄,然後開始裝載新的記錄。注意,當老記錄被刪除時,表上的任意刪除觸發器將被觸發

truncate 這種方法在裝載資料前,使用sql命令truncate刪除老的記錄,因為去除了觸發器的觸發並且沒有建立回滾,所以這種方法要比replace快得多。為了使用這種方法約束必須被禁止,並且要授予特定的許可權

如何載入定界資料?

定界資料,(delimited data)即用某個特殊字元分隔的資料。

example:

fields terminated by 『,』 optionally enclosed by 『」』

上面例子指定用逗號分隔資料字段,每個字段可以用雙引號括起。

terminated by x』9』(使用16進製制格式的製表符;採用ascii時,製表符為9)

terminated by whitespace

如何載入固定格式資料?

通常會有乙個由某個外部系統生成的平面檔案,而且這是乙個定長檔案,其中包含著固定位置的資料(positionaldata).要載入定寬的固定位置資料,將會在控制檔案中使用position關鍵字:

load data

infile *

into table dept

replace

(deptno position(1:2),

dname position (3:16),

loc position (17:29)

)begindata

10accountin virginia ,usa

可以使用相對偏移量。

deptno position(1:2),

dname position(*:16)

表示dname 從3-16個字元。

如何載入日期?

只需要控制檔案中date資料型別,並指定要使用的日期掩碼。這個日期掩碼與資料庫中的to_char和to_date中使用的日期掩碼是一樣。

如何使用函式載入資料?

只需要將函式加到控制檔案中

(dname 「upper(:dname)」

)trailing nullcols會導致繫結變數成為null,如果輸入記錄中不存在某一列的資料,sqlldr會為該列繫結乙個null值。

下面是增加sql*loader效能的一些補充技巧:

1)使用定位域而不要使用分隔域,分隔域要求裝載器搜尋資料以查詢分隔符。定位域比較快,因為裝載器只需要做簡單的指標運算。

2)為終止域指定最大長度,使每個**陣列更為有效地插入。

3)預分配足夠的儲存空間。當資料被裝載時,表中需要更多的空間,oracle分配更多的區間以容納資料,如果在資料裝載期間頻繁地做這項操作,處理的開銷將非常大。在裝載之前計算或估算儲存空間需求能夠讓你預先建立必要的儲存空間。

4)如果可能,在控制檔案中盡量避免使用nullif和defaultif子句。這兩個子句對於被裝載的每條記錄都會引起列運算。

5)分割資料檔案,並行執行常規路徑裝載。

6)通過使用命令列引數rows,減少提交次數。

7)避免不必要的字符集轉換,確保客戶端的nls_lang環境與伺服器端的相同。

8)只要可能,盡量使用直接路徑裝載方法。

9)當使用直接路徑裝載方法時,為表的最大索引預先排序並使用sorted indexes子句。

10)當使用直接路徑裝載方法時,盡量使用並行直接路徑選項。

11)在直接路徑裝載期間,盡可能少使用重做日誌。有三種不同級別的控制實現這點:

禁止資料庫歸檔;

在控制檔案中使用關鍵字unrecoverable;

使用nolog屬性修改表和/或索引。

直接路徑並行載入的格式樣例:

UIApplication深入學習

新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...

深入學習CSS

什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...

block深入學習

block的宣告和使用看上一節就行了。本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似 對比一下 block定義 void someblock 函式指標定義 void functionpionter void functionname 當然區別還是有的,block的返回型...