技术开发 频道

改进大型数据库的管理:创建分区表

【IT168 技术文档】创建分区表

    这个实验将探讨创建分区表、将数据载入分区表以及使用 describe 命令来说明表范围的方法:

1.您将登录并为所有的练习设置基本环境。
2.您将创建不同格式的分区表并加载数据。
3.您将使用 DB2 命令和 SQL 查看结果。
4.将对 DB2 9 表范围分区进行概述。

登录和基本指令



图 1. 基本设置 

    登录到您的机器,如图 1 所示,使用 db2inst1。打开终端窗口(Linux)或 DB2 命令窗口(windows)。切换到 scripts 子目录。

    清单 1. 切换目录

cd /scripts or
cd c:\scripts 

    使用 db2start 命令启动 DB2,并连接到 SAMPLE 数据库。 

    清单 2. StartDB2

db2start

db2 connect to SAMPLE

创建基本分区表 

    这一节将介绍分区表的基本创建和加载。您将创建不同格式的表、验证创建结果、加载数据并对表进行查询。 

    使用如下的数据定义语言(DDL)创建具有四个范围的 LINEITEM 表: 


    清单 3. 创建表 

CREATE TABLE LINEITEM ( l_orderkey DECIMAL(10,0) NOT NULL, l_partkey INTEGER, l_suppkey INTEGER, l_linenumber INTEGER, l_quantity DECIMAL(12,2), l_extendedprice DECIMAL(12,2), l_discount DECIMAL(12,2), l_tax DECIMAL(12,2), l_returnflag CHAR(1), l_linestatus CHAR(1), l_shipdate DATE, l_commitdate DATE, l_receiptdate DATE, l_shipinstruct CHAR(25), l_shipmode CHAR(10), l_comment VARCHAR(44)) PARTITION BY RANGE(l_shipdate) ( STARTING '1/1/1992' ENDING '30/06/1992', STARTING '1/7/1992' ENDING '31/12/1992', STARTING '1/1/1993' ENDING '30/6/1993', STARTING '1/7/1993' ENDING '31/12/1993')

    创建该表的 SQL 语句位于 EX1-6.sql 文件中,可使用如下命令运行该文件: 

    清单 4. 运行 EX1-6

db2 –vtf EX1-6.sql 


    使用下面的命令说明为 LINEITEM 表创建的分区的范围: 

    清单 5. 说明

db2 describe data partitions for table LINEITEM



图 2. 说明为 LINEITEM 表创建的分区范围 

    注意:创建了四个数据分区。其中的范围包括边界值。 

    将数据导入到 LINEITEM 表。该操作的导入命令位于 EX1-8.sql 文件中,可使用如下命令运行: 

    清单 6. 带有拒绝的加载

db2 –vtf EX1-8.sql



图 3. 将数据导入到 LINEITEM 表 

    注意:导入时拒绝了 729 行数据,这是因为它们不具有位于当前 LINEITEM 表的数据分区定义范围内的 l_shipdate。标量函数可用于显示行所属的数据分区号(datapartitionnum)。执行以下示例 SQL 查看标量函数的输出: 


    清单 7. 查询 - 匹配日期的分区

db2 “select datapartitionnum(l_shipdate) as PartitionId, l_shipdate from lineitem
where l_shipdate between ’01/06/1992’ and ‘31/07/1992’
order by l_shipdate”




图 4. 标量函数的输出 

    注意:标量函数(datapartitionnum)返回的值和 describe 命令返回的是同一个 PartitionId。该语句的子句间使用的谓词范围超出了 PartitionId 0 和 PartitionId 1 的边界

具有全部范围的分区表 

    创建具有两个额外数据分区的新 LINEITEM 表,其中一个分区用来捕获低于当前范围的值,另一个分区用来捕获高于当前范围的值。首先使用下面的命令删除现有的 LINEITEM 分区表: 

    清单 8. 删除表

db2 drop TABLE LINEITEM 

    然后使用如下 DDL 创建 LINEITEM 表的新版本:

清单 9. 创建表 

