januschow826
作者januschow826·2014-09-25 12:28
数据库管理员·CP

DB2表

字数 11892阅读 961评论 0赞 0
1.NOT LOGGED INITIALLY 表
   当用create table语句NOT LOGGED INITIALLY字句创建表时,INSERT, UPDATE, DELETE, CREATE INDEX,ALTER TABLE, or DROP INDEX 不会记录日志。直到commit。commit之后的所有操作都会记录日志。
CREATE TABLE products (productID INT,product_Name VARCHAR(30))NOT LOGGED INITIALLY;
当创建NOT LOGGED INITIALLY的表后,临时关闭记录日志,可以用ACTIVATE NOT LOGGED INITIALLY字句。但此语句只针对创建时定义为NOT LOGGED INITIALLY的表。
ALTER TABLE products ACTIVATE NOT LOGGED INITIALLY
还可以在ACTIVATE NOT LOGGED INITIALLY后加with empty table来快速清空表中数据
ALTER TABLE products ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE

2.partitioned tables----分区表
   分区表可以横跨多个表空间(所有分区表的表空间类型必须相同),而且查询可以被自动指向数据所在的分区。无需查找其他分区。有2种格式创建分区表:
CREATE TABLE t1(c1 INT)
              IN tbsp1, tbsp2, tbsp3, tbsp4
              PARTITION BY RANGE(c1)
                      (STARTING FROM (1) ENDING (200) EVERY (50))

CREATE TABLE t1(c1 INT)
              PARTITION BY RANGE(t1)
                      (STARTING FROM (1) ENDING(50) tbsp1,
                                                         ENDING(100) IN tbsp2,
                                                         ENDING(150) IN tbsp3,
                                                         ENDING(200) IN tbsp4)
可以显式指定分区的起始值和最大值,也可以指定MINVALUES和MAXVALUES。另外默认地,分区是包含边界的,可以指定EXCLUSIVE选项来区分边界:
CREATE TABLE sales4(sdate DATE, customer INT)
              IN tbsp1, tbsp2, tbsp3, tbsp4
              PARTITION BY RANGE(sdate)
                     (STARTING MINVALUE  ENDING '3/31/2006' EXCLUSIVE,
                      STARTING '3/31/2006' ENDING '6/30/2006' EXCLUSIVE,
                      STARTING '6/30/2006' ENDING '9/30/2006' EXCLUSIVE,
                      STARTING '9/30/2006' ENDING '12/31/2006')
Attach partition:
当向表中添加数据时,可以先创建一个单独的表,将数据load到表中,然后将这个表attach到分区表中。
CREATE TABLE sales1Q07(sdate DATE, customer INT) in tbsp5
load from sales.del of del replace into sales1Q07

db2 "ALTER TABLE sales4 ATTACH PARTITION
               STARTING ('1/1/2007')
               ENDING ('3/31/2007') FROM sales1Q07"
SQL3601W  The statement caused one or more tables to automatically be placed in the Set Integrity Pending state.  SQLSTATE=01586
db2 set integrity for sales4 off
db2 set integrity for sales4 immediate checked
Detach partition:
可以用detach 命令删除旧的表分区。可以通过命令DESCRIBE DATA PARTITIONS列出表分区的详细信息。
db2 DESCRIBE DATA PARTITIONS for table sales4 SHOW DETAIL
PartitionId Inclusive (y/n)                   Inclusive (y/n)
              Low Value                         High Value
----------- - ------------------------------- - -------------------------------
          0 Y MINVALUE                        N '2006-03-31-00.00.00'         
          1 Y '2006-03-31-00.00.00'           N '2006-06-30-00.00.00'         
          2 Y '2006-06-30-00.00.00'           N '2006-09-30-00.00.00'         
          3 Y '2006-09-30-00.00.00'           Y '2006-12-31-00.00.00'         
          4 Y '2007-01-01-00.00.00'           Y '2007-03-31-00.00.00'         
  5 record(s) selected.
PartitionId PartitionName                   TableSpId   PartObjId   IndexTblSpId LongTblSpId AccessMode
                                                                                               Status
----------- ------------------------------- ----------- ----------- ------------ ----------- - ------
          0 PART0                                     3           4            3           3 N                                
          1 PART1                                     6           5            6           6 N                                
          2 PART2                                     5           6            5           5 N                                
          3 PART3                                     9           4            9           9 N                                
          4 PART4                                    10          4          10          10N A                              
  5 record(s) selected.
必须指定表分区名字来detach。表分区名字也可以在创建表分区时指定。
db2 "alter table sales4 detach partition PART4 into PART4"
DB20000I  The SQL command completed successfully.
detach表分区后,表处于check-pending状态。必须执行db2 set integrity for sales4 immediate checked后,才可以正常访问改表。

3.Row Compression
DB2V9可以选择性压缩表中数据。它有以下优点:
1.数据和相应的LOG压缩存放在磁盘上,减少磁盘存储
2.更少的数据通过I/O读写,减少I/O带宽消耗
3.数据在缓冲池中被压缩,提高内存效率。
当然需要一些代价,因为数据在缓冲池中被压缩,需要数据在返回给用户之前被解压。行压缩利用压缩字典。压缩字典通过扫描数据生成。如果表新增数据或者更新数据,会检查压缩字典,以此判断是否压缩此行数据。行压缩过程:
1.启用行压缩
CREATE TABLE ... COMPRESS YES
ALTER TABLE ... COMPRESS YES
2.创建压缩字典
a.REORG table tabname RESETDICTIONARY / KEEPDICTIONARY(重建压缩字典或保留压缩字典)


b.INSPECT
c.Automatic Dictionary Creation (ADC)。DB2 9.5,压缩字典会自动创建
当对表进行insert,import,load insert操作时,大量数据被插入超过预定阀值时(默认1M),压缩字典会自动创建,这就是ADC。
3.验证压缩特性
捕获快照 db2 get snapshot for tables on sample |grep -i compress
查询系统表 SYSIBM.SYSTABLES
db2 "select NAME,COMPRESSION from sysibm.systables where COMPRESSION='R'"
利用函数:ADMIN_GET_TAB_COMPRESS_INFO
ADMIN_GET_TAB_COMPRESS_INFO—(--tabschema--,--tabname--,--exemode--)

4.Table Compression
可以在创建表的时候用value compression字句来启用表压缩。也可以在指定列加COMPRESS SYSTEM DEFAULT字句启用压缩。可变长度字符串的列,且数据类型为date,time,timestamp的列不能被压缩。包含默认值为0或者是null的列可以被压缩节省空间。
ALTER TABLE city ACTIVATE VALUE COMPRESSION
ALTER TABLE city ALTER COLUMN population COMPRESS SYSTEM DEFAULT

5.Materialized Query Tables and Summary Tables
CREATE SUMMARY TABLE my_summary
             AS (SELECT city_name, population FROM country A, city B
                  WHERE A.country_id = B.country_no)
            DATA INITIALLY DEFERRED
            REFRESH DEFERRED
summary关键字可选。data initially deferred字句指示DB2创建MQT后,并不将数据插入到表中。执行REFRESH TABLE my_summary才会将数据插入到MQT中。refresh deferred字句指示只有在显式执行refresh table 语句时,MQT才会刷新。也可以指定refresh immediate在基表变化时MQT立刻刷新。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广