天天看點

我的Oracle 9i學習日志(24)--載入資料

<b>資料加載方式:</b>

<a href="http://blog.51cto.com/attachment/201004/201730259.png" target="_blank"></a>

圖1

•SQL*loader

•直接加載:直接加載插入可用于在同一資料庫中從一個表向另一個表複制資料。此方法繞過資料庫緩沖區高速緩存直接将資料寫入資料檔案,進而加快了插入操作的速度。

<b>直接加載</b>

直接加載插入(串行或并行)隻能支援INSERT 語句的INSERT ... SELECT 文法而無法支援其INSERT ... Values 文法。INSERT ... SELECT 的并行性是由并行提示或并行表定義決定的。Oracle9i 提供了文法擴充,擴大了INSERT ... SELECT語句的使用範圍。結果,可以将行插入到多個表中(作為單個DML 語句的一部分)。

可使用APPEND 提示調用直接加載插入,如以下的指令所示:

INSERT /*+APPEND */ INTO [ schema. ] table

[ [NO]LOGGING ]      #該選項無效。

sub-query;

其中:

schema:表的所有者

table:表名

sub-query:用于選擇所要插入的列和行的子查詢

LOGGING 模式:

如果使用LOGGING 選項(預設設定)進行插入,該操作将生成重做日志條目,進而使得從失敗中完全恢複成為可能。如果使用NOLOGGING 選項,則不會将對資料所做的更改記入重做日志緩沖區中。但對于更新資料字典的操作,仍進行最小限度的記錄。如果已為表

設定NOLOGGING 屬性,則将使用NOLOGGING 模式。如果表空間為force logging模式則插入時為log模式。

如果接下來可能對表資料進行多次聯機修改,則最好在加載前設定NOLOGGING 屬性,并在完成加載後再将表的屬性重置為LOGGING。

注:

通過直接加載插入而加載的所有資料都将加載在高水位标記之上。如果表中有許多塊中的行已被删除,則可能會浪費空間并減慢全表掃描的速度。

<b>直接加載方式:</b>

•到非分區表、分區表或子分區表中的串行直接加載插入:

資料将插入到表段或各分區段的目前高水位标記之上。高水位标記是一個分界線,分界線

以上的塊不會格式化,因而無法接收資料。執行一條語句後,就會将高水位标記更新為一

個新值,以便使些資料可見。當加載分區表或子分區表時,SQL*Loader 将對行進行分區

并維護索引(也可進行分區)。如果對分區表或子分區表進行直接路徑加載,那可能會消

耗大量的資源。

<a href="http://blog.51cto.com/attachment/201004/201744827.png" target="_blank"></a>

圖2

SQL&gt; create table loadtest as select * from all_objects where 1=0;

Table created.

SQL&gt; select count(*) from all_objects;

 COUNT(*)

----------

     30363

SQL&gt; select count(*) from loadtest;

傳統加載插入方式:

SQL&gt; insert into loadtest select * from all_objects;

30363 rows created.

#在送出前就可以查詢。

SQL&gt; commit;

Commit complete.

串行直接加載:

SQL&gt; insert /*+ append */ into loadtest

 2 nologging

 3 select * from loadtest;

select count(*) from loadtest

*

ERROR at line 1:

ORA-12838: cannot read/modify an object after modifying it in parallel

#在送出前無法查詢。

     60726

•<b>并行直接加載</b>

<a href="http://blog.51cto.com/attachment/201004/201801774.png" target="_blank"></a>

圖3

可以使用下列方法之一來并行執行直接加載插入:

•在INSERT 語句中使用PARALLEL 提示,如下面例子所示。

•建立表或改變表以指定PARALLEL 子句

進行并行的直接加載插入時,Oracle 伺服器會使用多個稱為“并行查詢從屬”的程序将資料插入到表中。配置設定臨時段以存儲各個從屬程序所插入的資料。送出事務處理時,這些段中的區就将成為用來插入記錄的那個表的一部分。

•必須在事務處理一開始時執行ALTER SESSION ENABLE PARALLEL DML 指令。

