程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 V9.7 新特性:支持 XML 數據的分區表

DB2 V9.7 新特性:支持 XML 數據的分區表

編輯:DB2教程

在 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 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. 創建數據庫
db2 CREATE DB MYDB

創建數據庫之後我們創建若干個表空間,請查看每個表空間對應的 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.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved