Sqlldr效能引數

zyb200發表於2008-01-14

有四個 SQL*Loader 直接路徑裝載引數直接影響著直接路徑裝載操作的使用時間:
READSIZE 是緩衝區的大小,該緩衝區應用於從輸入資料檔案中讀取資料。
COLUMNARRAYSIZE 是一個兩維陣列的行數,該陣列用於儲存從資料檔案記錄中所收集的欄位資訊。陣列中的每行都儲存該行的欄位資訊。
STREAMBUFFERSIZE 是客戶端緩衝區大小,該客戶端緩衝區用於將轉換的原始資料傳遞到伺服器。
MULTITHREADING 是一個可選項,允許在資料庫伺服器進行資料裝載時併發地執行一些 SQL*Loader 客戶端操作。如果關閉多執行緒選項,則 SQL*Loader 客戶端將一直處於等待狀態,直到伺服器完成資料裝載才會繼續工作。如果開啟多執行緒選項,則某些對伺服器的呼叫將由客戶端的“裝載執行緒”來執行,同時客戶端的“主執行緒”繼續轉換資料並建立流緩衝區。
在裝載簡單資料型別且少於 256 列的表時,預設值可使效能達到最佳。但是如果需要提高裝載效能,則 DBA 可以對這些引數進行調整,確定對於特定裝載的最佳值。

[@more@]

本技術說明將著重討論在不同情況下更改這些引數預設值對效能的影響。雖然更改這些值可能會提高裝載的效能,但它們也可能不會影響效能,而在某些情況下甚至會降低效能。

COLUMNARRAYROWS、STREAMSIZE 與 READSIZE 引數之間的相互作用

以下步驟簡要描述了在執行直接路徑裝載時 SQL*Loader 如何使用這些引數。
SQL*Loader 客戶端將資料從輸入資料檔案讀入到緩衝區中。緩衝區大小由 READSIZE 引數控制。
SQL*Loader 解析它在緩衝區中找到的每條邏輯記錄,根據 SQL*Loader 控制檔案中所指定的欄位定義來分隔資料欄位。這種解析稱為“欄位設定”。欄位設定結果被儲存在“列陣列”中。列陣列儲存著表中每個被裝載列的資訊。列陣列中的行數由 COLUMNARRAYROWS 引數控制。
欄位設定持續地進行,直到列陣列已滿、檢測到讀緩衝區結束或者完成要裝載的行數為止。
解析到列陣列中的行被轉換到一個流緩衝區中。流緩衝區的大小由 STREAMSIZE 引數控制。在處理完列陣列中所有行之前可以對流進行填充。
流緩衝區資料傳送到伺服器。
伺服器解析原始資料並將其裝載到目標表中。
在裝載完流資料後,客戶端的流緩衝區被重置為空。
如果在列陣列中有更多資料需要轉換,則 SQL*Loader 從第 4 步執行。否則前進到第 9 步。
在處理了列陣列中的資料之後,SQL*Loader 在讀緩衝區中尋找更多的記錄。如果有更多記錄,則 SQL*Loader 客戶端從第 2 步繼續執行。否則前進到第 10 步。請注意來自兩個讀緩衝區的資料不會在出現在同一個列陣列或流緩衝區中。
如果已經處理了讀緩衝區中的所有記錄,則 SQL*Loader 會將更多資料裝載到讀緩衝區中(第 1 步)。
在這些步驟中所描述的過程持續進行,直到裝載了所需的行數、達到錯誤極限或者處理完所有輸入資料為止。

以下虛擬碼是對上面所述裝載過程的高階描述。錯誤限度檢查沒有被顯示出來,但是當達到錯誤限度時,裝載過程將會終止。
for each data file
{
while more data in the data files
{
fill read buffer with more data
for each record in the read buffer
{
do field setting
add row to column array
if column array is full OR row limit reached OR
no more complete records in read buffer
{
while more rows in column array to process
{
convert column array to data stream buffer
load data stream buffer
}
if row limit reached
load done
}
}
}
}

MULTITHREADING 引數

如果 MULTITHREADING 命令列引數被設定為 TRUE(多 CPU 客戶端的預設值),則 SQL*Loader 將利用流轉換來疊加流裝載。如果主執行緒已經將資料從列陣列轉換到流中,並且在處理完列陣列中所有資料之前對該流進行了填充,則裝載執行緒將會裝載該流,同時主執行緒繼續進行,將列陣列轉換到另一個流緩衝區中。當列陣列中最後一條記錄被轉換到流緩衝區中時,主執行緒將裝載該流緩衝區。請注意,如果列陣列中的所有資料適合裝入一個流緩衝區中,則不會使用裝載執行緒,效能也不會提高。

