#聲明臨時表
DECLARE GLOBAL TEMPORARY TABLE session.temp1
  LIKE employee
  ON COMMIT PRESERVE ROWS
  NOT LOGGED
IN mytempspace

#ALTER
  可以修改:緩沖池,表,表空間,視圖

#DROP
  可以刪除:緩沖池,事件監控程序,函數,索引,模式,存儲過程,表,表空間,觸發器,視圖.
#產生數據備份
CREATE TABLE pers LIKE staff

INSERT INTO pers
  SELECT id, name, dept, job, years, salary, comm
    FROM staff
    WHERE dept = 38

#唯一性約束
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
                    BOOKNAME VARCHAR(100),
                    ISBN CHAR(10) NOT NULL CONSTRAINT BOOKSISBN UNIQUE)

ALTER TABLE BOOKS ADD  CONSTRAINT UNIQUE (BOOKID)

#參照完整性約束
CREATE TABLE AUTHORS (AUTHORID INTEGER NOT NULL PRIMARY KEY,
                      LNAME VARCHAR(100),
                      FNAME VARCHAR(100))
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
                    BOOKNAME VARCHAR(100),
                    ISBN CHAR(10),
                    AUTHORID INTEGER REFERENCES AUTHORS)

#表檢查約束
ALTER TABLE BOOKS ADD BOOKTYPE CHAR(1) CHECK (BOOKTYPE IN ('F','N') )


#創建索引
CREATE INDEX I2BOOKNAME ON BOOKS (AUTHOID DESC, BOOKNAME ASC)


#設置概要文件注冊表
  設置后實例要重新啟動
  列出所有的變量: db2set -lr
  設置變量:db2set variable_name=value
  設置為缺省值:db2set variable_name=
  顯示設置的變量:db2set -all
# 設置數據庫管理器和數據庫的參數
  獲取當前參數:
    db2 get database manager configuration
db2 get database configuration for database_name
db2 get database manager configuration show detail
  設置參數:
   db2 update database manager configuration using parameter new_value
db2 update database configuration for database_name using parameter new_value
#準備數據庫服務端口
  db2set DB2COMM=TCPIP,NETBIOS
  在services文件中包含服務和端口號,
   如:db2icdb2    50000/tcp
  db2 update database manager configuration using svcename db2icdb2
  重新啟動數據庫.
 
#查看連接的應用程序
  db2 list applications [for database db-name] [show detail]
#斷開應用程序
  db2 force application (6,5)
  db2 force application all
#設置客戶認證方式
  db2 update database manager configuration authentication auth_type
#創建緩沖池
  create bufferpool BP2 size 25000 pagesize 8 k

CONNECT TO SCCRM;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 1 SIZE 50000;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 0 SIZE 50000;
CONNECT RESET;

#將表空間的狀態復位成正常(NORMAL)
  quiesce tablespaces for table <tablename> reset
 
#有用的目錄表
  SYSCAT.COLUMNS:所包含的每一行對應于表或視圖中定義的每個列
  SYSCAT.INDEXCOLUSE:列出索引中包含的所有列
  SYSCAT.INDEXES:包含的每一行對應于表或視圖中定義的每個索引(包括適用的繼承索引)。
  SYSCAT.TABLES:所創建每個表、視圖、別名(nickname)或別名(alias)都對應其中一行。所有目錄表和視圖都在 SYSCAT.TABLES 目錄視圖中擁有一項。
  SYSCAT.VIEWS:所創建的每個視圖都對應其中一行或多行。
 

###監控DB2活動
  ##捕獲快照
    數據庫,表空間,表,緩沖池,鎖,數據庫管理器,應用程序
  #拍攝快照
   API,命令行
  UPDATE MONITOR SWITCHES
  #打開和關閉快照
   1,在實例級別上設置監視器開關(影響所有用戶和數據庫)
     DFT_MON_STMT:語句監視器(用于動態 SQL)
DFT_MON_TABLE:表監視器
DFT_MON_LOCK:鎖監視器
DFT_MON_BUFPOOL:緩沖池監視器
DFT_MON_SORT:排序監視器
DFT_MON_UOW:工作單元信息
DFT_MON_TIMESTAMP:跟蹤時間戳記信息
     db2 get dbm cfg|grep DFT_MON
     db2 update dbm cfg using monitorSwitch [ON|OFF]
db2 update dbm cfg using DFT_MON_SORT ON

   2,在應用程序級別上設置監視器開關(只適合于特定的應用程序)
   在CLP中打開只適合這個CLP
     Bufferpool
Lock
Sort
Statement
Table
Timestamp
UOW

db2 get monitor switches
    db2 update monitor switches using switchName [ON|OFF]
    3,復位開關
  db2 reset monitor [ALL|for database databaseName] [at dbpartitionnum partitionNum]
將監視器開關的值復位成空或0.
    #數據庫快照
     包含如下信息:
     連接
DB2 代理程序

排序
緩沖池活動總數
SQL 活動
SQL 語句數量
日志使用情況
高速緩存使用情況
散列連接
    下面是獲取這種快照的命令
db2 get snapshot for database on databaseName

    #數據庫管理器快照
    db2 get snapshot for database manager
    #表快照
    db2 get snapshot for tables on drew_db
    #表空間和緩沖池快照
    db2 get snapshot for tablespaces on drew_db
    db2 get snapshot for bufferpools on drew_db

計算緩沖池命中率:
    Ratio = ((1-(physical index and data reads))/(logical index and data reads))*100%

    #鎖快照
    db2 get snapshot for locks on drew_db
   
    #動態SQL快照
    #查找執行速度較慢的SQL
     SELECT stmt_text,total_exec_time,num_executions
     FROM TABLE (SNAPSHOT_DYN_SQL('DREW_DB',-1)) as dynSnapTab
     ORDER BY total_exec_time desc
     FETCH FIRST 1 ROW ONLY

    第二個示例查找平均執行時間最長的五條 SQL 語句:


SELECT stmt_text,
CASE WHEN num_executions = 0
THEN 0
ELSE (total_exec_time / num_executions)
END avgExecTime,
num_executions
FROM TABLE( SNAPSHOT_DYN_SQL('DREW_DB', -1)) as dynSnapTab
ORDER BY avgExecTime desc
FETCH FIRST 5 ROWS ONLY

### 事件監控器
     人們用快照來檢查某個精確時刻的DB2,并聚集性能信息。事件監控器與此不同,人們用他在固定的時間
    周期內監控DB2性能。事件監視器檢查數據庫中的轉換事件,并將每個事件都當成一個對象。這允許對 DB2 的行為進行非常詳細的分析。
        事件監視器捕獲的信息類似于快照捕獲的信息。同時可以運行多個監視器,并且每個監視器也可以捕獲多種事件類型的信息。這允許不同的管理員相互獨立地監控不同的活動。

事件監視器可以捕獲有關下列內容的信息:

數據庫

死鎖
表空間
緩沖池
連接
語句
事務
可將事件監視器的信息寫到:

SQL 表
文件
管道

   ##創建事件監視器
     CREATE EVENT MONITOR
   ##打開和關閉監視器
     db2 set event monitor eventMonitorName state [0|1]
eventMonitorName 是已創建的事件監視器的名稱。0 將關閉監視器,而 1 將打開監視器。
      #獲取狀態
      SELECT EVENT_MON_STATE('drewTest') FROM SYSIBM.SYSDUMMY1

SYSIBM.SYSEVENTMONITORS 表及該表的視圖 SYSCAT.EVENTMONITORS 包含有關已創建的事件監視器的信息。可以對這些表運行 SQL 查詢,以確定監視器的狀態:
SELECT evmonname, target_type, target,
FROM syscat.eventmonitors
where evmonname LIKE 'drew%'

autostart 選項

用于創建事件監視器的命令中的 autostart 選項表明,每當數據庫啟動時,自動啟動事件監視器。

#清空事件監視器
      注意:事件監控器名稱使用大寫字母,需要創建目錄。
     
     
還可將事件監視器數據清空到磁盤中。如果您希望記錄這類信息,如通常僅當終止所有連接時才寫的數據庫事件,那么這非常有用。下面是一個示例命令:

db2 flush event monitor eventMonitorName
#使用事件監視器
       事件監視器應當用于監控非常具體的一些事件或短時間內的工作負載。它
們旨在為您提供非常具體的信息,以允許您診斷數據庫或應用程序的問題或行為。
與快照不同,事件監視器對 DB2 的性能影響極大。這是由于為每個事件對象寫的
信息的數量造成的。語句監視器對性能的影響極大,因為數據庫引擎必須為每個
查詢執行所有額外的工作:不只是能夠執行查詢,DB2 引擎還必須寫出這條查詢
的所有特征和運行時信息。該信息必須寫入文本文件,這樣會進一步降低性能。

#死鎖監控
        CREATE EVENT MONITOR DEADLOCK_DB
FOR DEADLOCKS
WRITE TO FILE 'deadlock_db'
MAXFILES 1
MAXFILESIZE NONE
AUTOSTART
              注意:事件監控器名稱使用大寫字母,需要創建目錄。

#SQL監控
        SQL 監視器十分有用,因為它可以俘獲動態和靜態 SQL 語句。如果應用
程序利用了無法用 SQL 快照捕獲的預編譯 SQL 語句,那么該監視器就
很重要。

對于每條被執行的 SQL 語句記錄一個事件。每個語句的屬性(如讀取、
選擇和刪除等等操作的行數)都被記錄下來,但是不象在快照中那樣以
匯總的方式進行表示。另外還記錄執行的時間范圍以及啟動和停止次數。這允許您對一些事務以及某個應用程序的 SQL 執行對其它應用程序的 SQL 執行有何影響進行詳細分析。

還可以使用 SQL 監視器來發現拙劣的執行代碼;如果將輸出放入表中,
那么通過對個別代碼的執行次數進行搜索,可以做到這一點。由于運行
SQL 監視器的信息量以及性能開銷,所以只應在短期測試或問題確定中
使用該技術,而不應在生產環境中使用它。

CREATE EVENT MONITOR BAR
FOR STATEMENTS
WRITE TO TABLE
STMT(TABLE drewkb.stmtTab)
includes(rows_read,rows_written_stmt_text)

#捕獲事件監視器數據
        db2eva [db databaseName] [evm eventMonitorName]

       #利用EXPLAIN分析SQL
        SQL 的 Explain 通過圖形化或基于文本的方式詳細說明了 SQL 語句的每個部分是如何執行以及何時執行的。這包括以下一些基本信息:

正被訪問的表
正被使用的索引
何時連接數據
何時排序數據
Explain 還捕獲更復雜的信息,在細究 SQL 正在發生什么時,該信息非常有用:

表和索引基數
正連接的表和索引的順序
結果集的基數
在查詢的每部分正在選擇哪些字段
排序方法
SQL 每部分的時間范圍

       要理解 Explain 信息,您需要掌握的最重要概念是 timeron。timeron 是 DB2 優化器使
用的計量單位,用來計量完成查詢的時間和資源數量。timeron 綜合了時間、CPU 利用率、
I/O 和其它因素。由于這些參數值是變化的,因此執行某個查詢所需的 timeron 數量是動態
的,每次執行該查詢所需的 timeron 都不同。

#使用控制中心的EXPLAIN SQL
         觀察SQL的存取方案,分析優化參數,考慮優化的級別。
        #使用字符工具
         db2 set current explain mode [no|yes|explain]
db2exfmt
可以從命令行調用 db2expln 工具,以獲得查詢的存取方案。但是,該工具不返回優化器信息。
        db2expln -database drew_db -statement "select * from syscat.tables" -terminal

#SQL故障診斷
        索引使用,是否使用索引,使用索引的順序
        表基數和"SELECT *" 的使用
        優化級別太低。
        設置優化級別:db2 set current query optimization [0|1|2|3|5|7|9]
   ##使用運行狀況中心和內存可視化工具
       # 選定實例使用view memory usage,可以把輸出保存到文件。
   除了提供了內存可視化之外,該工具還允許您對某些參數值設置警報。警報的輸出將被寫到名為
threshold 的文件,該文件與 db2diag.log 位于同一目錄下。該目錄位于實例主目錄下。根據
您創建實例時所做選擇的不同,該位置也會不同。
# DB2運行狀況中心
         是否有充足的資源(如可用內存、表空間容器或日志存儲器)來完成任務
