级别: 初级 郝庆运 (haoqingy@cn.ibm.com), 软件工程师, IBM
2009 年 9 月 14 日 DB2 V9.7 中对 pureXML 特性有很多增强,在本文中将介绍其中一个重要的改进 - 支持 XML 数据的分区表,包括如何创建支持 XML 数据的分区表,XML 数据如何存放,以及查询 XML 数据的性能提高。
在 DB2 V9.7 中对 XML 数据有了更多的支持,包括支持 XML 数据的分区表,MDC 表,自定义临时表,自定义函数以及支持 XML 数据的分区数据库环境(DPF)。在本文中将详细介绍支持 XML 数据的分区表,如何创建和管理支持 XML 数据的分区表,数据对象和索引对象的存储方式和管理,便捷的 XML 数据转入和转出,以及在对 XML 数据进行查询时性能上的提高。通过阅读本文读者可以较为深入的理解这一新特性,并能够在实际应用中使用。
开始之前
在开始讨论之前如果有需要可以复习一下 DB2 的表分区特性,这一特性是在 DB2 V9 引入的,developerworks 上的这篇文章《 DB2 9 表分区 - 改进大型数据库的管理》是一个很好的参考。
表分区是一种数据组织模式,在这种模式中,数据将以一个或多个表列的值为依据,分割到多个称为数据分区(或范围)的存储对象中。每一个数据分区被分别存储。这些存储对象可以位于不同的表空间中,可以位于相同的表空间中,也可能是这两种情况的组合。
在 DB2 V9.7 中,索引也可以是分区的,这一特性称之为分区索引(partitioned index)。分区索引由多个索引分区(index partition)组成,每个索引分区中的键值指向相应的唯一一个数据分区(data partition)的数据,系统创建的索引或者用户的创建的索引都可以是分区索引。可以参考《 DB2 9.7 分区索引 – 改进大型数据库性能》了解分区索引特性。
关于分区表特性和分区索引特性,在本文中不再详细介绍,如有需要请读者参考上面两篇文章以及 DB2 information center 上相关内容。
支持 XML 数据的分区表简介
在 DB2 V9.7 中可以将分区表与 pureXML 功能配合使用:
- 可使用 CREATE TABLE 语句创建带有一个或多个 XML 列的分区表。
- 可使用带有 ADD COLUMN 子句的 ALTER TABLE 语句将 XML 列添加至现有分区表。
- 可使用带有 ADD PARTITION、ATTACH PARTITION 和 DETACH PARTITION 子句的 ALTER TABLE 语句修改包含 XML 数据的分区表。
- 可将每个数据分区及其关联 XML 存储对象(XDA)放到相同或不同表空间中。
- 可将每个基于 XML 数据的未分区索引放到不同表空间中,并单独重组每个索引。
- 通过有效存储器规划,可通过执行表空间备份来逐个备份所有分区数据或未分区索引。
需要注意的是,
- 不能将 XML 类型的列用作表分区键列。
- 用户创建的 XML 索引只能是非分区索引。
通过二者的配合,pureXML 组件能够受益于表分区功能提供的简易数据转入和转出,基于 XML 数据的查询也能够受益于分区消除带来的性能优势。
接下来我们通过实际操作来详细认识这一特性。
准备工作
在开始之前,我们先创建一个新的数据库名字叫做 MYDB,如清单 1 所示。当然用已经存在的数据库也可以,但是由于文中有较多的与环境相关的输出结果如表空间 ID,为了便于理解和实践,建议使用一个全新的数据库。
本文中所有操作都是在 LinuxAMD64 平台上的 DB2 V9.7 版本进行,V9.7 版本之前的版本不支持含有 XML 列的分区表。
清单 1. 创建数据库
创建数据库之后我们创建若干个表空间,请查看每个表空间对应的 ID,如清单 2 所示。
清单 2. 创建表空间
CREATE TABLESPACE TbspXT MANAGED BY DATABASE using (FILE 'tspXT' 4 M) AUTORESIZE YES;
CREATE TABLESPACE TbspXD MANAGED BY DATABASE using (FILE 'tspXD' 4 M) AUTORESIZE YES;
CREATE TABLESPACE TbspXW MANAGED BY DATABASE using (FILE 'tspXW' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXX MANAGED BY DATABASE using (FILE 'ixtspXX' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXY MANAGED BY DATABASE using (FILE 'ixtspXY' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXW MANAGED BY DATABASE using (FILE 'ixtspXW' 4 M) AUTORESIZE YES;
select substr(TBSPACE,1,15)TBSPACE ,TBSPACEID from SYSCAT.TABLESPACES
where TBSPACE like '%TBSPX%' order by TBSPACEID"
TBSPACE TBSPACEID
--------------- -----------
TBSPXT 3
TBSPXD 4
TBSPXW 5
IXTBSPXX 6
IXTBSPXY 7
IXTBSPXW 8
6 record(s) selected. |
创建带有 XML 列的分区表
创建一个带有 XML 列的分区表的语法与创建一个普通的分区表的语法是相同的,唯一的区别是增加了一个或者多个 XML 列,我们也可以在一个已有的分区表上使用 ALTER TABLE 语句中的 ADD COLUMN 子句来增加一个或者多个 XML 列。
另外,V9.7 中的分区索引特性为 CREATE TABLE 语法引入的分区级的 INDEX IN 子句也完全适用于带有 XML 列的分区表。由于只允许创建基于 XML 列的非分区索引,而不允许创建基于 XML 列的分区索引,所以分区级的 INDEX IN 子句只用来控制用户创建的非 XML 列上的分区索引(以及 XML REGION INDEX)。
使用如清单 3 所示的语句创建一个带有 XML 列的分区表 XMLPARTT,其中 DOC 列为 XML 类型。该表以 C1 列为分区键,包括 5 个分区,通过分区级的 IN 子句和 INDEX IN 字句将每个分区的数据对象和索引对象放置到不同(或者相同)的表空间中,如果某个分区没有分区级的 IN 子句或 INDEX IN 字句,则将使用表级的 IN 子句或 INDEX IN 字句中指定的表空间。
每个数据分区关联的 XML 存储对象(XDA)放置在与数据分区相同的表空间中。
清单 3. 创建有 XML 列的分区表
CREATE TABLE XMLPARTT( c1 int, doc xml) IN TbspXT INDEX IN IXTbspXX
partition by (c1)
( STARTING 0 ENDING 10 IN TbspXD,
STARTING 11 ENDING 20 INDEX IN IXTbspXY,
STARTING 21 ENDING 30 IN TBSPXW INDEX IN IXTbspXW,
STARTING 31 ENDING 40 INDEX IN IXTbspXW,
STARTING 41 ENDING 50); |
使用清单 4 的语句向表 XMLPARTT 中插入若干条数据。
清单 4. 向带有 XML 列的分区表插入数据
insert into xmlpartt
values ( 1,'<salemen><name>hoho</name><role>intern</role></salemen>');
insert into xmlpartt
values ( 2,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 13,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 41,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 15,'<salemen><name>wawa</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 26,'<salemen><name>wawa</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 7,'<salemen><name>wawa</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 32,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 45,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 9,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 42,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 28,'<salemen><name>hihi</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 17,'<salemen><name>hihi</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 27,'<salemen><name>hihi</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 37,'<salemen><name>hihi</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 8,'<salemen><name>hihi</name><role>regular</role></salemen>');
insert into xmlpartt
values ( 36,'<salemen><name>wawa</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 43,'<salemen><name>hihi</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 19,'<salemen><name>hihi</name><role>mgr</role></salemen>');
insert into xmlpartt
values ( 21,'<salemen><name>wawa</name><role>mgr</role></salemen>'); |

 |

|
在带有 XML 列的分区表上创建基于 XML 的索引
DB2 V9.7 中可以创建分区索引,但是对于基于 XML 的索引,只能是非分区的。我们可以将每个基于 XML 数据的未分区索引放到不同表空间中。
使用清单 5 中的语句创建两个基于 XML 数据的未分区索引 IDXXML1 和 IDXXML2,其中创建 IDXXML1 时使用了IN IXTbspXW字句,则 IDXXML1 索引对象将放置在 IXTBSPXW 表空间;创建 IDXXML2 时没有使用 IN 子句,则 IDXXML2 将被放置在 IXTBSPXX 表空间,这是由创建表时的 INDEX IN 字句决定的,在后面的章节我们将对此进行验证。
清单 5. 在带有 XML 列的分区表上创建基于 XML 的索引
create index idxxml1 on xmlpartt(doc) generate key
using xmlpattern '//name' as sql varchar(50) IN IXTbspXW
DB20000I The SQL command completed successfully.
create index idxxml2 on xmlpartt(doc) generate key
using xmlpattern '//role' as sql varchar(50)
DB20000I The SQL command completed successfully. |
受益于分区表的特性,我们可以对单个的基于 XML 的索引进行重组(REORG),命令和结果如清单 6 所示。
清单 6. 对分区表上单个 XML 的索引进行重组
$ db2 reorg index idxxml1
DB20000I The REORG command completed successfully.
$ db2 reorg index idxxml2
DB20000I The REORG command completed successfully. |
带有 XML 列的分区表上相关的数据库对象
首先来看两个目录视图 SYSCAT.TABLES 和 SYSCAT.INDEXES 中的相关记录,使用的查询语句和结果如清单 7 所示。
清单 7. SYSCAT.TABLES 和 SYSCAT.INDEXES 中的相关记录
select substr(TABNAME,1,10) TABNAME, TABLEID, TBSPACEID from SYSCAT.TABLES
where TABNAME='XMLPARTT'
TABNAME TABLEID TBSPACEID
---------- ------- ---------
XMLPARTT -32768 -6
1 record(s) selected.
select substr(TABNAME, 1,10)TABNAME,SUBSTR(INDNAME, 1, 20) INDNAME, INDEXTYPE,
TBSPACEID, INDEX_OBJECTID from SYSCAT.INDEXES where TABNAME='XMLPARTT'
TABNAME INDNAME INDEXTYPE TBSPACEID INDEX_OBJECTID
---------- -------------------- --------- ----------- --------------
XMLPARTT SQL090818102910280 XRGN 65530 32768
XMLPARTT SQL090818102918460 XPTH 6 4
XMLPARTT IDXXML1 XVIL 8 6
XMLPARTT SQL090818102922770 XVIP 8 6
XMLPARTT IDXXML2 XVIL 6 5
XMLPARTT SQL090818102922820 XVIP 6 5
6 record(s) selected. |
在清单 7 的结果中我们可以看到,表 XMLPARTT 的 TABLEID 和 TBSPACEID 分别为 -32768 和 -6,这是一对分区表特有的逻辑 ID,对于每一个分区还会有一对物理 ID,从另一个目录视图 SYSCAT.DATAPARTITIONS 中可以看到。
在 SYSCAT.INDEXES 中我们看到了 4 种索引类型(INDEXTYPE),这些类型都不是分区表特有的,任何一个含有 XML 列并且创建了基于 XML 的索引的表都有这四种索引类型,这里作一个简要的介绍。
-
XRGN:XML 区域索引,只要有 XML 列,DB2 都会自动对 XML 列创建 XML 区域索引,用于捕获将 XML 文档内部分割为若干区域的方式。
-
XPTH:XML 路径索引,用于记录存储在 XML 列中的 XML 文档内的所有唯一路径。如果表中有多个 XML 列,则将有多个 XML 路径索引。
-
XVIL:基于 XML 数据的逻辑索引,
-
XVIP:基于 XML 数据的物理索引,当用户创建 XML 数据索引时,DB2 将创建两个 B 型树索引:逻辑索引和物理索引。逻辑索引包含 CREATE INDEX 语句所指定的 XML 模式信息,物理索引具有 DB2 生成的键列来支持逻辑索引,并包含已建立索引的文档值,在逻辑级别使用 XML 数据索引(例如使用 CREATE INDEX 和 DROP INDEX 语句),DB2 以透明方式处理底层物理索引。
对于带有 XML 列的分区表,XML 区域索引是分区索引,而 XML 路径索引、基于 XML 数据的逻辑索引和物理索引都是非分区索引。
在清单 7 的结果中我们可以看到,XML 区域索引 SQL090818102910280 是分区索引,它的 TBSPACEID 和 INDEX_OBJECTID 分别为 65530 和 32768,这是一对逻辑 ID,对于每一个索引分区在另一个目录视图 SYSCAT.INDEXPARTITIONS 中可以看到。
XML 路径索引 SQL090818102918460 所在的表空间 ID 为 6,从清单 2 中可以找到其对应的表空间为 IXTBSPXX,这个存放位置是由创建表时的 INDEX IN 子句决定的。
用户创建的 XML 索引 IDXXML1,其逻辑索引和物理索引所在的表空间都是 8,即表空间 IXTBSPXW,这个存放位置是由创建该索引是的 IN 子句决定。而用户创建的另一个 XML 索引 IDXXML2,由于在创建时没有制定 IN 字句,所以其逻辑索引和物理索引所在的表空间都是由表级的 INDEX IN 子句决定,即表空间 IXTBSPXX,其 ID 为 6 。
接下来看刚才提到的两个目录视图 SYSCAT.DATAPARTITIONS 和 SYSCAT.INDEXPARTITIONS 中的相关记录,使用的查询语句和结果如清单 8 所示。
清单 8. 查看 SYSCAT. DATAPARTITIONS 和 SYSCAT. INDEXPARTITIONS
select substr(DATAPARTITIONNAME, 1,20) DATAPARTITIONNAME, PARTITIONOBJECTID,
tbspaceid ,substr(tabname,1,10) tabname from SYSCAT. DATAPARTITIONS
where TABNAME='XMLPARTT'
DATAPARTITIONNAME PARTITIONOBJECTID TBSPACEID TABNAME
------------- ----------- ------- ------
PART0 4 4 XMLPARTT
PART1 4 3 XMLPARTT
PART2 4 5 XMLPARTT
PART3 5 3 XMLPARTT
PART4 6 3 XMLPARTT
5 record(s) selected.
select substr(TABNAME, 1,10)TABNAME,SUBSTR(INDNAME, 1, 20) INDNAME,
INDPARTITIONTBSPACEID, INDPARTITIONOBJECTID, DATAPARTITIONID
from SYSCAT.INDEXPARTITIONS where TABNAME='XMLPARTT'
TABNAME INDNAME INDPARTITIONTBSPACEID INDPARTITIONOBJECTID DATAPARTITIONID
--------- ------------ ------------- ---------- ----------
XMLPARTT SQL090818102910280 4 4 0
XMLPARTT SQL090818102910280 7 4 1
XMLPARTT SQL090818102910280 8 4 2
XMLPARTT SQL090818102910280 8 5 3
XMLPARTT SQL090818102910280 3 6 4
5 record(s) selected. |
在 SYSCAT.DATAPARTITIONS 中可以看到表 XMLPARTT 的 5 个数据分区,上文中提到,XML 存储对象(XDA)放置在与相应数据分区相同的表空间中。
在 SYSCAT.INDEXPARTITIONS 中可以看到 XML 区域索引 SQL090818102910280 对应的 5 个索引分区以及其放置的表空间,和普通的分区索引一样, XML 区域索引的每个索引分区可以放到不同的表空间中,也可以把两个或者多个索引分区放到相同的表空间中,这是由创建表时的分区级的 INDEX IN 子句所控制,如果没有分区级的 INDEX IN 子句则放置在与数据分区相同的表空间中,例如第一个索引分区放在与数据分区相同的表空间中,ID 为 4,即 TBSPXD ;第二个索引分区放在与数据分区不同的表空间中,ID 为 7,即 IXTBSPXY,是由分区级的 INDEX IN 子句所决定。
XML 数据的转入和转出
分区表的一个重要功能是能够快速的将单个分区数据进行转入和转出(Roll Out/Roll in)。这项功能同样能够用于支持 XML 数据的分区表。
XML 数据的转入
首先来看数据的转入,创建一个非分区的 XML 表并插入几条数据,如清单 9 所示。其中插入的数据不在 XMLPARTT 任何一个分区范围内。
清单 9. 创建非分区的 XML 表
create table temp ( c1 int, doc xml) ;
insert into temp values ( 51,'<salemen><name>wawa</name><role>mgr</role></salemen>') ;
insert into temp values ( 52,'<salemen><name>wawa</name><role>mgr</role></salemen>') ;
insert into temp values ( 54,'<salemen><name>wawa</name><role>mgr</role></salemen>'); |
然后使用 ALTER TABLE ... ATTACH PARTITION 语句将表 temp 中的数据转入到表 XMLPARTT 中,使用的语句及结果如清单 10 所示。
清单 10. XML 数据的转入
alter table xmlpartt attach partition starting 51 ending 60 from temp;
SQL3601W The statement caused one or more tables to automatically be placed
in the Set Integrity Pending state. SQLSTATE=01586
set integrity for xmlpartt IMMEDIATE CHECKED ;
DB20000I The SQL command completed successfully.
select count(*) from xmlpartt where c1 > 50 ;
1
-----------
3
1 record(s) selected. |
数据转入操作将会导致表 XMLPARTT 变为“ Set Integrity Pending ”状态,这时需要使用命令“ set integrity ”来维护数据和索引的一致性,该表恢复正常,通过查询我们可以看到表 temp 中的数据(3 条)被转入到表 XMLPARTT 中。如果进一步去查看 SYSCAT.DATAPARTITIONS 我们会发现表 XMLPARTT 多了一个数据分区,相应的查看 SYSCAT.INDEXPARTITIONS 我们会发现表 XMLPARTT 多了一个索引分区。
XML 数据的转出
接下来我们使用 ALTER TABLE ... DETACH PARTITION 语句将表 XMLPARTT 中刚转入的数据再转出到表 temp 中,使用的语句及结果如清单 11 所示。
清单 11. XML 数据的转出
alter table xmlpartt detach partition part5 into temp;
DB20000I The SQL command completed successfully.
select count(*) from xmlpartt where c1 > 50;
1
-----------
0
1 record(s) selected.
select count(*) from temp;
1
-----------
3
1 record(s) selected. |
其中 part5 是之前数据转入时新增加的数据分区的名字,可以从 SYSCAT. DATAPARTITIONS 中查到。在使用 DETACH PARTITION 语句之后我们看到表 XMLPARTT 中已经查询不到之前的数据,而这些数据已经被转出到表 temp 中。
基于 XML 数据的查询性能的提高
我们知道,当从分区表中查询数据时,DB2 的一个重要特点是能够通过“数据分区消除”功能提高查询性能。“数据分区消除”功能是指数据库服务器能够根据查询谓词确定,只需要访问表的部分数据分区即可完成查询。对分区表运行决策支持查询时,数据分区消除功能特别有用。
对于带有 XML 列的分区表,我们不能使用 XML 列作为分区键,因此不能通过基于 XML 的查询谓词来直接利用数据分区消除功能,但是我们仍然可以利用这一功能来提高性能。下面分两种情况进行讨论,没有创建 XML 索引情况和创建了 XML 索引的情况。
没有创建 XML 索引情况
在没有 XML 索引的情况下,如果我们要从表 XMLPARTT 中查询 role="regular" 的所有记录,这时 DB2 会对整个表进行扫描(TBSCAN)并对所有的 XML 文档进行扫描(XSCAN),所有的数据分区都会被扫描,这样分区表的优势没有得到发挥。
但是在实际应用环境中很少会执行上述的查询,而更多的是包括多个查询谓词的查询,这时我们就可以充分利用数据分区消除功能。现在我们要执行清单 12 中的查询语句,来查询 c1 < 20 并且 role="regular" 的记录。为了便于执行我们将该查询语句写到文本文件中,假设文件名为 query.sql 。
清单 12. XML 查询语句
alter table xmlpartt detach partition part5 into temp;
DB20000I The SQL command completed successfully.
select count(*) from xmlpartt where c1 > 50;
1
-----------
0
1 record(s) selected.
select count(*) from temp;
1
-----------
3
1 record(s) selected. |
我们用说明工具(Explain Tool)来看一下 DB2 优化器为这个语句生成的执行计划,使用命令以及部分结果如清单 13 所示。
清单 13. 查看没有 XML 索引时的执行计划
db2 DROP INDEX IDXXML1;
db2 DROP INDEX IDXXML2;
db2 – tvf .../sqllib/misc/EXPLAIN.DDL;
db2 set current explain mode explain;
db2 – tvf query.sql;
db2exfmt – d mydb -1 – e – o exfmt.out_1;
In exfmt.out_1:
Access Plan:
-----------
Total Cost: 97.7537
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
4.05
^NLJOIN
( 2)
97.7537
12
/-+--\
9 0.45
TBSCAN XSCAN
( 3) ( 4)
24.9977 8.084
3 1
|
20
DP-TABLE: TESTID
XMLPARTT
Q2
省略若干行
3) TBSCAN: (Table Scan)
省略若干行
Arguments:
---------
CUR_COMM: (Currently Committed)
TRUE
DPESTFLG: (Number of data partitions accessed are Estimated)
FALSE
DPLSTPRT: (List of data partitions accessed)
0-1
DPNUMPRT: (Number of data partitions accessed)
2
GLOBLOCK: (Global Lock intent)
INTENT SHARE
省略若干行
DP Elim Predicates:
------------------
Range 1)
Stop Predicate: (Q2.C1 < 20) |
在输出文件 exfmt.out_1 中,我们可以看到,DPLSTPRT 和 DPNUMPRT 这两个参数说明 DB2 只访问两个数据分区,即 0-1,这就是数据分区消除功能,而且通过 DP Elim Predicates 可以看出是优化器是根据查询谓词 c1 < 20 而使用该功能。
创建了 XML 索引情况
如果我们没有删除 XML 索引 IDXXML1 和 IDXXML2,情况又会怎么样呢?
如果我们要从表 XMLPARTT 中查询 role="regular" 的所有记录,这时 DB2 可以利用索引扫描(IXSCN)来提高查询速度,但是所有的数据分区的 XML 文档都会被扫描,这样分区表的优势也没有得到发挥。同样的,这也不是实际应用中常用的查询,所以继续执行清单 12 中的查询语句。
我们使用清单 5 的语句重新创建之前的 XML 索引,然后用说明工具(Explain Tool)来看一下 DB2 优化器在有 XML 索引的情况下为这个语句生成的执行计划,使用命令以及部分结果如清单 14 所示。
清单 14. 查看有 XML 索引时的执行计划
db2 set current explain mode explain;
db2 – tvf query.sql;
db2exfmt – d mydb -1 – e – o exfmt.out_2;
In exfmt.out_2:
Access Plan:
-----------
Total Cost: 61.6359
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
4.05
^NLJOIN
( 2)
61.6359
36.05
/-+--\
4.05 1
FETCH XSCAN
( 3) ( 7)
28.8957 8.084
32 1
/----+-----\
4.05 20
RIDSCN DP-TABLE: TESTID
( 4) XMLPARTT
3.36631 Q2
0
|
4.05
SORT
( 5)
3.31483
0
|
4.05
XISCAN
( 6)
3.10136
0
|
20
XMLIN: TESTID
IDXXML2
Q2
省略若干行
6) XISCAN: (Index Scan over XML)
省略若干行
Arguments:
---------
DPESTFLG: (Number of data partitions accessed are Estimated)
FALSE
DPLSTPRT: (List of data partitions accessed)
0-1
DPNUMPRT: (Number of data partitions accessed)
2
GLOBLOCK: (Global Lock intent)
INTENT NONE
ROWLOCK : (Row Lock intent)
NONE
SCANDIR : (Scan Direction)
FORWARD
TABLOCK : (Table Lock intent)
INTENT NONE
UR_EXTRA: (UR plus extra table lock and may upgrade to CS)
TRUE
XDFOUT : (Expected Documents per Input Value)
0.450000
XLOGID : (Logical Index over XML)
HAOQINGY.IDXXML2
XPHYID : (Physical Index over XML)
SYSIBM .SQL090818102922820
省略若干行
DP Elim Predicates:
------------------
Range 1)
Stop Predicate: (Q2.C1 < 20) |
在输出文件 exfmt.out_2 中,我们可以看到,DB2 使用了 XML 索扫描并且只访问两个数据分区,即 0-1,这说明仍然数据分区消除功能,通过这种方式更好的提高了 XML 数据查询的性能。
关于带有 XML 列的分区表在 XML 数据查询性能方面的优势,我们可以做更多的验证,如其对 XANDOR 操作符的支持等,限于篇幅不再详细展开,读者有兴趣可以自己动手来实验。
总结
本文可以使读者较为深入的了解 DB2 V9.7 的支持 XML 数据的分区表的特性,包括如何创建带有 XML 列的分区表,如何管理相关的数据库对象,如何方便的进行 XML 数据的转入和转出,分析了分区表功能如何提高基于 XML 数据的查询的性能。
参考资料 学习
获得产品和技术
- 使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。
- 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。
讨论
关于作者  | |  | 郝庆运,IBM CDL 软件工程师,IBM 认证 DBA,曾先后从事数据仓库产品的测试工作、DB2 NSE 相关工作,以及DB2 pureXML 开发工作,目前正在从事 DB2 data partitioning 组件的开发工作,可以通过 haoqingy@cn.ibm.com 与他联系。 |
对本文的评价
|