•在同一事務進行中,不能再次查詢或修改那些通過并行直接加載插入而被修改的對象。

到非分區表中的并行直接加載插入:

每個并行執行伺服器都将配置設定一個新的臨時段,并将資料插入到該臨時段中。執行一條語句後,并行執行協調程式就會将這些新臨時段合并為主表段。

到分區表中的并行直接加載插入:

給每個并行執行伺服器配置設定一個或多個分區,其中每個分區最多隻能有一個程序在運作。并行執行伺服器将資料插入到給它配置設定的分區段的目前高水位标記之上。執行一條語句後,并行執行協調程式就會将每個分區段的高水位标記更新為一個新值,以便使這些資料可見。

建立分區表:

SQL&gt; create table customers1

 2 (cust_code varchar2(3) not null,name varchar2(50),region varchar2(5)

 3 )

 4 partition by hash(cust_code)

 5 (partition part1,partition part2)

 6 /

SQL&gt; desc customers1

 Name                                      Null?    Type

 ---------------------------------------- -------- ----------------

 CUST_CODE                                 NOT NULL VARCHAR2(3)

 NAME                                               VARCHAR2(50)

 REGION                                             VARCHAR2(5)

SQL&gt; select object_name,object_type from user_objects;

OBJECT_NAME                    OBJECT_TYPE

------------------------------ ------------------

CUSTOMERS                      TABLE

CUSTOMERS1                     TABLE PARTITION

CUSTOMERS1                     TABLE

EXCEPTIONS                     TABLE

ORDERS                         TABLE

PK_CUST                        INDEX

7 rows selected.

SQL&gt; alter session enable parallel dml;

Session altered.

SQL&gt; insert /*+parallel(customers1,2) */     #2表示啟用2個程序,這裡指定多于分區個數也可以執行。

 2 into customers1 nologging

 3 select * from customers;

7 rows created.

SQL&gt; select * from customers;

CUS NAME                                               REGIO

--- -------------------------------------------------- -----

A01 TKB SPORT SHOP                                     West

A02 VOLLYRITE                                          North

A04 EVERY MOUNTAIN                                     South

A05 SHAPE UP                                           South

A06 SHAPE UP                                           West

A07 WOMENS SPORTS                                      South

A08 NORTH WOODS HEALTH AND FITNESS SUPPLY CENTER       East

#未送出前也可以查詢???

非分區表并行插入:

SQL&gt; create table orders1 as select * from orders where 1=0;

SQL&gt; insert /*+ parallel(orders1,2) */

 2 into orders1 nologging

 3 select * from orders;

16 rows created.

SQL&gt; select * from orders1;

    ORD_ID ORD_DATE CUS DATE_OF_D PRODUCT_ID

---------- --------- --- --------- ----------

       610 11-NOV-97 A01

       611 15-NOV-97 A02

       612 19-NOV-97 A04

。。。。。。

16 rows selected.

怎樣使直接載入時為nologging模式?

SQL&gt; set autot on stat

24930 rows created.

Statistics

----------------------------------------------------------

        366 recursive calls

       2221 db block gets

      94179 consistent gets

          0 physical reads

    2845488 redo size

        623 bytes sent via SQL*Net to client

        546 bytes received via SQL*Net from client

          3 SQL*Net roundtrips to/from client

          2 sorts (memory)

          0 sorts (disk)

      24930 rows processed

SQL&gt; insert /*+ append */ into loadtest select * from all_objects;

         73 recursive calls

         40 db block gets

      93670 consistent gets

    2872084 redo size

        607 bytes sent via SQL*Net to client

        560 bytes received via SQL*Net from client

          1 sorts (memory)

SQL&gt; insert /*+ append */ into loadtest nologging select * from all_objects;

         51 recursive calls

         29 db block gets

      93660 consistent gets

    2870728 redo size

        608 bytes sent via SQL*Net to client

        573 bytes received via SQL*Net from client

SQL&gt; alter table loadtest nologging;

Table altered.

        279 recursive calls

      93713 consistent gets

       4956 redo size

        609 bytes sent via SQL*Net to client

          6 sorts (memory)