資源使用是否有效
任務是否在可接受的時間周期內完成,或者任務的完成是否不會大幅度降低性能
資源或數據庫對象是否不會永遠處于不可用狀態

  ##DB2查詢巡視器和控制器
       IBM 為 DB2 提供了兩種主要工具,它們允許您監控和控制數據庫上 SQL 的執行。DB2 控制器(Governor)用于控制
用戶和應用程序執行其 SQL 的優先級。DB2 查詢巡視器(Query Patroller)為決策支持系統提供了查詢和資源管理。
該工具接受通過您系統的所有查詢,并對其進行分析、優先排序和調度。
      
DB2 查詢巡視器為決策支持系統提供了查詢和資源管理。該工具可以接受流經您系統的所有查詢,并對其進行分析、
優先排序和調度。一旦完成查詢,用戶也將接到通知。在大型環境(其中完成某些查詢可能要花幾個小時,或者不
同部門可能具有不同的系統優先級或用途)中,該功能極其有用。

通過將工作重定向到合適的數據庫分區,查詢巡視器還將執行負載均衡,以確保某個數據庫分區的使用不會過于繁重
。該工具只能與 SMP 或 MMP 環境中 DB2 ESE 的多分區選項一起使用。

在經過最新修訂以后,IBM 已經對 DB2 查詢巡視器徹底進行了重新架構,從而將查詢控制功能集成進了類似 DB2 控制
中心的 DB2 查詢巡視器中心,并提供了一個易于使用的用戶界面。查詢巡視器是完全基于服務器的,不需要客戶機軟件。

#性能  監控命令
get monitor switches  返回會話監控開關的狀態
update monitor switches using <monitor> <on|off> 為<monitor>設置會話監控開關的狀態
reset monitor all 復位性能監控程序值
get snapshot for dbm
get snapshot for all on <dbname>
get snapshot for dynamic sql on <dbname>   返回動態SQL高速緩存的內容
runstats on table <tbschema>.<tbname> 收集<tbname>的統計信息
reorgchk on table all      確定是否需要重組  reorgchk on table <tbschema>.<tbname>
reorg table <tablename> 通過重組消除碎片
###DB2實用程序
    三種實用程序:EXPORT,IMPORT,LOAD
        這些實用程序支持的文件格式有:

非定界或定長 ASCII(ASC):顧名思義,這種文件類型包含定長 ASCII 數據,以便與列數據對齊。每個 ASC 文件都是一個
ASCII 字符流,這個字符流由根據行和列排序的數據值組成。數據流中的行由行定界符分隔,而通常將行定界符假定為換行符。
定界 ASCII(DEL):它是各種數據庫管理器用于數據交換的最常用文件格式。這種格式包含 ASCII 數據,它使用特殊字符定
界符分隔列值。數據流中的行由換行符充當行定界符進行分隔。
PC 版集成交換格式(PC version of the Integrated Exchange Format,PC/IXF):它是數據庫表的結構化描述。這種文件格式不僅
可以用于導入數據,還可以用于創建目標數據庫中尚不存在的表。
工作表格式(Worksheet Format,WSF):以這種格式存儲的數據可以在工作表中顯示。這種格式只能用于導出和導入。
游標:游標是用查詢聲明的。它只能用作裝入操作的輸入。

