DB2 V9.7新機能ワークショップ <第1.00版 2009年 7月> XML機能強化 本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する 使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまたは同 様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2009 内容 • DB2 pureXML機能概要 • XMLのウェアハウス機能強化 • • • • DPF MDC パーティション表 XDA圧縮 • その他の機能拡張 • • • • • 2 オンライン索引再編成/索引作成 UDF Global Temporary Table 複数文書のdecomposition SQL/XQuery間の述部プッシュダウン照会最適化 © 2009 ISE Corporation DB2 pureXML機能概要 pureXML機能概要 DB2 3 © 2009 ISE Corporation DB2 pureXMLの歩み V9.7 V9.7 XMLウェアハウスへ XMLウェアハウスへ V9.5 DPF DPF MDC MDC V9.1 Inline格納 パーティション表 パーティション表 XDA圧縮 XDA圧縮 pureXMLサポート 部分更新 オンライン索引再編成/索引作成 オンライン索引再編成/索引作成 XSLT UDF UDF Global GlobalTemporary TemporaryTable Table pureXML機能強化 XML基本機能 XML列/索引 XQuery スキーマエボリューション Replication Load 複数文書のdecompositoin 複数文書のdecompositoin parse/validationの詳細エラー parse/validationの詳細エラー 各種ユーティリティ 4 © 2009 ISE Corporation DB2におけるXMLデータの格納 • DB2のpureXML機能では、XMLデータを保持するための「XMLデータ型」を提供する • XMLデータ型はリレーショナル表の中に定義し、レコードの中の1カラムとして取り扱う • XMLデータは分解(Parse)されDOMに似た階層型のフォーマット(XDM)で格納される • 照会時にはParseしない • XML格納方法は2通り - inline格納 inline格納/XDA(XML 格納/XDA(XML Data Area)格納 Area)格納 insert into dept values (1,……, ’<dept><emp>夏目漱石</emp></dept>’) dept表 表の論理構造 inline格納 格納する 格納する表 する表の定義 deptID … deptdoc 1 … <dept> … create table dept (deptID int,…, deptdoc xml inline length 10000 ) <emp>夏目漱石</emp> </dept> … リレーショナル deptID … … XML deptdoc 1 inline格納時のdept表の物理構造 5 XDA格納 格納する 格納する表 する表の定義 create table dept (deptID int,…, deptdoc xml) … LOBと類似だが bufferpoolを使用 リレーショナル deptID XML XDA(XML Data Area) deptdoc XML記述子 記述子 regions index XMLデータ データ XDA格納時のdept表の物理構造 © 2009 ISE Corporation XMLカラムの使用法 V9.1 XMLサポート サポートは データベースのみ サポートはunicodeデータベース データベースのみ V9.5から からunicode以外 以外の も可能だが 列内 から 以外のDBも 可能だが、 だが、XML列内 容はUTF-8で で格納される 格納される • データベースの データベースの作成 create database XMLTEST using codeset utf-8 territory jp; • XMLカラム カラムを カラムを持つ表の作成 create table dept(deptID int, deptdoc xml); • データの データの操作 通常の 通常 のSQLで で操作可能 insert into dept values (1, ?); select deptID, deptdoc from dept; delete from dept where deptID=1; update dept set deptdoc = ? XML列内の部分変更については、Update文とXQuery transform式を組み合わせて実行する • XMLアクセス アクセス • SQL/XML: ANSI/ISO SQL標準の拡張 SQLにXML処理関数を埋め込む SQLからXQueryの実行可能 • XQuery: W3C(World Wide Web Consortium勧告) XQueryからSQLの呼び出し可能 XMLを変更するtransform式をサポート 6 © 2009 ISE Corporation XML索引 • XMLカラム カラムに カラムに対してユーザー してユーザーが ユーザーが索引を 索引を作成 • 索引対象は、要素、属性 • XML索引は、CREATE INDEXステートメント中xmlpattern(XPath)を記述して指定 • XMLのデータ型はSQLデータ型にマップされる。 CREATE INDEX empindex ON company(docs) GENERATE KEY USING XMLPATTERN '/company/emp/@id' AS SQL DOUBLE • COMPANY表 COMPANY表 1row 1row 7 XML索引を使って検索を実行 • ANDing/ORing COMPANYDOC (XMLデータタイプ列) <company name="Company1"> <emp id="31201" salary="60000" gender="Female"> <name><first>Laura </first><last>Brown</last></name> <dept id="M25">Finance</dept> </emp> </company> <company name="Company2"> <emp id="31664" salary="60000" gender="Male"> <name><first>Chris</first><last>Murphy</last></name> <dept id="M55">Marketing</dept> </emp> <emp id="42366" salary="50000" gender="Female"> <name><first>Nicole</first><last>Murphy</last></name> 略 EMPINDEX索引 EMPINDEX索引 COMPANYDOC (DOUBLE) 31201 31664 42366 DOUBLE型の索引が作成される © 2009 ISE Corporation システム作成のXML索引 • XML索引 XML索引の 索引の種別 • Regions Index • • • XML列を含む表を作成したときに、表に対して1つ自動的に作成される DB2が内部的に使用する索引。XMLインスタンスがどのページに格納されているかを管理 する。 Paths Index • • XML列を含む表を作成したときに、XML列ごとに1つ自動的に作成される • DB2が内部的に使用する索引。 • 各XML列に属するすべてのXMLインスタンスで、ユニークなパスを保存する。 XML Index • • • ユーザーがXML列に対して作成する索引 従来の索引と同様、表スペース内にページがとられる 一つのXML列に対して複数の索引を作成可能 CREATE TABLE t1 (docID int, XMLDoc1 xml, XMLDoc2 xml); XML Regions Index 8 XML Column Path Index on XMLDoc1 XML Column Path Index on XMLDoc2 © 2009 ISE Corporation Logical Index、Physical Index • XML列 列に対して作成 して作成される 作成されるINDEX される select substr(indname,1,20) as indname,IID,substr(TABNAME,1,10) as TABNAME, INDEXTYPE from syscat.INDEXES where TABNAME='COMPANY‘ INDNAME IID TABNAME INDEXTYPE -------------------- ------ ---------- --------SQL060518113414530 1 COMPANY XRGN ←Region Index SQL060518113414950 2 COMPANY XPTH ←Path Index EMPINDEX 3 COMPANY XVIL ←XML Logical Index SQL060518113548400 4 COMPANY XVIP ←XML Physical Index Table作成時に、DB2が自動 的に内部的に作成する索引 ユーザーがXML Indexを作成を すると、それはLogical Indexとな り、内部的にPhysical Indexが自 動的に作成される カタログ情報 カタログ情報 SYSCAT.INDEXES SYSSTAT.INDEXES LOGICAL INDEX PHYSICAL INDEX REGION INDEX PATH INDEX PHYSICAL INDEX REGION INDEX PATH INDEX 9 SYSCAT.XMLPATTERNS LOGICAL INDEX © 2009 ISE Corporation ブランク・ ブランク・ページ 10 © 2009 ISE Corporation DB2 pureXML機能概要 pureXML機能概要 DB2 11 © 2009 ISE Corporation pureXML in DB2 V9.7 DPF DB2 XML Support MDC 2008年 2008年 9月, 東京, 東京, 2008年 2008 DB2年 9月, 大 阪, Webs phere XML XML データ データ 2008年 2008年 2008年 2008年 8月, 東 9月, 京, 2008年 2008年 東京, 東京, DB2 8月, 大 2008年 2008 DB2年 9月, 大 阪, 阪, Webs Websp phere here ウェアハウス ウェアハウス 文書系XMLデータ データの 文書系 データの パーティション表 パーティション表 J a n F e b M ar 管理/加工 管理 加工/検索 加工 検索 A pr 大量のXMLデータ 文書サイズが大きいXMLデータ 圧縮 •マニュアル •報告書/申請書 •条例/省令 •カルテ 12 など © 2009 ISE Corporation XML表の作成 – DPFサポート •• DPF環境 環境でも 列 環境 でも 作成 DPF環境 環境でも でもXML列 列を を含 含む む表 表の の作成が 作成が が可能 可能 環境でもXML列 でも 作成が •• DPF環境の既存の表にALTER DPF環境の既存の表にALTERTABLEでXML列の追加が可能 TABLEでXML列の追加が可能 •• どのパーティションからでもXSRオブジェクト(XMLスキーマなど)の登録/ どのパーティションからでもXSRオブジェクト(XMLスキーマなど)の登録/ 検索が可能 検索が可能 •• SQL/XML, SQL/XML,XQueryのパラレル実行可能 XQueryのパラレル実行可能 •• パラレルのLOADが可能 パラレルのLOADが可能 • 制約 CREATE TABLE table1 ( col1 int, col2 xml, DISTRIBUTE BY HASH(col1)) • XML列をdistribution keyにすることはできない • distribution keyを持つXML表に対しuniqueなXML索引を持てない • V9.1/V9.5のXMLフォーマットを持つ表はDPF環境に分散できない => 表の再作成またはADMIN_MOVE_TABLEによる移行が必要 13 © 2009 ISE Corporation XML表の作成 – MDCサポート •• XML列 列 表 作成 XML列 列を を含 含む むMDC表 MDC表 表の の作成が 作成が が可能 可能 作成が •• MDC表にALTER MDC表にALTERTABLEでXML列の追加が可能 TABLEでXML列の追加が可能 •• MDCブロック索引と、XML索引を合わせて使用することが可能 MDCブロック索引と、XML索引を合わせて使用することが可能 CREATE TABLE MDC1 ( 製品 VARCHAR(10), 製品明細 XML) ORGANIZE BY DIMENSIONS (製品) • 制約 • XML列を次元(ORGANIZE BY節)に指定することはできない 14 © 2009 ISE Corporation XML表の作成 – パーティション表サポート •• XML列 列 パーティション にすることが XML列 列を を含 含む む表 表を をパーティション表 パーティション表 表にすることが可能 にすることが可能 可能 パーティション表 にすることが可能 •• パーティション表に対してALTER パーティション表に対してALTERTABLEでXML列の追加が可能 TABLEでXML列の追加が可能 •• XDA用の表スペースは、パーティション表の表スペースに置くことも、 XDA用の表スペースは、パーティション表の表スペースに置くことも、 別表スペースに置くことも可能 別表スペースに置くことも可能 CREATE TABLE t1(c1 INT, c2 INT, c3 XML) IN tbsp1, tbsp2, tbsp3 LONG IN tbsp6, tbsp7, tbsp8 PARTITION BY RANGE(c1) (STARTING FROM 1 ENDING 90 EVERY 30) • 制約 • XML列をpartition keyに することはできない tbsp1 tbsp2 tbsp3 t1.p1 t1.p2 t1.p3 XDA1 XDA2 XDA3 tbsp6 tbsp7 tbsp8 • XML索引はpartitioned index (ローカル索引)にすることはできない 15 © 2009 ISE Corporation Net Search Extenderの機能拡張 • XMLの の全文検索実行には Search Extenderなどの などのテキ 全文検索実行には,Net には などのテキ スト全文検索機能 スト全文検索機能を 全文検索機能を使用する 使用する •• XML表の機能拡張と合わせてNSEも以下の表をサポート XML表の機能拡張と合わせてNSEも以下の表をサポート •• MDC MDC •• パーティション パーティション表 パーティション表 表 パーティション表 •• DPF(V9.5では ではAIXのみ では のみ サポート DPF(V9.5では ではAIXのみ のみサポート サポート) では のみサポート のみサポート) サポート 文書管理表 文書 ID DOC 1 <book> SELECT * FROM 文書管理表 WHERE CONTAINS(doc, ‘SECTIONS(“/book/text”) “pureXML”’)=1 <title>InfortaionCenter</title> <Chapter>1</Chapter> XML文書内 文書内を 文書内を全文検索 <text>これは、DB2のマニュアルです。 pureXML機能はDB2でXMLを扱う機能です。 </text> </book> … 16 © 2009 ISE Corporation XMLデータの圧縮 • • DB2 V9.5 、、基礎表に 基礎表 保持 では されたものが V9.5 での DB2 V9.5では V9.5では では、 基礎表に に保持されたものが 保持されたものが されたものがV9.5 V9.5での での圧縮対象 圧縮対象 V9.5では、 では 基礎表に 保持されたものがV9.5 されたものがV9.5での V9.5での圧縮対象 での圧縮対象 • • V9.7 V9.7では オブジェクトに では XDA オブジェクト 保持 された XML データ V9.7では ではXDA XDAオブジェクト オブジェクトに に保持された 保持された されたXML XMLデータ データも も圧縮対象 圧縮対象 V9.7ではXDA ではXDAオブジェクト XDA オブジェクトに 保持されたXML されたXMLデータ XMLデータも データも create table dept (deptID char(8),...,doc XML inline length 10000) データ・ データ・オブジェクト 圧縮可( 圧縮可(V9.5) V9.5) 17 ID … PR27 … PR28 … ACC … 索引オブジェクト 索引オブジェクト DOC (XML) XML記述子 記述子 Regions Index 圧縮可( 圧縮可(V9.7) V9.7) XDAオブジェクト オブジェクト(XML Data) オブジェクト © 2009 ISE Corporation XMLデータの圧縮方法 create table dept (deptID char(8),...,doc XML) compress yes • 圧縮辞書の 圧縮辞書の作成 • REORG TABLE (RESETDICTIONARYオプション) • すでに表にデータがある場合(ALTER TABLE COMPRESS YESで表属性を変更し REORG) • Automatic Dictionary Creation (ADC) • V9.5から • 表に一定量のデータが挿入されると自動的に辞書が作成され、データが圧縮される • LOAD REPLACE • V9.5から • 新規のテーブル作成/データを一時ExportしてLoadしなおす場合 • 自動的な辞書の作成または既存辞書の再利用が可能 • XDA圧縮辞書 圧縮辞書が が返される) 圧縮辞書が作成されない 作成されないケース されないケース (SQL2220Wが される) • REORG、LOAD REPLACEを実行したが、XDAオブジェクトが空の場合 • XMLデータがV9.1、V9.5からのマイグレーションによるものの場合 • V9.7版のXDAフォーマットにするため、表の再作成が必要 • ADMIN_MOVE_TABLEプロシージャー(V9.7新機能)を使用可能 18 © 2009 ISE Corporation XML索引の圧縮 •• ユーザー定義 索引の ユーザー 定義 索引 ユーザー定義 定義XML索引 索引の の圧縮可能 圧縮可能 ユーザー定義XML索引 定義 索引の •• 索引圧縮はV9.7新機能 索引圧縮はV9.7新機能 •• COMPRESS COMPRESSYESと指定された表に対する索引は自動的に圧縮 YESと指定された表に対する索引は自動的に圧縮 •• CREATE CREATEINDEXで明示的に圧縮モードを指定 INDEXで明示的に圧縮モードを指定 (COMPRESS (COMPRESS[YES|NO]) [YES|NO]) 19 © 2009 ISE Corporation XML索引圧縮の制約事項 • 圧縮の Index 圧縮の対象となる 対象となるXML となる XML XMLRegion RegionIndex Index XML XMLPath PathIndex Index XML XMLIndex Index OK OK • 圧縮対象 • • 表作成時にCOMPRESS YESの設定要 ALTER INDEXでの切替不可 • 圧縮の 圧縮の対象外 OK OK • 圧縮対象 • • 索引作成時に指定要 ALTER INDEXでの切替不可 • XML索引 索引は によるCOMPRESS YES/NOの の切替ができない 切替ができない(GA) 索引はALTER INDEXによる による ができない • XML索引の実体を表すPhysical IndexをALTERする必要があるが、Physical Indexに 対してはALTER INDEXが発行不可 FP1で で FP1で で修正 修正 予定 予定 20 © 2009 ISE Corporation 日本語を含むXMLデータでの圧縮例 • 長いテキストデータを データでの テキストデータを多く含むXMLデータ データでの例 での例 • 圧縮効率が 内に保持されている 圧縮効率が高く、生データよりも データよりも小 よりも小さなサイズ さなサイズで サイズでDB内 保持されている 10GBのXMLデータを投入した際の比較 25.0 ー 約 の 約45%の 45%の の圧縮効果 圧縮効果 デ 20.0 タ 量 15.0 10.0 19.1 [ G B 5.0 9.8 8.8 8.4 圧縮 圧縮(+REORG) ] 0.0 生データ 非圧縮 • 公開特許公報の データを 公開特許公報のXMLデータ データを使用( 使用(日本語による 日本語による特許記述 による特許記述の 特許記述の文章を 文章を含む) • XMLファイル ファイル数約 ファイル数約27万件 数約 万件、 万件、平均サイズ 平均サイズ38KB サイズ • ファイルの 、DB中 中ではUTF-8で で格納される ファイルのコードページは コードページはEUC、 では 格納される 21 生 データ とほぼ 生データとほぼ データとほぼ とほぼ同等 同等 データとほぼ同等 とほぼ同等 の ストレージサイズ のストレージサイズ で で格納可能 格納可能 データは 列 データ データは はXML列 XML列 列に に格 格 データは 納 する際 際 の 構造化に に する 構造化 納する際 する際の構造化に 構造化に より生 生 (テキスト テキスト)データ より テキスト より生 テキスト)データ データ より生(テキスト テキストデータ に して に対 対して2-3倍 して2-3倍 倍に に膨張 膨張 して 倍 圧縮によって 圧縮 によって 圧縮によって によって、 生デー デー 圧縮によって、 によって、、生 タタとと同等ないし 同等 ないし、 、 それ 同等ないし ないし、 同等ないし ないし、それ 以下に 以下 以下に に 以下に © 2009 ISE Corporation 日本語を含むXMLデータでの圧縮効果 • XML索引の圧縮 • 数値型、テキスト型で索引の圧縮率に大きな差はない • 共に、20-30%程度の圧縮率 索引ごとの圧縮比 2,500 ー 2,000 デ 圧縮あり 圧縮無し タ 1,500 量 [ M B 1,000 500 ] 0 Regions Index 22 Paths Index XIX_D1 XIX_D2 XIX_D3 XIX_VC1 XIX_VC2 XIX_VC3 XIX_VC4 XIX_VC5 XIX_VC7 XIX_VC8 © 2009 ISE Corporation 日本語を含むXMLデータでの圧縮効果 • XML索引の圧縮 索引名 容量[MB] 圧縮 率 データ型 備考 圧縮あり 圧縮無し 35 55 36% N/A Paths Index 0 0 0% N/A XIX_D1 0 0 0% Double XIX_D2 396 574 31% Double YYYYMMDD型の日付データ XIX_D3 68 99 31% Double 1~3桁程度の数値ID XIX_VC1 0 0 0% VARCHAR 日本語による長いString XIX_VC2 78 105 25% VARCHAR 日本語による長いString XIX_VC3 742 905 18% VARCHAR 日本語による長いString XIX_VC4 357 428 17% VARCHAR 日本語による長いString XIX_VC5 353 401 12% VARCHAR HASED 日本語による長いString XIX_VC7 78 149 48% VARCHAR 日本語による長いString XIX_VC8 1,903 2,254 16% VARCHAR 日本語による長いString Regions Index 23 © 2009 ISE Corporation inline格納効率化のための分析用関数 •• ADMIN_IS_INLINED ADMIN_IS_INLINED •• 文書がinline格納されているか判定(XML, 文書がinline格納されているか判定(XML,LOB) LOB) •• ADMIN_EST_INLINE_LENGTH ADMIN_EST_INLINE_LENGTH •• inline格納するために必要なinline inline格納するために必要なinlinelengthの表示(XML, lengthの表示(XML,LOB) LOB) -- inline length 1000 byteのXML表を作成 CREATE TABLE customer(id int, xmlcol XML INLINE LENGTH 1000); --- データを投入 INSERT INTO customer VALUES (?,?); -- inline分析用関数を実行 SELECT id, ADMIN_IS_INLINED(info) AS inlined, ADMIN_EST_INLINE_LENGTH(info) AS inline_length FROM customer; ID INLINED INLINE_LENGTH inline化されているかどうか(1:inline, 2:inline化されていない) ------- -------- ------------inline化されているものは実際に使用している長さ 1000 1 770 1001 0 2345 1000を超えるものはinline化に必要な長さ(推定) 1002 1 796 -1はページサイズが小さすぎてinline化できない 1003 0 1489 -2 XMLフォーマットがV9.1/V9.5のもの 1004 0 -1 24 © 2009 ISE Corporation その他の機能拡張 その他の機能拡張 25 © 2009 ISE Corporation XML索引のオンライン作成/再編成 •• XML索引作成時 索引作成時の 索引作成時 XML索引作成時 索引作成時の の更新処理可能 更新処理可能 索引作成時の •• CREATE CREATEINDEX INDEXALLOW ALLOWWRITE WRITEACCESS ACCESS •• XML索引再編成時 索引再編成時の 索引再編成時 XML索引再編成時 索引再編成時の の更新処理可能 更新処理可能 索引再編成時の •• REORG REORGINDEXES INDEXESALL ALLFOR FORTABLE TABLEALLOW ALLOWWRITE WRITEACCESS ACCESS • REORG INDEXES ALL FOR TABLE CLEANUP ONLYは は、従来から 従来から ALLOW WRITE ACCESS可能 可能 26 © 2009 ISE Corporation オンラインXML索引作成のシナリオ • XML表内 表内に 文書を 表内に、新しいスキーマ しいスキーマの スキーマのXML文書 文書を追加 • DB2 pureXMLは、では、同一XMLカラム内に異なるスキーマの文書を格納できる • スキーマエボリューション機能で、validationするXML Schemaを互換性のある新し いスキーマに置き換えることも可能 • オンラインで オンラインで新しいスキーマ しいスキーマに スキーマに対応した 対応した索引 した索引を 索引を追加 • V9.7では、新しい索引を作成する間にも表への追加/更新が可能 pureXMLの の スキーマ 柔軟性 かした pureXMLの のスキーマ柔軟性 スキーマ柔軟性 柔軟性を を生 生かした運用 かした運用 運用 スキーマ柔軟性を 柔軟性を かした運用 CUSTOMER表 表 Cust ID … 1 … <CUSTOMER version=1.0> … DOC <NAME>夏目漱石</NAME> </CUSTOMER> … <CUSTOMER version=2.0> … … 新サービスを 要素追加 サービスを開始し 開始しXML要素追加 スキーマエボリューションによる スキーマエボリューションによる スキーマの スキーマの置き換え <NAME>夏目漱石</NAME> <ServiceName>A</ServiceName> </CUSTOMER> 新スキーマによる スキーマによる文書追加 による文書追加 新要素を 新要素を使用する 使用する索引 する索引を 索引を追加 CREATE INDEX custidx2 ON CUSTOMER(DOC) GENERATE KEY USING XMLPATTERN '/CUSTOMER/ServiceName' … 27 © 2009 ISE Corporation 宣言済みグローバル一時表(DGTT)のXMLサポート • 宣言済み Global Temporary Table) 宣言済みグローバル一時表 グローバル一時表(Declared 一時表 • 現行セッションでのみ有効な一時表 • 作成したアプリケーションによって発行された SQLステートメントでのみアクセス 可能 • セッション中に繰り返し使用するデータを一時表にキャッシュしておくことにより、 都度実表にアクセスする必要がない • 実表にアクセスする場合に必要なロックやログを削減できる • create global temporary tableでは、XML列は使用不可 • create global temporary tableはV9.7の新機能 declare global temporary table session.temp_cust(cid bigint, info xml) on commit preserve rows insert into session.temp_cust (cid, info) select cid, info from customer select * from session.temp_cust -- 実行 CID INFO 1000 <customerinfo Cid="1000"><name>Kathy Smith</name><addr country="Canada"><street>5 Rosewood</street><city>Toronto</city><prov-state>Ontario</provstate><pcode-zip>M6W 1E6</pcode-zip></addr><phone type="work">416-5551358</phone></customerinfo> 28 © 2009 ISE Corporation ユーザー定義関数(UDF)でのXMLの使用 in/outパラメータ パラメータとして タイプを パラメータ として タイプ in/outパラメータ パラメータとして としてXMLタイプ タイプを を使用 使用 パラメータとしてXMLタイプ として タイプを SQLで で かれた 内 での 実行および 変数の 実行 および 変数 SQLで で書 書かれたUDF内 かれたUDF内 内でのSQL/XML実行 でのSQL/XML実行 実行および およびXML変数 変数の の使用 使用 かれた での 実行およびXML変数 および 変数の •• •• CREATE FUNCTION getname(doc XML) RETURNS VARCHAR(25) BEGIN ATOMIC RETURN XMLCAST(XMLQUERY('$d/customerinfo/name' PASSING doc AS "d") AS VARCHAR(25)); END -- 実行 $ db2 "select getname(info) as name from customer" NAME ------------------------- CID INFO 1001 <customerinfo Cid=“1001”> <name>Kathy Smith</name> <addr country=“Canada”> <street>25Creek</street> <city>Markham</city> <prov-state>Ontario</prov-state> <pcode-zip>N9C 3T6</pcode-zip> </addr> <phone type="work">905-555-7258</phone> </customerinfo> Kathy Smith Kathy Smith Jim Noodle Robert Shoemaker Matt Foreman Larry Menard 6 record(s) selected. 29 CUSTOMER表 … © 2009 ISE Corporation UDF作成例(表値関数) CREATE FUNCTION getphone(doc XML) RETURNS TABLE(type VARCHAR(10), number VARCHAR(20)) BEGIN ATOMIC RETURN SELECT type, number FROM XMLTABLE('$d/customerinfo/phone' PASSING doc AS "d" COLUMNS type VARCHAR(10) PATH '@type', number VARCHAR(20) PATH '.') ; END -- 実行 $ db2 "select cid, t.type, t.number from customer, table(getphone(info)) as t" CID TYPE NUMBER -------------------- ---------- -------------------1000 work 416-555-1358 1001 work 905-555-7258 1002 work 905-555-7258 1003 work 905-555-7258 1003 home 416-555-2937 1003 cell 905-555-8743 1003 cottage 613-555-3278 : 30 © 2009 ISE Corporation XML文書の分解(shredding/decompose) decompositionの の手順 • 1. decomposeするデータを格納するための表をあらかじめ作成する 2. decomposition annotationを含むXMLスキーマをXML Schema Repository (XSR)に登録 • REGISTER XMLSCHEMAコマンドのENABLE DECOMPOSITIONオ プションを指定 REGISTER XMLSCHEMA Product_decomp.xsd from Product_decomp.xsd as DECOMP.ProductDECOMP complete enable decomposition 3. XML文書のシュレッディング • • • • 31 DECOMPOSE XML DOCUMENT コマンド xdbDecompXML ストアド・プロシージャ V9.7 V9.7 DECOMPSE XML DOCUMENTSコマンド コマンド XDB_DECOMP_XML_FROM_QUERYストアド ストアド・ ストアド・プロシージャ • クエリ結果 できる クエリ結果から 結果から一度 から一度に 一度に複数の 複数の文書を 文書をdecomposeできる © 2009 ISE Corporation SQL/XQuery間の述部プッシュダウン照会最適化(1) • 上位の 上位の照会ブロック 照会ブロック(SQL)で で指定された 指定された条件指定述部 下位ブロック ブロック された条件指定述部を 条件指定述部を下位ブロック (XQuery)の の照会の 照会の条件として 条件として,照会 クエリをrewriteする する として 照会コンパイラ 照会コンパイラが コンパイラがクエリを • 下位ブロックで定義されたXML索引を使用できるようになる • 特にXMLTABLE, XMLTABLEを使用したViewで有効 CUSTVIEW ビュー SELECT * FROM CustomerView CREATE VIEW CustView as WHERE CNUMBER=1 SELECT XC.CNumber, XC.CName FROM Customer as C, SELECT * FROM CustomerView XMLTABLE ('$c/Customer‘ PASSING C.doc as "c“ WHERE CNAME=‘幕張商店’ COLUMNS "CNUMBER" INTEGER PATH 'Customer_Number', "CNAME" VARCHAR(50) PATH 'Customer_Name' ) as XC CUSTOMER表 表 文書ID DOC 1 <Customer> <Customer_Number>001</Customer_Number> 索引 CREATE INDEX xCNUMBER ON customer(doc) GENERATE KEY USING XMLPATTERN '/Customer/Customer_Number' AS SQL DOUBLE <Customer_Name>幕張商店</Customer_Name> <Address>千葉市中瀬1-1</Address> </Cistomer> … 32 CREATE INDEX xCNAME ON customer(doc) GENERATE KEY USING XMLPATTERN '/Customer/Customer_Name' AS SQL VARCHAR(50) © 2009 ISE Corporation SQL/XQuery間の述部プッシュダウン照会最適化(2) SELECT * FROM CustomerView WHERE CNUMBER=1 V9.5 最適化ステートメント SELECT $INTERNAL_XMLTOSQL$(Q1.$C1) AS “CNUMBER”, $INTERNAL_XMLTOSQL$(Q1.$C2) AS “CNAME” FROM $INTERNAL_FOR$ ((TABLE ($INTERNAL_XPATH$ (‘($INTERNAL_XMLTOXML_NIEO$(Q2.“DOC”))/ (cust:Customer)(:-->$C0:)/{(Customer_Number)(:-->$C1:), (Customer_Name)(:-->$C2:)}'))) AS Q1), ITLMC.CUSTOMER AS Q2 WHERE ($INTERNAL_XMLTOSQL$(Q1.$C1) = 1) RETURN ( 1) | 46.8 NLJOIN ( 2) 8554.74 1131 /--+--¥ 1104 0.0423913 TBSCAN XSCAN ( 3) ( 4) 204.661 7.56348 27 1 | 1104 TABLE: ITLMC CUSTOMER Q2 33 V9.7 最適化ステートメント SELECT $INTERNAL_XMLTOSQL$(Q1.$C2) AS “CNUMBER”, $INTERNAL_XMLTOSQL$(Q1.$C1) AS "CNAME" FROM $INTERNAL_FOR$ ((TABLE ($INTERNAL_XPATH$ ('($INTERNAL_XMLTOXML_NIEO$(Q2."DOC"))/ (cust:Customer)(:-->$C0:)/{(Customer_Name)(:-->$C1:), Customer_Number/(.[((. >= $INTERNAL_SQLTOXML$($INTERNAL_FUNC$())) and RETURN (. < $INTERNAL_SQLTOXML$($INTERNAL_FUNC$() )))]) ( 1) (:-->$C2:)}'))) AS Q1), ITLMC.CUSTOMER | AS Q2 0.000161502 NLJOIN ( 2) 5517.73 757.175 /---+---¥ 720.175 2.24254e-007 FETCH XSCAN ( 3) ( 7) 70.4099 7.56388 37 1 /---+----¥ 720.175 6004 RIDSCN TABLE: ITLMC ( 4) CUSTOMER 38.2635 Q2 5 | SORT/XISCAN略 | 6004 XMLIN: ITLMC XCNUMBER_IX Q2 © 2009 ISE Corporation SQL/XQuery間の述部プッシュダウン照会最適化(3) SELECT * FROM CustomerView WHERE CNAME=‘幕張商店’ V9.5 最適化ステートメント SELECT $INTERNAL_XMLTOSQL$(Q1.$C1) AS "CNUMBER", $INTERNAL_XMLTOSQL$(Q1.$C2) AS "CNAME" FROM $INTERNAL_FOR$ ((TABLE ($INTERNAL_XPATH$ ('($INTERNAL_XMLTOXML_NIEO$(Q2."D OC"))/(cust:Customer)(:-->$C0:)/{(Customer_Number)(:-->$C1:), (Customer_Name)(:-->$C2:)}'))) AS Q1), ITLMC.CUSTOMER AS Q2 WHERE ($INTERNAL_XMLTOSQL$(Q1.$C2) = ' 」 、 X') Rows RETURN ( 1) Cost I/O | 46.8 NLJOIN ( 2) 8554.74 1131 /--+--¥ 1104 0.0423913 TBSCAN XSCAN ( 3) ( 4) 204.661 7.56348 27 1 | 1104 TABLE: ITLMC CUSTOMER Q2 34 V9.7 最適化ステートメント SELECT $INTERNAL_XMLTOSQL$(Q1.$C1) AS "CNUMBER", $INTERNAL_XMLTOSQL$(Q1.$C2) AS "CNAME" FROM $INTERNAL_FOR$ ((TABLE ($INTERNAL_XPATH$ ('($INTERNAL_XMLTOXML_NIEO$(Q2."D Rows OC"))/(cust:Customer)(:-->$C0:)/{(Customer_Number)(:-->$C1:), RETURN Customer_Name/(.[((. >= $INTERNAL_SQLTOXML$(RTRIM(' 」、 ( 1) X'))) and (. Cost AS Q1), <= $INTERNAL_FUNC$()))])(:-->$C2:)}'))) I/O ITLMC.CUSTOMER AS Q2 | 0.000332284 NLJOIN ( 2) 5707.71 782.275 /---+---¥ 742.275 4.47656e-007 FETCH XSCAN ( 3) ( 7) 93.2265 7.56388 40 1 /---+----¥ 742.275 6004 RIDSCN TABLE: ITLMC ( 4) CUSTOMER 61.0749 Q2 8 | SORT/IXSCAN略 | 6004 XMLIN: ITLMC XCNAME_IX Q2 © 2009 ISE Corporation その他の機能拡張 • XML parse/validationの の詳細エラーメッセージ 詳細エラーメッセージ表示 エラーメッセージ表示 V9.5 から V9.5FP3から FP3から から • XSR_GET_PARSING_DIAGNOSTICSプロシージャ • Optimization Profileでの でのXML索引 索引、 などの指定 での 索引、XISCAN, XANDORなどの などの指定 が可能 35 © 2009 ISE Corporation DB2 9 pureXMLサポートの機能制約 • XMLサポート サポートは のデータベースのみ サポートはコードページUTF-8の コードページ データベースのみ V9.5でUnicode以外も可 • 以下の 以下の機能の 機能のサポートはなし サポートはなし • Federation • レプリケーション (Q-Replicarion) • V9.5でサポート Load • REORG allow write access(indexのみ) • DPF • 以下の カラムを 以下の表はXMLカラム カラムを持てない • MDC (Multidimensional Clustering) V9.7でサポート • パーティション表 • Global Temporary Table • RCT (Range-Cluster Table) • Object-Relational Features (i.e. Structured Types, Distinct Types, Methods)で でXMLタイプ タイプ のサポートなし サポートなし • Check Constraint, Triggerで でXMLカラム カラムを カラムを参照できない 参照できない V9.5でValidationをサポート • V9では では、 は不可 では、サブドキュメントの サブドキュメントのupdateは V9.5でサポート V9.7により により、 は のほとんど全 により のほとんど ての 機能 利用可能 V9.7により により、 XMLは はDB2のほとんど DB2のほとんど のほとんど全 全ての機能 ての機能 機能が が利用可能に 利用可能に に により、、XMLは のほとんど全 ての機能が 機能が 利用可能に 36 © 2009 ISE Corporation 参照資料 • Enhance business insight and scalability of XML data with new DB2 9.7 pureXML features • http://www.ibm.com/developerworks/data/library/techarticle/dm0904db297purexml/index.html?S_TACT=105AGX11&S_CMP= FP • Best Practices: Managing XML Data • http://www.ibm.com/developerworks/data/bestpractices/managi ngxmldata/?S_TACT=105AGX11&S_CMP=LP 37 © 2009 ISE Corporation