<b>SQL*Loader</b>

參考文獻:聯機文檔Utilities;Oracle自帶11個執行個體(ORACLE_HOME/rdbms/demo/ulcase*);Expert.Oracle.Database.Architecture.9i.and.10g

<a href="http://blog.51cto.com/attachment/201004/201823213.png" target="_blank"></a>

圖4

<b>SQL*Loader </b><b>控制檔案</b>

SQL*Loader 控制檔案是一個文本檔案,其中包含一些資料定義語言(DDL) 指令。DDL 用于控制SQL*Loader 會話的以下方面:

• SQL*Loader 到何處查找所要加載的資料

• SQL*Loader 希望資料采用什麼格式

• SQL*Loader 在加載資料時如何進行配置(記憶體管理、拒絕記錄、處理被中斷的加載等)

• SQL*Loader 如何操縱正在加載的資料

雖然并未明确定義,但是可以将加載程式控制檔案劃分為三個部分。

•第一部分包含會話範圍内的資訊,例如:

–全局選項(如綁定大小、行、要跳過的記錄等)

–指定輸入資料所在位置的INFILE 子句

–如何加載資料

•第二部分包含一個或多個INTO TABLE 塊。其中每個塊都包含一些與要在其中加載資料的那個表有關的資訊,如該表的名稱以及表中各列。

•第三部分是可選的。如果該部分存在,其中将包含輸入資料。

以下示例為一個典型的SQL*Loader 控制檔案。

1 -- This is a sample control file

2 LOAD DATA

3 INFILE ’SAMPLE.DAT’

4 BADFILE ’sample.bad’

5 DISCARDFILE ’sample.dsc’

6 APPEND

7 INTO TABLE emp

8 WHEN (57) = ’.’

9 TRAILING NULLCOLS

