DECLARE @date_Bing DATETIME SELECT @date_Bing = GETDATE()
SELECT CONVERT(nvarchar(20), GETDATE(), 101) AS Today, MONTH(GETDATE()) AS CurrentMonth, MONTH(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date_Bing)),@date_Bing),101)) AS PreviousMonth, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date_Bing)+DAY(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date_Bing)),@date_Bing),101))-1),@date_Bing),101) as FirstDayOfPreviousMonth, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date_Bing)),@date_Bing),101) as LastDayOfPreviousMonth, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date_Bing)-1),@date_Bing),101) AS FirstDayOfCurrentMonth, CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@date_Bing))),DATEADD(mm,1,@date_Bing)),101) as LastDayOfCurrentMonth GO
最近,需要在DB2的分区表中增加新的分区,用于存储数据,因此,就研究了DB2表的分区机制。现在总结,实现的方式共有三种,分别是:
1)、创建临时表,将原表数据导入临时表,之后将原表重建,扩大分区;
2)、通过ALTER TABLE TAB_NAME ADD PARTITION,为表增加分区;
3)、创建临时分区表,向临时分区表中导入数据,之后将临时分区表设置为主表的一个分区。
下面将分别说明三种方式的具体实现:
前提:原分区表PART_MAIN,建表SQL为:
CREATE TABLE PART_MAIN( P_ID VARCHAR(10), P_DATE DATE ) PARTITION BY RANGE(P_DATE) ( PARTITION OTHERS STARTING MINVALUE ENDING '2012-03-31', PARTITION P201204 STARTING '2012-04-01' ENDING '2012-04-30', PARTITION P201205 STARTING '2012-05-01' ENDING '2012-05-31', PARTITION P201206 STARTING '2012-06-01' ENDING '2012-06-30' ) ;需要为PART_MAIN表,增加2012-12-01--2012-12-31的数据分区。
方法一:
a、创建临时表
CREATE TABLE TMP_PART_MAIN LIKE PART_MAIN;b、将数据导入临时表中
INSERT INTO TMP_PART_MAIN SELECT * FROM PART_MAIN;c、重建原表
DROP TABLE PART_MAIN;
CREATE TABLE PART_MAIN( P_ID VARCHAR(10), P_DATE DATE ) PARTITION BY RANGE(P_DATE) ( PARTITION OTHERS STARTING MINVALUE ENDING '2012-03-31', PARTITION P201204 STARTING '2012-04-01' ENDING '2012-04-30', PARTITION P201205 STARTING '2012-05-01' ENDING '2012-05-31', PARTITION P201206 STARTING '2012-06-01' ENDING '2012-06-30', PARTITION P201212 STARTING '2012-12-01' ENDING '2012-12-31' ) ;d、将数据从临时表导入原表中
INSERT INTO PART_MAIN SELECT * FROM TMP_PART_MAIN;注:该方法是最简单的一种实现方式,不需要掌握DB2分区知识,就可以实现,对于老鸟来说,这种方式是不屑使用的。下面的方法将是技术提升阶段。
方法二:
a、为表增加分区
ALTER TABLE PART_MAIN ADD PARTITION P201212 STARTING '2012-12-01' ENDING '2012-12-31' ;b、增加分区OK,插入数据即可
注:该方法是最直接的,只要记住ALTER TABLE TAB_NAME ADD PARTITION命令就OK。
方法三:
a、创建临时分区表
CREATE TABLE PART_OTHER ( P_ID VARCHAR(10), P_DATE DATE ) PARTITION BY RANGE(P_DATE) ( PARTITION P201212 STARTING '2012-12-01' ENDING '2012-12-31' ) ;b、往临时表中增加数据(此步可以省略,在最后一步执行)
c、将临时分区表设为原表的一个分区
ALTER TABLE PART_MAIN ATTACH PARTITION P201212 STARTING '2012-12-01' ENDING '2012-12-31' FROM PART_OTHER ;注:此命令执行后,临时分区表PART_OTHER,将不以表的方式存在,而是作为PART_MAIN表的一个分区。
d、为原表新增加的分区,设置访问权限
SET INTEGRITY FOR PART_MAIN ALLOW WRITE ACCESS IMMEDIATE CHECKED ;OK,分区增加完成,可以往新分区中增加数据了。
注:该方法实现起来过于繁琐,建议了解就好。
如果想继续了解DB2的分区功能,可参考另一篇文章:http://blog.csdn.net/huaxin520/article/details/7853232。
为即将创建的表建立表空间,先建立一个缓冲池,名字:BUFPOL01
CREATEBUFFERPOOL BUFPOL01 IMMEDIATE –立即创建此缓冲池
SIZE250 --大小为250(个4K)
AUTOMATIC --自动管理
PAGESIZE4 K ; --页大小为4K
缓冲池是内存中的一段空间,用于存放数据库管理器从磁盘上读取的数据或修改即将写入磁盘的数据,一个临时的用于存放表或者索引缓存的内存段。
缓冲池能够提高数据库的性能,较少磁盘IO;如果应用程序需要的数据存放于内存中,而不是去读取磁盘,那么性能其性能将会得到很大的改观;
当然,缓冲池也会将最近很少使用的数据写回磁盘,腾出更多的空间。
在DB2 V9.7 for LUW中,创建一个库的时候,默认会创建一个IBMDEFAULTBP的缓冲池,大小为250个4KB。
查看数据库版本的方法:
1. 连接数据库的时候,显示:
db2 =>connect to sample
数据库连接信息
数据库服务器 = DB2/NT 9.7.5
SQL 授权标识 = ADMINIST...
本地数据库别名 = SAMPLE
2. 命令查看
db2 =>select * from sysibm.sysversions
VERSIONNUMBER VERSION_TIMESTAMP AUTHID VERSIONBUILDLEVEL
-------------------------- ------------------------------- --------------------- ------------------------------
9070500 2013-03-17-21.18.32.187000 SYSTEM special_27924
修改一下缓冲池的大小,改为2M,还是自动存储:ALTERBUFFERPOOL BUFPOL01 IMMEDIATE SIZE 500 AUTOMATIC;
创建表空间TBSPC01:
CREATE REGULAR TABLESPACE TBSPC01 –-常规表空间,名称为TBSPC01
PAGESIZE 4 K --页大小为4K
MANAGED BY AUTOMATIC STORAGE --自动存储管理
EXTENTSIZE 8 --扩展数据块为8(个4K)
OVERHEAD 10.5 --开销
PREFETCHSIZE 8 --预取大小为8(个4K)
TRANSFERRATE 0.14
BUFFERPOOL BUFPOL01 --指定缓冲池
DROPPED TABLE RECOVERY ON; --打开的话,可以恢复已经删除的表,常规表空间可以使用
COMMENT ON TABLESPACE TBSPC01 IS '表空间01'; -- 注释
表空间是一个逻辑的概念,逻辑上表是存放在表空间中,实质上,表是存放在物理磁盘上;一个表空间可以存放多个表,但是一个表只能位于一个表空间中。在安装创建SAMPLE数据库实例的时候,默认创建了4个表空间:
IBMDB2SAMPLEREL:常规表空间,
IBMDB2SAMPLEXML:用于存放XML数据类型的表空间
SYSCATSPACE:系统编目表空间,也就是数据字典存放的表空间
SYSTOOLSPACE:
接下来就创建表了:CREATE TABLE ADMINISTRATOR.TEST1 (
CID CHARACTER (10) NOT NULL ,
CNAME VARCHAR (20) WITH DEFAULT 'unknow' ,
SEX CHARACTER (1) NOT NULL WITH DEFAULT 'M' ,
AGE INTEGER ,
CONSTRAINT IDX_TEST_CID PRIMARY KEY ( CID),
CONSTRAINT CHK_SEX CHECK (check sex in ('F','M'))
ENFORCED --强制执行此约束
ENABLE QUERY OPTIMIZATION --查询优化期间考虑此约束
) IN TBSPC01 ;
COMMENT ON TABLE ADMINISTRATOR.TEST1 IS '测试表1';
COMMENT ON ADMINISTRATOR.TEST1 ( SEX IS '性别', CNAME IS'客户姓名', CID IS '客户ID', AGE IS '年龄' ) ;
COMMENTON CONSTRAINT ADMINISTRATOR.TEST1.CHK_SEX IS '性别只能为F或者M';查看创建的表结构及其他信息:
db2 => describe table test1
数据类型 列
列名 模式 数据类型名称 长 小数位 NULL
------------------------------- ------------- ------------------- ---------- ----- ------
CID SYSIBM CHARACTER 10 0 否
CNAME SYSIBM VARCHAR 20 0 是
SEX SYSIBM CHARACTER 1 0 否
AGE SYSIBM INTEGER 4 0 是
4 条记录已选择。
向表中添加数据:
1. 添加一行
db2 =>insert into test1(cid , cname , sex , age) values ('12082119','chenlb','M',24)
DB20000I SQL 命令成功完成。
db2 =>select * from test1
CID CNAME SEX AGE
------------------------------ --- -----------
12082119 chenlb M 24
1 条记录已选择。
2. 添加多行:在insert into tablename values之后指定多个值。
db2=> insert into test1(cid , cname , sex , age) values('12082111','albert','M',15),('12082011','ellen','F',10)
DB20000I SQL 命令成功完成。
db2 => select * from test1
CID CNAME SEX AGE
---------- -------------------- --------------
12082011 ellen F 10
12082111 albert M 15
12082119 chenlb &