#EXPORT 實用程序使用 SQL SELECT 語句將數據從數據庫表抽取到某個文件中。對于導出的數據而言,其文件格式可以是 DEL、IXF 或 WSF。建議您在
導出中包含 MESSAGES 子句,以便在導出期間捕獲錯誤、警告和信息性消息。
EXPORT TO myfile.del OF DEL
    MESSAGES msg.out
        SELECT staff.name, staff.dept, org.location
        FROM org,staff
                WHERE org.deptnumb = staff.dept;

   在前一頁上的示例中,數據被抽取到一個 DEL 格式的文件中。缺省情況下,列值由逗號(,)分隔,而字符串由雙引號(")括起來。如果要抽取
的數據已經包含逗號和雙引號,那該怎么辦呢?如果是這樣的話,導入或裝入實用程序不可能確定:哪些符號是實際的數據,哪些是定界符。要定
制 EXPORT 的運作方式,可以使用 MODIFIED BY 子句并指定想用文件類型修飾符修改什么。EXPORT 命令的格式如下:


EXPORT TO file_name OF file_type
    MODIFIED BY file_type_modifiers
    MESSAGES message_file
    select_statement
chardelx
指定 x 為新的單字符串定界符。缺省值是雙引號(")。
coldelx
指定 x 為新的單字符列定界符。缺省值是逗號(,)。
codepage=x
指定 x 這個 ASCII 字符串為輸出數據的新代碼頁。在導出操作期間,將字符數據從應用程序代碼頁轉換成這一代碼頁。
timestampformat="x"
x 是源表中時間戳記的格式。
考慮下面這個示例:


EXPORT TO myfile.del OF DEL
  MODIFIED BY chardel! coldel@ codepage=1208 timestampformat="yyyy.mm.dd hh:mm tt"
  MESSAGES msg.out
  SELECT * FROM schedule


面的命令以 DEL 格式從 SCHEDULE 表導出數據,其間發生了下列行為:

字符串由感嘆號(!)括起來
列由 @ 號定界
字符串被轉換成代碼頁 1208
SCHEDULE 表中用戶定義的時間戳記具有 yyyy.mm.dd hh:mm tt 這種格式

  #導出大對象
  #可以在控制中心導出表,并進行調度。
  #IMPORT實用程序
   IMPORT FROM file_name OF file_type
    MESSAGES message_file
    [ INSERT | INSERT_UPDATE | REPLACE | REPLACE_CREATE | CREATE ]
    INTO target_table_name


INSERT 選項將導入的數據插入表中。目標表必須已經存在。
INSERT_UPDATE 向表中插入數據,或者用匹配的主鍵更新表中現有的行。目標表必須存在,且定義了主鍵。
REPLACE 選項刪除現有的全部數據,然后將導入的數據插入現有的目標表中。
有了 REPLACE_CREATE 選項,如果目標表存在,那么實用程序刪除現有的數據,然后插入新數據,就好像指定了 REPLACE 選項一樣。如果沒有定義目標表,那么在導入數據之前將先創建該表及其相關索引。正如您可以想到的那樣,輸入文件必須是 PC/IXF 格式的,因為這種格式含有導出表的結構化描述。如果目標表是由外鍵引用的父表,就不能使用 REPLACE_CREATE。
CREATE 選項創建目標表及其索引,然后將數據導入到新表中。它唯一支持的文件格式是 PC/IXF。您也可以指定表空間的名稱,新表將創建于其中。
示例:


IMPORT FROM emp.ixf OF IXF
COMMITCOUNT 500
    MESSAGES msg.out
    CREATE INTO employee IN datatbsp INDEX IN indtbsp
       
        如果上面的命令因為某些原因而執行失敗,那么您可以使用消息文件確定被成功導入并提交的最后一行。然后,您可以使用
RESTARTCOUNT 選項重新啟動導入。在下面的命令中,實用程序將跳過前面的 30000 條記錄才開始 IMPORT 操作。


IMPORT FROM myfile.ixf OF IXF
   COMMITCOUNT 500 RESTARTCOUNT 30000
   MESSAGES msg.out
   INSERT INTO newtable

       compound=x
使用非原子的復合 SQL 來插入數據。每次會嘗試 x 條語句。
indexschema=schema
在創建索引期間對索引使用指定的模式。
striptblanks
在向變長字段裝入數據時,截斷任何尾部空格。
lobsinfile
指出要導入 LOB 數據。實用程序將檢查 LOBS FROM 子句,以獲取輸入 LOB 文件的路徑。
這里有一個實際使用這些文件類型修飾符的示例:


IMPORT FOR inputfile.asc OF ASC
    LOBS FROM /u/db2load/lob1, /u/db2load/lob2
   MODIFIED BY compount=5 lobinsfile
    INSERT INTO newtable
使用控制中心進行import。

  ##LOAD實用程序概述
        LOAD 實用程序是另一種用數據來填充表的方法。經過格式化的頁被直接
寫入數據庫。這種機制允許進行比 IMPORT 實用程序更有效的數據移動。
不過,LOAD 實用程序不執行某些操作,如引用或表約束檢查以及觸發器調用。

  LOAD FROM input_source OF input_type
    MESSAGES message_file
    [ INSERT | REPLACE | TERMINATE | RESTART ]
    INTO target_tablename


#example,execute at partition en

date
db2 connect to sccrm user db2inst1 using db2inst1
db2 "LOAD FROM /backup1114/dw_call_cdr_20031002.txt OF DEL modified by coldel; fastparse anyorder replace into dw_call_cdr_20030801"
date

db2 "LOAD FROM /db2home/db2inst1/data/dw_newbusi_smscdr_20031026.txt OF DEL modified by coldel; terminate into dw_newbusi_smscdr_20031026_1"

LOAD 的源輸入的格式可以是 DEL、ASC、PC/IXF 或 CURSOR。游標是從 SELECT
語句返回的結果集。使用 CURSOR 作為裝入輸入的示例顯示如下:


DECLARE mycursor CURSOR FOR SELECT col1, col2, col3 FROM tab1;
LOAD FROM mycursor OF CURSOR INSERT INTO newtab;


裝入目標必須存在,該實用程序才能啟動。這個目標可以是表、類型表或表別名。不支持向系統表或臨時表進行裝入。

請使用 MESSAGES 選項來捕獲裝入期間的任何錯誤、警告和信息性消息。

LOAD 可以以四種不同方式執行:

INSERT 方式將輸入數據添加到表中,不更改現有表數據。
REPLACE 方式從表中刪除全部現有數據,然后用輸入數據填充該表。
TERMINATE 方式終止裝入操作,然后回滾到裝入操作的起始點。一個例外是:如果指定了 REPLACE 方式,那么表將會被截斷。
RESTART 方式用于重新啟動以前中斷的裝入。它將自動從上一個一致性點繼續操作。要使用該方式,請指定與前面的 LOAD 命令中相同的選項,
但卻使用 RESTART 方式。它允許該實用程序找到在裝入處理期間生成的所有必需臨時文件。因此
,除非能夠確信不需要從裝入生成的臨時文件,否則就不要以手工方式除去任何這類文件,這一點十分重要。
一旦裝入不出任何錯誤地完成,臨時文件就會被自動除去。缺省情況下,臨時文件是在當前工作目錄中創建的。
可以使用 TEMPFILES PATH 選項指定存儲臨時文件的目錄。
   #裝入過程的四個階段
       完整的裝入過程分為四個不同階段。

裝入階段:
將數據裝入表中。
收集索引鍵和表統計信息。
記錄一致性點。
將無效數據放入轉儲文件,并在消息文件中記錄消息。當數據行與表的定義不一致時,這些數據行就被認為是無效數據,
并會被拒絕(不裝入表中)。請使用 dumpfile 修飾符來指定文件的名稱和位置,以記錄任何被拒絕的行。
構建階段:
根據裝入階段所收集的鍵創建索引。
刪除階段:
刪除導致違反鍵唯一性的那些行,并將這些行放入異常表中。除了如上所述有些數據只是不滿足目標表的定義之外,還有
一些數據已經通過了裝入階段,但卻違反了表中定義的唯一性約束。注:這里只將違反鍵唯一性的行作為壞數據;目前不檢查其它約束。
由于這類數據已經裝入了表中,因此 LOAD 實用程序將在此階段刪除違規行。異常表可以用來存儲被刪除的行,使您可以決定在裝入操
作完成之后如何處理它們。如果沒有指定異常表,那么就刪除違規行,而不做任何跟蹤,下面對異常表進行了更詳細的討論。
在消息文件中記錄消息。
索引復制階段:
如果 ALLOW READ ACCESS 是用 USE TABLESPACE 選項指定的,那么就會將索引數據從系統臨時表空間復制到
索引應該駐留的表空間。
異常表是一個用戶定義的表,它必須與要裝入的目標表具有相同的列定義。如果至少有一列沒有出現在異常表中,那么就
會廢棄違規行。只可以向表末尾添加兩個額外的列:記錄行插入時間的時間戳記列,以及存儲(認為行所包含的是壞數據的)
理由(或消息)的 CLOB 列。



LOAD FROM emp.ixf OF IXF
    MODIFIED BY DUMPFILE=c:\emp.dmp
  MESSAGES msg.out
    TEMPFILES PATH d:\tmp
    INSERT INTO employee
    FOR EXCEPTION empexp

在上圖中,(1)顯示了輸入源文件的內容。
(2)中顯示的目標表 EMPLOYEE 是用以下列定義創建的:
第一列必須具有唯一性。
最后一列是不能為 NULL 的數字列。
(3)中顯示的異常表 EMPEXP 是用與 EMPLOYEE 相同的那些列以及時間戳記和消息列創建的。
在裝入階段,輸入文件的所有數據都被裝入了 EMPLOYEE — 但用粉紅色標記的兩行除外,
因為它們不滿足 NOT NULL 和 NUMERIC 列定義。由于指定了 DUMPFILE 修飾符,因此這兩行被記錄在文件 C:\emp.dmp 中。

在刪除階段,用黃色標記的兩行被從 EMPLOYEE 中刪除了,并且被插入異常表 EMPEXP 中。這是由于違反了 EMPLOYEE 表中第一
列的唯一性而引起的。

在裝入結束時,您應該檢查消息文件、轉儲文件和異常表,然后決定如何處理被拒絕的行。
如果裝入成功完成,那么就會除去在 D:\tmp 中生成的臨時文件。

  #裝入選項
      ROWCOUNT n:允許用戶指定只裝入輸入文件中的前 n 條記錄。
SAVECOUNT n:每裝入 n 條記錄之后就建立一致性點。同時會生成消息,并會將其記錄在消息文件中,以指出在保存點成功地裝入了多少輸入行。這一點在輸入文件類型為 CURSOR 時是無法做到的。
WARNINGCOUNT n:在發出 n 次警告后停止裝入。
INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]:在構建階段,構建索引。這個選項指定 LOAD實用程序是重新構建索引還是增量式地擴展索引。支持四種不同方式:
REBUILD 方式強制重新構建所有索引。
INCREMENTAL 方式只用新數據擴展索引。
AUTOSELECT 方式允許實用程序在 REBUILD 和 INCREMENTAL 之間進行選擇。
DEFERRED 方式意味著在裝入期間不創建索引。所涉及的索引都用需要的刷新進行標記。這些索引將在重新啟動數據庫或第一次訪問這類索引時重新構建。
STATISTICS [ YES | NO ]:在執行完裝入以后,以前的目標表統計信息極有可能不再有效,因為目標表中已加入了更多的數據。您可以通過指定 STATISTICS YES 來選擇收集這些統計信息。
  #文件類型修飾符。文件類型修飾符是用 MODIFIED BY 子句指定的。下面是少數幾個您可能會覺得有用的修飾符:

fastparse:減少了對裝入數據的語法檢查以增強性能。
identityignore、identitymissing 和 identityoverride:分別用來忽略、指出丟失或覆蓋標識列數據。
indexfreespace n、pagefreespace n 和 totalfreespace n:在索引和數據頁中保留指定量的空閑頁。
norowwarnings:禁止行警告。
lobsinfile:指出將裝入 LOB 文件;并檢查 LOBS FROM 選項以獲取 LOB 路徑。
 
  ##裝入期間的表訪問
    在裝入表期間,LOAD 實用程序會用互斥鎖將它鎖定。在裝入完成以前,不允許任何其它訪問。這是 ALLOW NO ACCESS 選項的缺省行為。在進行這種裝入期間,表處于 LOAD IN PROGRESS 狀態。有一個方便好用的命令可以檢查裝入操作的狀態,還返回表狀態:


LOAD QUERY TABLE table_name


您可能猜到了這一點,即有一個選項允許進行表訪問。ALLOW READ ACCESS 選項導致表在共享方式下被鎖定。閱讀器可以訪問表
中已經存在的數據,卻不能訪問新的數據。正在裝入的數據要等到裝入完成后才可獲得。此選項將裝入表同時置于 LOAD IN PROGRESS
狀態和 READ ACCESS ONLY 狀態。
正如在前一頁中所提到的那樣,在構建階段可以重新構建全部索引,也可以用新數據擴展索引。對于 ALLOW READ ACCESS 選項,
如果重新構建全部索引,那么會為該索引創建一個鏡像副本。當 LOAD 實用程序到達索引復制階段時(請參閱裝入過程的四個階段)
,目標表被置為脫機,然后將新索引復制到目標表空間。
無論指定哪個表訪問選項,裝入都需要各種鎖來進行處理。如果某一應用程序已經鎖定了目標表,那么 LOAD 實用程序就必須等到
鎖被釋放。不想等待鎖的話,您可以在 LOAD 命令中使用 LOCK WITH FORCE 選項,以強制關閉其它持有沖突鎖的應用程序。

  ##檢查暫掛表狀態
     至此,我們知道:不會將與目標表定義不一致的輸入數據裝入表中。在裝入階段,這樣的數據會遭到拒絕,并被記錄在消息文件中。
在刪除階段,LOAD 實用程序會刪除那些違反任何唯一性約束的行。如果指定了異常表,違規的行將插入該表。對于表可能定義的
其它約束(如引用完整性和檢查約束),怎么辦呢?LOAD
實用程序不檢查這些約束。表會被置于 CHECK PENDING 狀態,這種狀態迫使您先手工檢查數據完整性,然后才能訪問表。如前一頁
中所討論的那樣,可以使用 LOAD QUERY 命令查詢表狀態。系統目錄表 SYSCAT.TABLES 中的列 CONST_CHECKED 也指出表中所定義的
每個約束的狀態。

       狀態類型:Y,N,U,W,F
     要手工為一個或多個表關閉完整性檢查,請使用 SET INTEGRITY 命令。下面給出了一些示例,以演示該命令的部分選項。要立即檢查表
EMPLOYEE 和 STAFF 追加的選項的完整性,請使用以下命令:
SET INTEGRITY FOR employee, staff IMMEDIATE CHECKED INCREMENTAL
要用 IMMEDIATE UNCHECKED 選項忽略對表 EMPLOYEE 的外鍵檢查:
SET INTEGRITY FOR employee FOREIGN KEY IMMEDIATE UNCHECKED
在裝入完成以后,有時您可能想將目標表及其具有外鍵關系的派生表置于 CHECK PENDING 狀態。這樣做確保了在對完整性進行手工
檢查之前,所有這些表的可訪問性都得到了控制。裝入選項是 CHECK PENDING CASCADE IMMEDIATE,它指出:立即將外鍵約束的檢查
暫掛狀態擴展到所有派生外鍵表。缺省情況下,只會將裝入的表置于檢查暫掛狀態。這正是裝入選項
CHECK PENDING CASCADE DEFERRED 的行為。

## IMPORT VS LOAD
   IMPORT LOAD
   SLOWER ON LARGE AMOUNTS OF DATA FASTER ON LARGE LOADS-WRITES FORMATTED PAGES
   CREATION OF TABLES & INDEXES WITH IXF   TABLES AND INDEXES MUST EXIST
   WSF SUPPORTED WSF NOT SUPPORTED
   IMPORT INTO TABLES AND VIEWS LOAD TABLES ONLY
   NO SUPPORT FOR IMPORTING INTO SUPPORTED
      MATERIALIZED QUERY TABLES
   ALL ROWS LOGGED MINIMAL LOGGING SUPPORTED
   TRIGGERS WILL BE FIRED TRIGGERS NOT SUPPORTED
   TEMPORARY SPACE USED WITHIN THE DATABASE  USED OUTSIDE THE DATABASE
   CONSTRAINTS VALIDATED DURING IMPORT   ALL UNIQUE KEY IS VERIFIED DURING LOAD
   OTHER CONSTRAINTS ARE VALIDATED WITH THE
   SET INTEGRITY COMMAND
   IF INTERRUPTED,TABLE IS USABLE WITH IF INTERRUPTED,THE TABLE IS HELD IN LOAD PENDING
   DATA UP TO THE LAST COMMIT POINT STATE,EITHER RESTART OR RESTORE TABLES EFFECTED
  
   RUN RUNSTATS AFTER IMPORT FOR STATISICS  STATISTICS CAN BE GATHERED DURING LOAD
   IMPORT INTO MAINFRAM DATABASE VIA CANNOT LOAD INTO MAINFRAME DATABASE
      DB2 CONNECT
   NO BACK-UP IMAGE REQUIRED BACKUP CAN BE CREATED DURING LOAD