放置分区表
该实验探讨放置分区表以及使用 describe 命令说明表内的范围和放置情况的方法:
1.您将为数据放置练习创建新的表空间。
2.你将创建不同格式的分区表。
3.您将使用 db2 命令和 SQL 查看结果。
基本环境设置
使用 describe data partitions 命令以及 show detail 方法来显示表空间的分区放置。
清单 20. 创建表
db2 describe data partitions for table LINEITEM show detail
图 10. 表空间的分区放置
注意:TableSpID 列给出了包含分区的表空间的 ID 号。在本例中,TableSpID 是 ‘3’。
使用 list tablespaces 命令标识与 TableSpId 相关联的表空间。
清单 21. 说明
db2 list tablespaces
图 11. 标识表空间
注意:相应值为 ‘2’ 的 TableSpID 是 USERSPACE1 或默认的表空间。
现在将创建五个表空间来说明不同的放置选项。使用如下命令:
清单 22. 说明
db2 create tablespace dms_d1 managed by database using (file 'c:\ts1' 10000);
db2 create tablespace dms_d2 managed by database using (file 'c:\ts2' 10000);
db2 create tablespace dms_d3 managed by database using (file 'c:\ts3' 10000);
db2 create tablespace dms_d4 managed by database using (file 'c:\ts4' 10000);
db2 create tablespace dms_i1 managed by database using (file 'c:\ts5' 10000);
创建该表空间的 SQL 位于 EX2-3.sql 文件中,可使用下面的命令运行该文件:
清单 23. 查询数据脚本
db2 –vtf EX2-3.sql
创建一个新的 LINEITEM 表,具有位于 dms_d1 和 dms_d2 表空间的生成分区集。首先,使用如下命令删除现有的 LINEITEM 分区表:
清单 24. 删除表
db2 drop TABLE LINEITEM
然后,使用下面的 DDL 创建 LINEITEM 表的新版本:
清单 25. 创建表
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)) IN DMS_D1, DMS_D2 PARTITION BY RANGE(l_shipdate) (STARTING MINVALUE, STARTING '1/1/1992' ENDING '31/12/1998' EVERY 1 MONTH, ENDING MAXVALUE);
创建该表的 SQL 位于 EX2-4.sql 文件中,可使用下面的命令运行该文件:
清单 26. 运行 EX2-4
db2 –vtf EX2-4.sql
使用下面的命令说明为 LINEITEM 表创建的分区范围:
清单 27. 说明
db2 describe data partitions for table LINEITEM show detail
图 12. 说明为 LINEITEM 表创建的分区范围
图 13. 分区
注意:TableSpID 列给出了包含分区的表空间的 ID 号。在本例中,TableSpID 为 4(对应于 DMS_D1)或 5(对应于 DMS_D2)。本例中将生成的分区依次分配给指定的表空间。
分区的显式放置
创建一个具有四个数据分区的新 LINEITEM 表,每一个数据分区被显式地放在表空间中。首先使用如下命令删除现有的 LINEITEM 表:
清单 28. 删除表
db2 drop TABLE LINEITEM
然后使用下面的 DDL 创建 LINEITEM 表的新版本:
清单 29. 创建表
创建表的 SQL 位于 EX2-6.sql 文件中,可使用下面的命令运行该文件: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 IN DMS_D1, STARTING '1/1/1992' ENDING '31/12/1992' IN DMS_D2, STARTING '1/1/1993' ENDING '31/12/1993' IN DMS_D3, ENDING MAXVALUE IN DMS_D4 );
清单 30. 运行 EX2-6
db2 –vtf EX2-6.sql
使用下面的命令说明为 LINEITEM 表创建的分区范围:
清单 31. 说明
db2 describe data partitions for table LINEITEM show detail
图 14. 说明为 LINEITEM 表创建的分区范围
注意:在本例中,每一个分区被放置在一个不同的 TableSpID 中,这个 TableSpID 和创建表的 DDL 中指定的表空间是相对应的。
创建一个具有四个数据分区的 LINEITEM 表,每一个数据分区被显式地放在表空间并且索引被放在表空间 DMS_I1 中。
在这一步中,将引入命名分区的概念,而不是使用默认的生成名称。
首先,使用下面的命令删除现有的 LINEITEM 分区表:
清单 32. 删除表
db2 drop TABLE LINEITEM
然后,使用以下的 DDL 创建 LINEITEM 表的新版本:
清单 33. 创建表
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)) INDEX IN DMS_I1 PARTITION BY RANGE(l_shipdate) ( PART JAN1992 STARTING '1/1/1992' ENDING '30/6/1992' IN DMS_D1, PART JULY1992 STARTING '1/7/1992' ENDING '31/12/1992' IN DMS_D2, PART JAN 1993 STARTING '1/1/1993' ENDING '30/6/1993' IN DMS_D3, PART JULY1993 STARTING '1/7/1993' ENDING '31/12/1993' IN DMS_D4);
创建表的 SQL 位于 EX2-8.sql 文件中,可使用下面的命令运行该文件:
清单 34. 运行 EX2-8
db2 –vtf EX2-8.sql
在 LINEITEM 表中创建一个索引,并将它放置在表空间 DMS_I1 中。使用如下 SQL:
清单 35. 索引
db2 “create index I_LINEITEM on LINEITEM(L_SHIPDATE) in DMS_I1”
使用下面的 SQL 检验和该表相关联的索引的位置:
清单 36. 说明
db2 “select tabname, index_tbspace from syscat.tables where tabname = ‘LINEITEM’”
图 15. 检验索引的位置
注意:索引空间是 DMS_I1。如果没有为分区表指定表空间,那么默认情况下索引位于连接着的第一个表空间。
在 CREATE TABLE 中定义表空间是很好的实践。然而,无论您是否在创建表语句 ID 中指定索引表空间,这并不限制您将来放置索引的位置。您可以在 CREATE INDEX 语句本身显式地指定索引表空间。
同一分区表的不同索引可以放置在不同的表空间。