CREATE TABLE LINEITEM ( l_orderkey DECIMAL(10,0) NOT NULL, l_partkey INTEGER, l_suppkey INTEGER, l_linenumber INTEGER, l_quantity DECIMAL(12,2), l_extendedprice DECIMAL(12,2), l_discount DECIMAL(12,2), l_tax DECIMAL(12,2), l_returnflag CHAR(1), l_linestatus CHAR(1), l_shipdate DATE, l_commitdate DATE, l_receiptdate DATE, l_shipinstruct CHAR(25), l_shipmode CHAR(10), l_comment VARCHAR(44)) PARTITION BY RANGE(l_shipdate) ( STARTING MINVALUE, STARTING '1/1/1992' ENDING '30/06/1992', STARTING '1/7/1992' ENDING '31/12/1992', STARTING '1/1/1993' ENDING '30/6/1993', STARTING '1/7/1993' ENDING '31/12/1993', ENDING MAXVALUE)

    创建该表的 SQL 位于 EX1-10.sql 文件中,可使用下列命令运行: 

    清单 10. 运行 EX1-10

db2 –vtf EX1-10.sql 

    使用下面的命令说明为 LINEITEM 表创建的分区范围。 

    清单 11. 说明

db2 describe data partitions for table LINEITEM



图 5. 说明为 LINEITEM 表创建的分区范围 

    注意:新的 MINVALUE 范围具有一个最高值,该值和下一个数据分区开始部分的值相等,但它并不包含该值。MAXVALUE 范围具有一个最低值,该值和前一个范围结束部分的值相等,但它不包含该值。这将创建一个无间隙的连续范围。 

    将数据导入到 LINEITEM 表中。该操作的导入命令位于 EX1-8.sql 文件中,可使用下面的命令运行该文件: 

    清单 12. 全面加载

db2 –vtf EX1-8.sql



图 6. 将数据导入到 LINEITEM 表中 

    具有生成范围的分区表 

    创建一个新 LINEITEM 表,它具有从 1992 年 1 月 1 日到 1998 年 12 月 31 日按月划分的数据分区生成范围。同样,添加 minvalue 和 maxvalue 范围来存放具有超过此范围的 l_shipdate 的值的行。首先使用以下命令删除现有的 LINEITEM 分区表: 

    清单 13. 删除表

db2 drop TABLE LINEITEM 

    然后使用如下 DDL 创建 LINEITEM 表的新版本: 

    清单 14. 创建表 

CREATE TABLE lineitem (l_orderkey DECIMAL(10,0) NOT NULL, l_cpartkey INTEGER, l_suppkey INTEGER, l_linenumber INTEGER, l_quantity DECIMAL(12,2), l_extendedprice DECIMAL(12,2), l_discount DECIMAL(12,2), l_tax DECIMAL(12,2), l_returnflag CHAR(1), l_linestatus CHAR(1), l_shipdate DATE, l_commitdate DATE, l_receiptdate DATE, l_shipinstruct CHAR(25), l_shipmode CHAR(10), l_comment VARCHAR(44)) PARTITION BY RANGE(l_shipdate) (STARTING MINVALUE, STARTING '1/1/1992' ENDING '31/12/1998' EVERY 1 MONTH, ENDING MAXVALUE);

    创建该表的 SQL 位于 EX1-13.sql 文件中,可使用下面的命令运行该文件: 

    清单 15. 运行 EX1-13

db2 –vtf EX1-13.sql 

    使用如下命令来说明为 LINEITEM 表创建的分区范围: 

    清单 16. 说明

db2 describe data partitions for table LINEITEM



图 7. 说明为 LINEITEM 表创建的分区范围 

    注意:创建了 86 个数据分区,但是没有包括这些范围的最高值,因为这些最高值将和之后的数据分区的最低值重叠。将数据导入到 LINEITEM 表。此操作的导入命令位于 EX1-8.sql 文件中,可使用下面的命令运行该文件: 

    清单 17. 加载并生成

db2 –vtf EX1-8.sql



图 8. 将数据导入到 LINEITEM 表 

    使用下面的 SQL 来验证 LINEITEM 表每一个数据分区的行数: 

    清单 18. 查询数据

db2 “select year(l_shipdate) as year, month(l_shipdate) as month,
count(*) as count from lineitem
group by year(l_shipdate), month(l_shipdate)
order by 1, 2” 

    使用以下的 SQL 语句验证 LINEITEM 表的每一个数据分区的行数: 

    清单 19. 查询数据脚本

db2 –vtf EX1-16.sql


图 9. 检验行数 

    注意:执行加载操作后,86 个范围中有 82 个范围包含一个或多个行。

0
相关文章