#声明临时表 

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