10 (hiredate SYSDATE,

deptno POSITION(1:2) INTEGER EXTERNAL(3)

NULLIF deptno=BLANKS,

job POSITION(7:14) CHAR TERMINATED BY WHITESPACE

NULLIF job=BLANKS "UPPER(:job)",

mgr POSITION(28:31) INTEGER EXTERNAL

TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,

ename POSITION(34:41) CHAR

TERMINATED BY WHITESPACE "UPPER(:ename)",

empno POSITION(45) INTEGER EXTERNAL

TERMINATED BY WHITESPACE,

sal POSITION(51) CHAR TERMINATED BY WHITESPACE

"TO_NUMBER(:sal,’$99,999.99’)",

comm INTEGER EXTERNAL ENCLOSED BY ’(’ AND ’%’

":comm * 100"

)

對示例控制檔案的解釋如下:

1. 這就是在控制檔案中輸入注釋的方法。注釋可以出現在檔案的指令部分中的任何地方,但不能出現在資料中。

2. LOAD DATA 語句通知SQL*Loader 将要開始一個新的資料加載。如果要繼續執行之前遭到中斷的加載程序,則應該使用CONTINUE LOAD DATA 語句。

3. INFILE 關鍵字指定其中包含所要加載的資料的資料檔案的名稱。

4. BADFILE 關鍵字指定用于儲存遭拒絕記錄的檔案的名稱。

5. DISCARDFILE 關鍵字指定用于放置廢棄記錄的檔案的名稱。

6. APPEND 關鍵字是那些可用于将資料加載到非空的表中的多種選項中的一種選項。若要将資料加載到空表中,則可以使用INSERT 關鍵字。

7. INTO TABLE 關鍵字用于指定表、字段和資料類型。它定義了資料檔案中的記錄與資料庫中的表之間的關系。

8. WHEN 子句指定了一個或多個字段條件。在SQL*Loader 加載資料之前,每條記錄都必須符合這些條件。在此示例中,僅當第57 個字元是小數點時,SQL*Loader 才會加載這條記錄。該小數點分隔字段中的元和分,而且在SAL 沒有值的情況下将導緻該記錄被拒絕。

9. TRAILING NULLCOLS 子句訓示SQL*Loader 将任何處于相對位置的列(即不在該記錄中的列)作為空列處理。

10. 控制檔案的剩餘部分包含字段清單,該清單提供了所要加載的表中的列格式的有關資訊。

<b>與控制檔案的文法有關的注意事項</b>

•控制檔案的文法在格式方面沒有任何限制(語句可以長達數行)。

•它不區分大小寫。但是,單引号或雙引号内的字元串必須完全保留原樣(包括大小寫在内)。

•在控制檔案的文法中,注釋從兩個标記注釋開始處的連字元(--) 開始一直延續到行尾。控制檔案的第三部分(可選)被認為是資料(而非控制檔案的文法),是以,注釋在此部分中不受支援。

•對SQL*Loader 來說,CONSTANT和ZONE關鍵字具有特殊含義,是以将該關鍵字加以保留。為避免出現潛在的沖突,不應将CONSTANT或ZONE 一詞用作任何表或列的名稱。

<b>輸入資料和資料檔案</b>

固定記錄格式:

如果資料檔案中的所有記錄具有相同的位元組長度,則檔案采用的是固定記錄格式。雖然這種格式最為死闆,但是它所帶來的性能比可變記錄格式或流格記錄格式都好。此外,固定記錄格式還很易于指定。例如:INFILE &lt;datafile_name&gt; "fix n"在此示例中,SQL*Loader 應該認為特定資料檔案采用的是固定記錄格式,其中每條記錄都具有n 個位元組。

以下示例顯示的是一個指定讓資料檔案采用固定記錄格式的控制檔案。該資料檔案包含4條實體記錄。第一條記錄是[0001, abcd],其中正好包括9 個位元組(使用單位元組字元集),回車符是第10 個位元組。

load data

infile ’example.dat’ "fix 10"

into table example

fields terminated by ’,’

(col1, col2)

example.dat:

0001,abcd

0002,fghi

0003,klmn

可變記錄格式:

如果資料檔案中每條記錄的開頭都包含了該記錄在字元字段中的長度,則檔案所采用的可變記錄格式。這種格式與固定記錄格式相比具有更大的靈活性,與流式記錄格式相比則能帶來更高的性能。例如,可以按以下方法指定一個被認為是采用了可變記錄格式的資料檔案:

INFILE "datafile_name" "var n"

在此示例中,n 指定記錄長度字段中的位元組數。如果未指定n,則SQL*Loader 假定記錄長度為5 個位元組。如果指定的n 大于40,就會出現錯誤。以下示例顯示的是一個控制檔案說明,它訓示SQL*Loader 在example.dat 資料檔案中查找資料,并且向SQL*Loader 指明該檔案采用的格式為可變記錄格式,其中的記錄長度字段包括3 個位元組。example.dat資料檔案包含3 條實體記錄。其中,第1 條記錄的長度被指定為009(即9)個位元組,第2記錄的長度為010 個位元組(包括由一個字元組成的新行),第3 條記錄的長度為012 個位元組。此示例還假定該資料檔案使用單位元組字元集。

infile ’example.dat’ "var 3“

fields terminated by ’,’ optionally enclosed by ’"’

(col1 char(5),col2 char(7))

009hello,cd,

010world,im,

012my,name is,

流式記錄格式:

如果不是按大小來指定記錄,而是讓SQL*Loader 通過掃描記錄結束符來判斷記錄的起始和結束,則檔案所采用的是流式記錄格式。流式記錄格式是最靈活的格式,但可能會使性能下降。要使資料檔案的格式被認為是流式記錄格式,則該資料檔案的說明将類似以下語句:

INFILE &lt;datafile_name&gt; ["str terminator_string"]

将terminator_string 指定為’char_string’或X’hex_string’,其中:char_string’是用一個用單引号或雙引号引起來的字元串X’hex_string’是一個采用十六進制格式的位元組字元串如果terminator_string 中包含特殊字元(即不可列印的字元),應該将它指定為X’hex_string’。但是,通過使用反斜杠,可以将某些不可列印的字元指定為(’char_string’)。例如:

\n 換行符(新行)

\t 橫向制表符

\f 換頁符

\v 縱向制表符

\r 回車符

如果通過NLS_LANG 參數給會話指定的字元集與資料檔案的字元集不相同,則将字元串轉換為資料檔案的字元集。十六進制字元串應該在資料檔案的字元集範圍之内,是以不會進行轉換。如果未指定terminator_string,則它将采用預設值:新行(行尾)符。在基于UNIX 的平台上,新行符為換行符,而在Microsoft 平台上則為回車符加上換行符。新行符将放在資料檔案的字元集後面。

以下示例說明了如何加載采用流式記錄格式的資料,在此格式中将使用字元串’|\n’來指定結束符字元串。通過在該字元串中使用反斜杠字元,可指定不可列印的換行符。

infile ’example.dat’ "str ’|\n’“

(col1 char(5),

col2 char(7))

hello,world,|

james,bond,|

<b>邏輯記錄</b>

SQL*Loader 按照指定的記錄格式将輸入資料以實體記錄的形式出現。預設情況下,一條實體記錄就是一條邏輯記錄。但是為了增大靈活性,可以訓示SQL*Loader 将大量的實體記錄合并為一條邏輯記錄。SQL*Loader 可以使用以下兩種方法之一完成該操作:

•将固定數量的實體記錄合并為一條邏輯記錄

•當某種條件為真時,将實體記錄合并為邏輯記錄

使用CONCATENATE 來彙集邏輯記錄:

如果SQL*Loader 應該始終将相同數量的實體記錄組合成一條邏輯記錄,則使用CONCATENATE。以下是CONCATENATE 的一個使用示例。在該示例中,integer 用于指定所要合并的實體記錄的數量:CONCATENATE integer

使用CONTINUEIF 來彙集邏輯記錄:

如果所要合并的實體記錄的數量是變化的,則必須使用CONTINUEIF。在CONTINUEIF關鍵字後面跟有一個條件。讀取每條實體記錄時,都會對該條件進行求值。例如,如果第1 條記錄在字元位置80 處有一個英鎊符号(#),則有可能将兩條記錄合并。如果該字元位置上是任何其它字元,則不将第2 條記錄添加到第1 條記錄上。

加載方法

<a href="http://blog.51cto.com/attachment/201004/201846449.png" target="_blank"></a>

圖5

正常路徑加載:

正常路徑加載将需要插入的行排成一個數組,并使用SQL INSERT 語句加載資料。在正常路徑加載期間,将基于字段說明來分析輸入記錄,而且将記錄排成一個數組并将其插入到控制檔案所指定的表中。不符合字段說明的記錄将被拒絕,而不滿足選擇标準的記錄則将被廢棄。

可通過正常路徑加載将資料加載到集簇表及非集簇表中。至于重做日志的生成情況,則受到所加載表的記錄屬性的控制。

直接路徑加載:

直接路徑加載在記憶體中建立資料塊,并将這些塊直接儲存到為正在進行加載的表配置設定的區内。僅當資料庫處于ARCHIVELOG 模式時,才會生成重做日志條目。直接路徑加載使用字段說明建立全部的Oracle 資料塊,并将這些塊直接寫入Oracle 資料檔案中。直接路徑加載繞過資料庫緩沖區高速緩存,而且僅在需要管理區和調整高水位标記時才會通路SGA。

直接路徑加載通常比正常路徑加載速度快,但它不能應付所有情況。

注:Oracle 所提供的腳本catldr.sql 可建立供直接路徑加載使用的視圖。該腳本将在運作catalog.sql 腳本時自動調用。

<b>直接路徑加載和正常路徑加載的比較</b>

<a href="http://blog.51cto.com/attachment/201004/201904540.png" target="_blank"></a>

圖6

儲存資料的方法:

正常路徑加載使用SQL 處理及資料庫COMMIT 來儲存資料。在插入記錄數組後将執行送出操作。每次資料加載都可能涉及多個事務處理。

直接路徑加載使用資料儲存來将資料塊寫入到Oracle 資料檔案中。資料儲存與COMMIT

之間存在以下差別:

•資料儲存期間,隻将寫滿的資料庫塊寫入資料庫。

•塊寫在表的高水位标記之後。

•資料儲存之後,高水位标記移動。

•資料儲存之後不釋放内部資源。

•資料儲存不結束事務處理。

•每次資料儲存時不更新索引。

記錄所進行的更改:

正常路徑加載就像任何DML 語句一樣生成重做日志條目。如果使用直接路徑加載,則在下列情況下将不生成重做日志條目:

•資料庫為NOARCHIVELOG 模式

•資料庫為ARCHIVELOG 模式,但禁用事件記錄。通過為表設定NOLOGGING 屬性或在控制檔案中使用UNRECOVERABLE 子句,可禁用事件記錄。

執行限制:

正常路徑加載期間,與在任何DML操作期間一樣,強制執行所有啟用的限制。

在直接路徑加載期間,對限制進行如下處理:

•建立數組時檢查NOT NULL 限制。

•禁用外鍵限制和CHECK 限制,并可在運作結束時通過使用控制檔案中的有關指令來啟用它們。禁用外鍵限制的原因在于:這些限制引用其它行或表;禁用CHECK限制則是因為這些限制可能使用SQL 函數。如果隻要将少數幾行插入到一個大表中,可使用正常加載。

•運作期間和運作結束時檢查主鍵限制和唯一性限制,如果違反,則可能禁用。

觸發INSERT 觸發器:

雖然在正常加載期間會觸發INSERT 觸發器,但它們在進行直接路徑加載之前被禁用,并在運作結束時重新啟用。如果某個引用對象在運作結束時無法通路,說明這些觸發器可能仍被禁用。請考慮使用正常路徑加載,以通過INSERT 觸發器将資料加載到表中。

加載到集簇表中:

不能通過直接加載來将行加載到集簇表中。隻能使用正常路徑加載來加載集簇表。

鎖定:

在直接加載期間,其它事務處理不能對正被加載的表進行更改。不過,該規則存在一種例外情況,即在并發使用多個并行直接加載會話時可以對正被加載的表進行更改。

<b>并行直接路徑加載</b>

<a href="http://blog.51cto.com/attachment/201004/202015566.png" target="_blank"></a>

圖7

使用多個SQL*Loader 會話可提高直接路徑加載的性能。有三種并發模式可用于最大限度地縮短資料加載所需的時間:

•并行正常路徑加載

•在直接路徑加載方法中使用段間并發

•在直接路徑加載方法中使用段内并發

并發正常路徑:

如果觸發器或完整性限制出現問題,但又希望獲得更快的加載速度,則應該考慮使用多個并發的正常路徑加載。請在具有多個CPU 的系統上使用多個并發執行的加載會話。在邏輯記錄邊界上将輸入資料檔案拆分為多個單獨的檔案,然後使用正常路徑加載會話分别加載拆分得到的輸入資料檔案。

段間并發:

段間并發可用于并發加載不同的對象。在直接路徑加載中,這種技術可用于并發加載不同的表,或者并發加載同一表中的不同分區。

段内并發:

并行直接路徑加載允許多個直接路徑加載會話将資料并發加載到同一表中,或者加載到某個允許進行段内并發操作的分區表的同一分區中。

<b>資料轉換</b>

在正常路徑加載過程中,分兩步将資料檔案中的資料字段轉換為資料庫中的列:

•控制檔案中的字段說明用于解釋資料檔案的格式,并使用該資料将資料檔案轉換為SQL INSERT 語句。

• Oracle 資料庫伺服器接受該資料,并執行INSERT 語句将資料存儲到資料庫中。

<b>被廢棄或拒絕的記錄</b>

壞檔案:

壞檔案包含被SQL*Loader 或Oracle 資料庫拒絕的記錄。

SQL*Loader 所拒絕的記錄:

如果輸入格式無效,SQL*Loader 将拒絕記錄。例如,如果記錄的右引号分隔符丢失或者其中某個受限制的字段超過其最大長度,則SQL*Loader 将拒絕該記錄。該遭拒絕的記錄将被置入壞檔案中。

Oracle 所拒絕的記錄:

在SQL*Loader 接受一條記錄以進行處理後,就會向Oracle 發送一行以進行插入。如果Oracle 确定該行有效,就會将該行插入到資料庫中。否則,将拒絕該記錄,并且SQL*Loader 将該記錄放到壞檔案中。如果出現以下情況,該行就可能被拒絕:某個鍵不是唯一的、某個所需的字段為空,或者字段中包含的資料對于Oracle 來說屬于無效的資料類型。

廢棄檔案:

執行SQL*Loader 時,它可能會建立一個稱為“廢棄檔案”的檔案。僅在确實需要廢棄檔案、并且您已指定應該啟用廢棄檔案時才建立該檔案。廢棄檔案包含在加載過程中過濾出來的記錄,因為這些記錄與控制檔案中指定的任何記錄選擇标準均不符合。是以,廢棄檔案包含那些未插入到資料庫任何表中的記錄。可以指定廢棄檔案所能接受的此類記錄的最大數量。

<b>日志檔案的内容</b>

“标頭資訊”部分包含以下條目:

•運作日期

•軟體版本号

“全局資訊”部分包含以下條目:

•所有輸入/輸出檔案的名稱

•指令行參數的回顯

•續行符說明

“表資訊”部分為所加載的每個表提供以下條目:

•表名

•加載條件(如有)。也即,是加載所有的記錄,還是僅加載那些符合WHEN 子句标準的記錄。

• INSERT、APPEND 或REPLACE 說明

•以下列資訊:

–位置、長度、資料類型和分隔符(如果能在資料檔案中找到)

– RECNUM、EQUENCE、CONSTANT 或EXPRESSION(如果指定)

– DEFAULTIF 或NULLIF(如果指定)

如果SQL*Loader 控制檔案包含任何可用于加載日期時間或時間間隔等資料類型的指令,則日志檔案将在資料類型标題下面包含DATETIME 或INTERVAL 關鍵字。如果适用的話,還将在DATETIME 或INTERVAL 關鍵字後面加上相應的标記。

僅當資料檔案中的資料有錯誤時,才會出現“資料檔案資訊”部分。該部分提供以下條目:

• SQL*Loader 和Oracle 資料記錄錯誤

•被廢棄的記錄

“表加載資訊”部分為所加載的每個表提供以下條目:

•加載的行數

•有資格加載但由于資料錯誤而被拒絕的行數

•由于未通過WHEN 子句測試而被廢棄的行數

•相關字段均為空的行數

“小結統計資訊”部分顯示以下資料:

•占用的空間量:

–用于綁定數組(實際使用量基于已指定的BINDSIZE)

–用于其它開銷(始終需要,而與BINDSIZE 無關)

•累計得到的加載統計資訊;即對于所有的資料檔案,所跳過、讀取或拒絕的記錄數加載表時,将記錄以下統計資訊:

•如果對分區表進行直接路徑加載,将報告每個分區的統計資訊。

•正常路徑加載無法報告每個分區的統計資訊。

如果沒有啟用媒體恢複,則不對加載進行記錄。即,如果禁用媒體恢複,将忽略記錄操作請求。

<b>SQL*Loader </b><b>原則</b>

使用SQL*Loader 時應遵循下列原則,以使錯誤減到最少并提高性能:

•使用參數檔案來指定常用的指令行選項。例如,如果每周都要将資料加載到資料倉庫中,則除檔案名外,其它所有選項都可以保持不變。

•将控制檔案與資料檔案分開,這樣可以在多個加載會話中反複使用控制檔案。

•基于預期的資料量預先配置設定好空間,以免在加載期間動态配置設定區,進而可提高加載速度。

•對于直接加載,将使用臨時段來生成新資料的索引。加載結束時,這些索引将與現有索引合并。通過按最大索引的關鍵字對輸入資料進行排序,可以最大限度地減少排序所使用的空間。

•在并行直接加載中,可指定用于插入資料的臨時段的位置。對于每個加載會話,可指定不同的資料庫檔案以獲得最佳性能。

本文轉自 d185740815 51CTO部落格,原文連結:http://blog.51cto.com/luotaoyang/299529,如需轉載請自行聯系原作者