SQL*Loader 日誌檔案將報告由裝載執行緒和主執行緒所裝載的行數。以下是一個 SQL*Loader 日誌檔案中的部分內容摘錄,顯示關於一次裝載的資訊:
Total stream buffers loaded by SQL*Loader main thread: 47
Total stream buffers loaded by SQL*Loader load thread: 180

由主執行緒所裝載的流緩衝區計數包括列陣列的最後一個流,還包括由於伺服器在處理流資料時遇到錯誤而需要重新裝載流的次數(例如出現校驗約束錯誤)。由裝載執行緒所裝載的流緩衝區計數是在主執行緒將列陣列資料轉換到流時所裝載的流緩衝區總數。

在多執行緒處於開啟狀態時的總 CPU 使用時間與多執行緒處於關閉狀態時的 CPU 閒置時間大致相同。但是,當需要進行很多字符集、數值或日期轉換並且多執行緒處於開啟狀態時,可以顯著地減少使用時間。在 SQL*Loader 客戶端使用多執行緒會有一些開銷,因此當只有少量列需要轉換時,禁用多執行緒可以略微提高效能。

調整引數

READSIZE 引數確定由 SQL*Loader 所使用的輸入資料緩衝區大小。更大的 READSIZE 允許讀入更多的記錄。讀緩衝區在重新填充之前將會被完全地使用。因此,如果只有相當少的記錄適合裝入讀緩衝區時,不能充分利用非常大的列陣列或流緩衝區。一般而言,當一次可以處理更多輸入記錄時,效能將得到提高。

COLUMNARRAYROWS 值確定讀緩衝區中一次可以解析和轉換的最大記錄數量。更大的 COLUMNARRAYROWS 值的影響受到讀緩衝區大小的限制。也就是說,READSIZE 引數(它確定讀緩衝區可以儲存多少記錄)應該被設定為足夠大的值,至少可以儲存由 COLUMNARRAYROWS 值所確定的記錄數。

STREAMSIZE 確定向伺服器一次傳送的轉換流資料的數量。所有的轉換由 SQL*Loader 客戶端完成,作為將輸入資料移動到流緩衝區的工作的一部分。大流緩衝區的影響受到列陣列的行數和被轉換資料大小的限制。一般而言,一次向資料庫傳送的轉換資料越多,效能會越好。但是有一個限度,超過此限度時效能不會提高。該限度取決於每次不同裝載的具體情況。同樣,為了提高多執行緒的效能,每個列陣列需要多個流緩衝區裝載。因此,如果將流大小設定得更小,則效能將會提高。

讀緩衝區可裝入的記錄的合適數量取決於輸入記錄的大小,而不是傳送到伺服器的轉換列資料的大小。輸入記錄中的某些資料可能被欄位設定完全地忽略。同樣,傳送到伺服器的轉換過的流資料可能需要比輸入資料更多或更少的空間,這取決於所需要的轉換、資料庫列大小及其資料型別。例如,裝載只有幾個輸入字元的 CHAR(2000) 列將會導致向伺服器傳送相對於輸入記錄大小而言多得多的流資料。

只有在為一個列陣列向伺服器傳送多個流並且需要很多資料轉換時,多執行緒操作才會減少所使用的時間。如果能夠一次將列陣列中所有的行都轉換到一個流緩衝區中時,將不使用這種最佳化方法。如果裝載執行緒沒有裝載很多流,則嘗試增加列陣列的行數、輸入讀緩衝區的大小,或者二者都增加。

在更改這些引數時應該小心,因為增加這些引數值會需要更多的實體記憶體。如果這樣做會導致頁面操作,則不應該增加其預設值。實際上,如果檢測到 SQL*Loader 客戶端的進行分頁操作,或者 SQL*Loader 客戶端程式看來正在使用大量記憶體,則要降低這些引數的值。請從降低 COLUMNARRAYROWS 引數值開始,特別是在每條邏輯記錄的裝載操作涉及到多條物理記錄,或是在每行要裝載大量列資料的情況下(除了 LOB 或 LONG 列,這些列被單獨處理)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/64429/viewspace-997291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章