XML データの最適化ガイドラインの例

最適化プロファイル例には、XML データにアクセスする照会における最適化の実行方法を制御するための汎用要求、アクセス方式、および結合順序に関するガイドラインが含まれています。

最適化のガイドラインと最適化プロファイルの使用についての情報は、このトピックの末尾にある関連リンクを参照してください。

参照としての XML 文書を移動するためのガイドライン

以下の最適化プロファイルでは、ガイドライン内の DPFXMLMOVEMENT 汎用要求要素によって、XML 文書への参照がアクセス・プラン内の TQ 演算子を介して移動するように指定します。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables"> 
  <STMTKEY SCHEMA="ST">
    SELECT *
    FROM security 
    WHERE XMLEXISTS('$SDOC/Security/SecurityInfo
      /StockInfo[Industry= "OfficeSupplies"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <DPFXMLMOVEMENT VALUE="REFERENCE"/>
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

XML データの特定の索引を使用するガイドライン

以下の最適化プロファイルではガイドライン内の XISCAN アクセス要素によって、表 SECURITY が索引 SEC_INDUSTRY を使用してアクセスしなければならないことを指定します。 XISCAN 要素が INDEX 属性を使用して索引名を指定しなかった場合、オプティマイザーは最小のコストで XML データの索引を使用して、表 SECURITY にアクセスします。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables"> 
  <STMTKEY SCHEMA="ST">
    SELECT *
    FROM security 
    WHERE XMLEXISTS('$SDOC/Security/SecurityInfo
      /StockInfo[Industry= "OfficeSupplies"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <XISCAN TABLE='SECURITY' INDEX='SEC_INDUSTRY'/>
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

XANDOR アクセスで XML データの索引を使用するためのガイドライン

以下の最適化プロファイルのガイドラインでは、XANDOR 要素は、XML データのすべての適用可能な索引の XANDOR プランを使用して表 SECURITY にアクセスすることを指定します。 XANDOR プランはリレーショナル索引を使用できないので、リレーショナル索引は使用されません。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Date"> 
  <STMTKEY SCHEMA="STBD">
    SELECT *
    FROM security 
    WHERE trans_date = CURRENT DATE
      AND XMLEXISTS('$SDOC/Security/SecurityInfo
           /StockInfo[Industry= "Software"]')
      AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <XANDOR TABLE='SECURITY' /> 
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

IXAND で XML データの指定された複数の索引を使用するためのガイドライン

以下の最適化プロファイルでは、最適化ガイドラインの IXAND 要素は、XML データの 2 つの索引、SEC_INDUSTRY と SEC_SYMBOL を使用して表 SECURITY にアクセスすることを指定します。 オプティマイザーは IXAND プランを生成します。このプランでは、リストされている順序で IXAND プランのレグとして 2 つの索引が使用されます。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Date"> 
  <STMTKEY SCHEMA="STBD">
    SELECT *
    FROM security 
    WHERE trans_date = CURRENT DATE
      AND XMLEXISTS('$SDOC/Security/SecurityInfo
          /StockInfo[Industry= "Software"]')
      AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <IXAND TABLE='SECURITY' TYPE='XMLINDEX'>
      <INDEX IXNAME='SEC_INDUSTRY'/>
      <INDEX IXNAME='SEC_SYMBOL'/> 
    </IXAND> 
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

IXAND で XML データのすべての索引を使用するためのガイドライン

以下の最適化プロファイルでは、最適化ガイドラインの IXAND 要素は、すべての適用可能なリレーショナル索引と XML データの索引を使用して表 SECURITY にアクセスすることを指定します。 TRANS_DATE にリレーショナル索引があり、SEC_INDUSTRY と SEC_SYMBOL には XML データの索引があるとして、オプティマイザーが選択した順序でこれら 3 つの索引すべてはともに ANDing されます。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Date"> 
  <STMTKEY SCHEMA="STBD">
    SELECT *
    FROM security 
    WHERE trans_date = CURRENT DATE
    AND XMLEXISTS('$SDOC/Security/SecurityInfo
         /StockInfo[Industry= "Software"]')
    AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <IXAND TABLE='SECURITY' TYPE='XMLINDEX' ALLINDEXES='TRUE' />
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

IXAND で XML データの特定の先行索引を使用するガイドライン

以下の最適化プロファイルでは、最適化ガイドラインの IXAND 要素は、IXAND プランを使用して表 SECURITY にアクセスしなければならず、XML データの索引 SEC_INDUSTRY は IXAND 内の最初の索引でなければならないことを指定します。 オプティマイザーは、コスト・ベースの方式で、IXAND プラン用の追加の索引を選出します。 リレーショナル索引が列 TRANS_DATE で使用可能で、XML データの索引がパス SYMBOL で使用できる場合には、オプティマイザーによって有用であると判断されると、これらの索引の片方または両方が IXAND プランの追加レグとして表示されます。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Date"> 
  <STMTKEY SCHEMA="STBD">
    SELECT *
    FROM security 
    WHERE trans_date = CURRENT DATE
      AND XMLEXISTS('$SDOC/Security/SecurityInfo
             /StockInfo[Industry= "Software"]')
      AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <IXAND TABLE='SECURITY' TYPE='XMLINDEX' INDEX='SEC_INDUSTRY' /> 
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

ある XML 索引アクセスを使用するためのガイドライン

以下の最適化プロファイルのガイドラインは、表 SECURITY にアクセスするためにある XML データの索引を使用することだけを指定します。 オプティマイザーは、コスト・ベースの分析を使用して、XISCAN、IXAND、XANDOR、または IXOR プランを使用します。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables"> 
  <STMTKEY SCHEMA="ST">
     SELECT *
     FROM security 
     WHERE XMLEXISTS('$SDOC/Security/SecurityInfo
            /StockInfo[Industry= "OfficeSupplies"]')
  </STMTKEY>
  <OPTGUIDELINES>
     <ACCESS TABLE='SECURITY' TYPE='XMLINDEX' />
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

すべての適用可能な XML データの索引アクセスを使用するためのガイドライン

以下の最適化プロファイルのガイドラインは、SECURITY 表のすべての適用可能な索引を使用することを指定します。 方式の選択はオプティマイザーが行います。 XMLEXISTS 内の 2 つの述部が一致する、XML データの 2 つの索引 SEC_INDUSTRY と SEC_SYMBOL が作成されたと想定します。 オプティマイザーは、XANDOR プランか IXAND プランのどちらかを使用することを選択します。 オプティマイザーは、コスト・ベースの分析を使用して 2 つのアクセス・プランのいずれかを選択します。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables 2"> 
  <STMTKEY SCHEMA="ST2">
    SELECT *
    FROM security 
    WHERE XMLEXISTS('$SDOC/Security/SecurityInfo
             /StockInfo[Industry= "Software"]')
    AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <ACCESS TABLE='SECURITY' TYPE='XMLINDEX' ALLINDEXES='TRUE' />
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

特定の索引を使用する、XML データに対する索引アクセスを指定する場合のガイドライン

以下の最適化プロファイルのガイドラインは、少なくとも SEC_INDUSTRY 索引を使用して表 SECURITY にアクセスすることを指定します。 オプティマイザーは、コスト・ベースの分析を使用して、以下のいずれかのアクセス・プランを選出します。
  1. SEC_INDUSTRY 索引を使用する XISCAN プラン。
  2. IXAND プランの最初のレグとして指定された索引を使用する IXAND プラン。 オプティマイザーは、コスト・ベースの分析に基づいて、IXAND プランでさらに索引を使用する場合があります。 この例では、リレーショナル索引が列 TRANS_DATE で使用可能な場合、オプティマイザーによって有用であると判断されると、その索引が IXAND プランの追加レグとして表示されます。
  3. 指定の索引と、他の適用可能な XML データの索引を使用する XANDOR プラン。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Date"> 
  <STMTKEY SCHEMA="STBD">
    SELECT *
    FROM security 
    WHERE trans_date = CURRENT DATE
      AND XMLEXISTS('$SDOC/Security/SecurityInfo
             /StockInfo[Industry= "Software"]')
      AND XMLEXISTS('$SDOC/Security/Symbol[.="IBM"]')
  </STMTKEY>
  <OPTGUIDELINES>
    <ACCESS TABLE='SECURITY' TYPE='XMLINDEX' INDEX='SEC_INDUSTRY' /> 
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>
以下の最適化ガイドラインは、コスト・ベースの分析を使用して、以下のいずれかのアクセス・プランを使用するように指定します。
  • SEC_INDUSTRY 索引と SEC_SYMBOL 索引を指定の順序で用いる IXAND プランを使用します。
  • すべての適用可能な XML 索引を用いる XANDOR プランを使用します。
  <OPTGUIDELINES>
    <ACCESS TABLE='SECURITY' TYPE='XMLINDEX'>
      <INDEX IXNAME='SEC_INDUSTRY'/>
      <INDEX IXNAME='SEC_SYMBOL'/>
    </ACCESS>
  </OPTGUIDELINES>

結合順序を制御し、XML データの索引アクセスを指定するためのガイドライン

以下の最適化プロファイルの最適化ガイドラインには、2 つの要素が含まれています。 最初のガイドライン要素は、FROM 節内の表が結合される際に表 CUSTACC が最外部の表になり、ある XML データの索引アクセスを使用して表 CUSTACC にアクセスしなければならないことを指定します。 2 番目のガイドライン要素は、XANDOR プランを使用して表 ORDER にアクセスすることを指定します。 オプティマイザーは、XANDOR プラン内ですべての適用可能な XML データの索引を使用します。 索引の順序はオプティマイザーによって選択されます。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Order and Security Tables"> 
  <STMTKEY SCHEMA="OST">
     SELECT ordqty, orddate, ordid, security, lasttrade 
     FROM order, security, custacc,
       XMLTABLE('$ODOC/FIXML/Order' 
          COLUMNS ordid VARCHAR(10) PATH '@ID', 
                  orddate date PATH '@TrdDt', 
                  ordqty float PATH 'OrdQty/@Qty') AS T1, 
       XMLTABLE(' $SDOC/Security' 
          COLUMNS security varchar(50) PATH 'Name', 
                  lasttrade float PATH 'Price/LastTrade') AS T2 
       WHERE XMLEXISTS('
         $SDOC/Security[Symbol/fn:string(.) 
             = $ODOC/FIXML/Order/Instrmt/@Sym/fn:string(.)]') 
       and XMLEXISTS(
         '$ODOC/FIXML/Order[@Acct/fn:string(.) 
              = $CADOC/Customer/Accounts/Account/@id/fn:string(.)]') 
        and XMLEXISTS('$CADOC/Customer[@id = 1011]') 
       ORDER BY ordqty desc
  </STMTKEY>
  <OPTGUIDELINES>
      <ACCESS TABLE='CUSTACC' TYPE='XMLINDEX' FIRST='TRUE' /> 
      <XANDOR TABLE='ORDER' /> 
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

XQuery 式のガイドライン

以下の最適化プロファイルには、表 SECURITY1 からソフトウェア (Software) を扱う会社の在庫情報を戻す XQuery 式が含まれます。 このガイドラインは、1 つの XML 索引 XI1 を使用して表にアクセスすることを指定します。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Industry"> 
  <STMTKEY SCHEMA="STBD">
    xquery
    for $sinfo1 in db2-fn:xmlcolumn("SECURITY1.SDOC")/Security/SecurityInfo
        /StockInfo[Industry="Software"]
    return $sinfo1
  </STMTKEY>
  <OPTGUIDELINES>
    <XISCAN TABLE='SECURITY1' INDEX='XI1'/>
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>

以下の最適化プロファイルには、ソフトウェア (Software) と電子機器 (Electronics) を扱う会社の在庫情報を戻す XQuery 式が含まれます。

このガイドラインは、表 SECURITY2 は結合の外部表で、XML データの索引 XI2 を使用して SECURITY2 表にアクセスしなければならないことを指定します。 またこのガイドラインは、表 SECURITY1 は結合の内部表で、XML データの索引 XI1 を使用して SECURITY1 表にアクセスしなければならないことも指定します。
<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Security Tables by Industry"> 
  <STMTKEY SCHEMA="STBD">
    <![CDATA[ xquery
     for $sinfo1 in db2-fn:xmlcolumn("SECURITY1.SDOC")/Security
          /SecurityInfo/StockInfo[Industry="Software"]
     for $sinfo2 in db2-fn:xmlcolumn("SECURITY2.SDOC")/Security
          /SecurityInfo/StockInfo[Industry="Electronics"]
     where $sinfo1 = $sinfo2
     return <stock> {$sinfo1} </stock> ]]>
  </STMTKEY>
  <OPTGUIDELINES>
    <JOIN> 
      <ACCESS TABLE='SECURITY2' TYPE='XMLINDEX' INDEX='XI2'/>
      <ACCESS TABLE='SECURITY1' TYPE='XMLINDEX' INDEX='XI1'/>
    </JOIN>
  </OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>
CDATA セクションは < で始まります。[CDATA [and ending with]] > は、ステートメント・キーを STMTKEY エレメントで囲みます。これは、ステートメント・キーに特殊 XML 文字 < および> が含まれているためです。 プロファイル・パーサーは CDATA セクション内の XML タグを無視しますが、オプティマイザーは引き続きステートメント・キー全体を使用して、ステートメント・プロファイルをアプリケーション内の対応するステートメントと突き合わせます。