在前面创建的表空间 xml_tbsp4n 上创建一个包含 XML 列的表 xmltb,并按整型关系数据列 id 的 hash 值将数据分散到表空间所在的四个分区上,然后对表 xmltb 做各种 DDL 操作。从清单中可以看到,对表结构的各种修改都是支持的,如删除表中的列,修改列的数据类型,修改列是否为空的属性,而且能够增加 XML 列。这些操作在 DB2 9.5 中都不支持,会返回一个 SQL1242N 的错误。也可以看到,在 XML 列上可以正确的创建基于 XML 模式的索引。
create table xmltb(id int, name char(10), doc xml) distribute by hash(id) in xml_tbsp4n
DB20000I The SQL command completed successfully.
alter table xmltb drop column name
DB20000I The SQL command completed successfully.
alter table xmltb alter column id set data type bigint
DB20000I The SQL command completed successfully
reorg table xmltb
DB20000I The REORG command completed successfully.
alter table xmltb alter column id set not null
DB20000I The SQL command completed successfully.
alter table xmltb alter column doc set not null
DB20000I The SQL command completed successfully.
reorg table xmltb
DB20000I The REORG command completed successfully.
alter table xmltb add column info xml
DB20000I The SQL command completed successfully.
create index idx1 on xmltb(info) GENERATE KEY USING XMLPATTERN
'/customer/name' as SQL varchar(20)
DB20000I The SQL command completed successfully.
然而,与 XML 相关的 DDL 还是有一些限制,尽管在实际应用中很少会触及这些限制,当然也应该避免这些限制。从下面清单 5 中可以清楚的看到这些限制,包括:
不允许将 XML 列修改为其他数据类型,如 CLOB。
不允许删除含有两个或多个 XML 列表结构中的一个 XML 列。要删除 XML 列的话必须将表结构中所有的 XML 列一起删除。
不支持在 XML 列上定义主键、唯一性索引和唯一性约束。由于分区键 (partition key) 有全局唯一性要求,因此在 XML 列或者定义在 XML 列上的 XML 模式不能做为分区键。示例中的只含有 XML 列的表 onlyxml 是不能在 xml_tbsp4n 上创建,因为它找不到合适的分区键。DPF 环境对唯一性有特殊的要求,关于这点,有兴趣的读者可以进行进一步的探讨。
清单 5. 不支持的 DDL
alter table xmltb alter column info set data type CLOB
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0190N ALTER TABLE "YMLI.XMLTB" specified attributes for column "INFO" that
are not compatible with the existing column. SQLSTATE=42837
alter table xmltb drop column info
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL1242N An XML feature is not supported in the context where it is used.
Reason code = "7". SQLSTATE=42997
alter table xmltb drop column doc drop column info
DB20000I The SQL command completed successfully.
drop table xmltb
DB20000I The SQL command completed successfully.
create table onlyxml(doc xml) in xml_tbsp4n
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0262N Table "ONLYXML" cannot be created in the database partition group
"NODESGROUP1" because no column exists that can be used as the partitioning
key. SQLSTATE=428A2
DPF 中 XML 数据的分布和存储
如前所述,DPF 中是根据分区键的 Hash 值,将 XML 数据均匀的分布到各个分区存储的。
下面的示例先在 DPF 下含有 XML 列的表 books,定义分区键为整型关系列 bid,按 bid 的 hash 值将数据分布到各个分区。在 XML 列上建立索引 idx2,将 XML 文档中书的名字建立为 SQL varchar 类型的索引。然后插入 XML 的样本数据,最后通过一个函数 DBPARTITIONNUM 来查看 XML 数据到底分布到那个分区上。
清单 6. XML 的数据插入和分布
create table books(bid int, info xml)distribute by hash(bid) in xml_tbsp4n
DB20000I The SQL command completed successfully.
create index idx2 on books(info) GENERATE KEY USING XMLPATTERN
'/book/name' as SQL varchar(20)
DB20000I The SQL command completed successfully.
insert into books values(201, 'J2EE Programming23.5
180RichardJim')
DB20000I The SQL command completed successfully.
insert into books values(202, 'The Road45.6
120McCarthy')
DB20000I The SQL command completed successfully.
insert into books values(203, 'Chinese Cooking10.17
140Teresa')
DB20000I The SQL command completed successfully.
insert into books values(204, 'Flying30.28
190Jim')
DB20000I The SQL command completed successfully.
insert into books values(205, 'Network Programming27.5
150RichardTeresa')
DB20000I The SQL command completed successfully.
select bid, dbpartitionnum(info) partition from books
BID PARTITION
----------- -----------
205 0
201 3
202 3
203 1
204 2
5 record(s) selected.
可以看到,各行的数据是根据 bid 的 hash 值比较均匀的分布到各个分区。值得一提的是,在 XML 列上的索引也分布在各个数据库分区上,对那个分区的 XML 数据建立索引。
先介绍一下为支持 DPF 环境下 XML 处理而引入的新概念全局序列 (Global sequence) 和引用模型(reference model)。全局序列是指包含 XML 节点引用的序列,而这些被引用的 XML 节点可能分布在其他分区上。引用模型是指,只有原子值、节点引用和序列可以通过表队列(Table Queue, TQ) 来传输,而如果要获得节点引用的 XML 数据,则需调用 RPC 来解引用。
添加新评论0 条评论