バイナリXMLおよびXMLIndexを使用した、非構造化XMLデータソースの集計と問合せ

目的

このチュートリアルでは、Oracle XML DBのバイナリXML記憶域モデル、XMLIndex、XQuery、SQL/XML、およびそのほかの多くの主要機能を使用して、非構造化XMLデータソースの集計および問合せをおこなう方法について説明します。

所要時間

約1時間半

トピック

このチュートリアルでは、以下のトピックについて説明します。

 概要
 前提条件
 環境変数の設定
 新規ユーザーの作成と必要な権限の付与
 RSSフィードに関する情報を格納する表の作成
 RSSニュース項目を格納する表の作成
 ニュース項目へのXMLIndexの作成
 多様なニュース・フィードからのニュース項目を集計および正規化したRSSビューの作成
 Firefox 2.0ブラウザでの正規化されたRSSフィードの読取り
 マシンのクリーンアップ
 まとめ

スクリーンショットの表示

 このアイコンの上にカーソルを置くと、 このチュートリアルのすべてのスクリーンショットがロードされて、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)

注: 各手順に関連したスクリーンショットのみをロードして表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。

概要

Oracle Database 11g XML DBには、高パフォーマンスの記憶域と、構造化および非構造化XMLドキュメントの検索を実現するために、新しいバイナリXML記憶域モデル、新しいXMLIndex索引、およびそのほか多くの重要な機能が導入されています。 このチュートリアルでは、実際のRSSフィード・アグリゲータのユースケースを使用して、その多様性および高いパフォーマンス能力を確認します。

バイナリXML記憶域モデル
バイナリXMLは、既存の構造化(オブジェクト・リレーショナル)記憶域および非構造化( CLOB)記憶域の長所ををかけ合わせた、 XMLType抽象データ型の新しい記憶域モデルです。 バイナリXML記憶域では、非構造化記憶域よりも効率的なデータベースの格納、更新、索引付け、およびフラグメントの抽出が実現できます。 非構造化記憶域よりも優れた問合せのパフォーマンスを提供できるので、XML解析のボトルネックに困ることはありません(バイナリXML記憶域では、XML文書をXML解析済みデータとして永続化します)。 構造化記憶域と同様、バイナリXML記憶域はXMLスキーマのデータ型を認識することができるので、ネイティブなデータベースのデータ型として活用できます。 非構造化記憶域と同様、データベースの挿入中または検索中にXML文書全体を変換する必要はありません。 構造化記憶域と同様、バイナリXML記憶域では、部分更新が可能です。 バイナリXMLデータはアプリケーションからも解析済みのフォーマットとして使用できるので、効率的なXML交換手段として使用できます。また、データベースレイヤーでXML文書を再構築する必要がないので、データベースでの負荷が軽減し、多くの場合、システム全体のパフォーマンスを向上できます。 バイナリXMLデータは、非構造化記憶域と同様にXML文書のタグの出現順序を保持します。 また、バイナリXML記憶域では構造化記憶域と同様に、処理効率化のためにXML文書のデータ本体とそのタグ構造をデータベース・レベルで分割します。 一方で、非構造化記憶域と同様に、XML文書のデータとタグ構造は1つ1つのXML文書内に混在しているので、バイナリXML記憶域に存在するXML文書のインスタンス構造はさまざまです。 バイナリXML記憶域では、構造化記憶域モデルでは多くのデータベース表とデータベース結合の使用を必要とするような非常に複雑な可変データを使用できます。 ほかの XMLType記憶域モデルとは異なり、XMLスキーマが事前にわからない場合でもXMLスキーマ・ベースのデータにバイナリ記憶域を使用できます。また、同じ表に複数のXMLスキーマを格納し、共通の要素間での問合せを実行できます。

バイナリXML記憶域モデルと非構造化XML記憶域モデルのXMLIndex索引付け
Bツリー索引は、構造化記憶域で効果的に使用できます。 索引で指定したオブジェクトに対して直接効果を発揮します。 ただし、Bツリー索引は、バイナリXMLまたは CLOBインスタンスに格納されたXML文書の詳細な構造(要素と属性)を処理する場合は、効果的ではありません。 バイナリXMLモデルと非構造化記憶域モデルには、XMLIndexが効果的です。 各XML要素または属性を表す特定の列に定義するBツリー索引とは異なり、 XMLIndex索引は非常に汎用的です。 XMLIndexでの索引付けは、XMLデータに対するすべてのXPath表現に適用できます。 XMLIndex索引には、ほかの索引方式と比較して、以下の利点があります。

XMLIndex索引は、SQL/XML関数の XMLExists() 、XMLTable() 、およびXMLQuery() に使用できます。また、問合せのどの部分にも有効で、WHERE 句での使用に限定されません。 これは、XMLIndex以外の索引では実現できません。
XMLIndexは、 SELECT句のデータおよび FROM句のデータへのアクセスの高速化に特に有効です。
問合せに使用されるXPath式についても、XPath式のほかに特別な事前知識は必要ありません。 XMLIndexは、ファンクション索引とは異なり、非常に汎用的です。
XMLIndex索引は、XMLスキーマの有無に関わらず使用できます。 また、バイナリXML記憶域モデルおよび非構造化記憶域モデルで使用できます。 これに対し、Bツリー索引は、オブジェクト・リレーショナル(構造化記憶域)に格納されるXMLスキーマ・ベースのデータにのみ効果的で、バイナリXMLまたは CLOBインスタンスに格納されるXMLスキーマ・ベースのデータには効果がありません。
XMLIndex索引を使用して、コレクション(XML文書内で何度も発生するノード)を対象とするXPath式を検索できます。 これは、ファンクション索引では実現できません。

Oracleデータベース・ネイティブXQuery
XQueryがW3C標準になり、IT業界では、XMLおよびXQueryをビジネスで採用し始めました。 商用データベース・テクノロジーの革新的なリーダーとして、Oracle Database 11gは、Oracleデータベース・サーバーと統合されている、すべての機能を備えたネイティブXQueryエンジンを提供しています。 SQL側では、SQL/XML標準で、SQLでXMLをカプセル化し、XQueryによるXML文書への問合せを統合する方法が定義されています。 これは、 XMLQuery()、 XMLTable()、 XMLExists()、および XMLCast()といったXQueryを使用してXML値およびSQL値を操作する新しいSQL関数を導入することで実現されています。 Oracle Database 11gでは、これらのSQL標準関数を介してデータベース・サーバーのXQueryサポートを実現しています。 新しいXQUERYコマンドは、ユーザーがコマンドラインでXQuery式を入力できるように、SQL*Plusにも実装されています。 Oracle Database 11gにXQueryが標準ベースで実装されたことで、アプリケーション開発者は、お気に入りのAPI(JDBC、ODP.NET、Webサービスなど)を使用して、Oracle Database XQuery機能を利用できるのです。

Oracle XQueryの利点
構造化記憶域モデル、非構造化記憶域モデル、およびバイナリXML記憶域モデルのそれぞれに適した索引付けをしてSQL/XML XQuery関数を使用することで、Oracle XML DBは、異なる記憶域モデルで統一されたXML問合せにより、XML問合せの際のDOMベースのXML解析評価を大きく上回るパフォーマンスを実現します。 また、XML問合せは、SQLリレーショナル問合せとシームレスにマージして、すべての問合せシナリオを処理できます。さらにOracle XML DBのXML問合せ機能は、信頼性、可用性、拡張性が高く非常にセキュアな業界最高のリレーショナル・データベースの強固な基盤に基づいて構築されているのです。 つまり、Oracle Database 11gのXML DBの問合せ機能は、多様性、拡張性、同時実行性、および高い性能が求められるXMLアプリケーションのための、もっとも包括的かつ効率的な機能です。

トピック・リストに戻る

前提条件

このチュートリアルを始める前に以下を確認してください。

1. Oracle Database 11gがインストールされていること。
2.

Firefoxの最新ブラウザ(バージョン2.0以降)を ここからダウンロードして、インストールしてあること。

: DLLファイルが不足しているため、Firefox 3.0 for Linuxはインストールできても、開くことができません。

3.

Oracle SQL Developerを OTNからダウンロードして、インストールしてあること。

4.

BinaryXML.zipファイルをダウンロードして、作業ディレクトリ(wkdirなど)に解凍してあること。

トピック・リストに戻る

環境変数の設定

このOracle by Example(OBE)をLinuxで実行している場合は、以下の手順を実行して環境変数を設定します。

1. 端末ウィンドウを開きます。

 

2.

環境変数 LD_LIBRARY_PATHを設定します。たとえば、使用している ORACLE_HOME が/u01/app/oracle/product/11.1.0/db_1 の場合は、次のように設定します。

ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib

 

トピック・リストに戻る

新規ユーザーの作成と必要な権限の付与

以下の手順を実行して、新規ユーザーを作成し、Oracle Database 11gの新しいセキュリティ・メカニズムを使用して、新規ユーザーにインターネットへのアクセス権限を付与します。

1.

systemユーザーとして接続します。

  1. Oracle SQL Developerを開きます。
  2. Connectionsタブで、「 New Connection」を選択します。

  1. 以下の詳細情報を設定して、新しい接続 systemを作成します。

    Connection Name: system
    Username: system
    Password: oracle
    Save Password」チェック・ボックスにチェックを入れます。
    Role: default

    テストして、システムに接続します。

 

2.

Execute script」ボタンをクリックして、スクリプト 1_1_CreateUser.sqlを開いて実行します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

3. 1_2_httpAccessPriv.sqlを実行して、新しいインターネット・アクセス制御リスト(ACL)を作成し、新しいユーザーに割り当てます。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

トピック・リストに戻る

RSSフィードに関する情報を格納する表の作成

RSS(Real Simple Syndication)フィードは、多数あるRSS形式の中のXML文書を指すURLです。 RSSフィードのXML文書には、ニュース項目が含まれています。 この項では、購読したRSSフィードに関する情報を格納する表を作成します。

1.

スクリプト 2_1_CreateFeedsTable.sqlを実行して、新しい rssfeeds表を作成します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

2.

スクリプト 2_2_InsertFeeds.sqlを開いて実行し、ニュース・フィードのリストを rssfeeds表に挿入します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

3.

スクリプト 2_3_VerifyFeeds.sqlを開いて実行し、ニュース・フィードのリストが挿入されたことを確認します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

トピック・リストに戻る

RSSニュース項目を格納する表の作成

ニュース項目を表すさまざまなXML構造には、異なるRSS形式が使用されます。 このタイプの非常に可変性のあるXML構造は、バイナリXML記憶域モデルでの格納にもっとも適しています。 バイナリXML記憶域モデルをSECUREFILE LOB記憶域形式とともに活用することで、記憶域領域を削減すると同時に、パフォーマンスを向上できます。

1.

スクリプト 3_1_CreateRSSItemsTable.sqlを実行して、新しい newsItemsTableを作成します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

"仮想列"を作成することで一意制約を設定できます。 また、Oracle XML DBが、さまざまなRSS形式で定義されている異なる名前空間をどのように処理するかにも注目してください。

2.

3_2_InsertRSSItems.sqlを開きます。 インターネットにプロキシ・サーバーを介してアクセスしているかどうかによって、 utl_http.set_proxy()コールのパラメータを変更するためのスクリプトを修正します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

3.

ここで、 3_2_InsertRSSItems.sqlを実行して、ニュース項目を newsItemsTableに挿入します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

newItemsTableに挿入するために、 XMLTable()関数を使用して、どのようにニュース項目を抽出しているか、スクリプトに注目してください。

 

4.

ニュース項目のタイトルの仮想列に一意制約を設定することで、Oracle XML DBは、ニュース項目のタイトルの一意性を守ることができます。 3_3_InsertTestItems.sqlを実行して、複数の項目タイトルが付いているニュース項目を挿入し、ニュース項目のタイトルに一意制約が存在することを確認できます。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

トピック・リストに戻る

ニュース項目へのXMLIndexの作成

バイナリXML記憶域モデルでニュース項目が格納されている状態で、ニュース項目のタイトルにXMLIndexを作成すると、問合せのパフォーマンスが大幅に向上します。 ニュース項目のタイトルの全文検索を可能にするために、XMLIndexのパス表にセカンダリ・テキスト索引を作成できます。

1.

ユーザー RSSで、スクリプト 4_CreateIndexes.sqlを実行して、ニュース項目のタイトルを指すXPathのサブセットを使用したXMLIndexを作成します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

セカンダリ・テキスト索引も作成されます。 Oracle XML DBが、異なるRSS形式で使用される複数の名前空間を処理する方法に注目してください。

トピック・リストに戻る

多様なニュース・フィードからのニュース項目を集計および正規化したRSSビューの作成

RSS(Real Simple Syndication)アグリゲータの主要な機能は、さまざまなRSS形式を使用する複数のフィードからのニュース項目を集計および正規化する機能です。 この項では、多様なRSS形式を正規化するRSSビューの作成方法について説明します。

1.

スクリプト 5_1_CreateRSSViews.sqlを実行して、多様なRSS形式を使用したニュース項目を正規化するリレーショナル・ビュー newsItemsRelViewを作成します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

SQL文の UNION ALL句で、このビューを作成します。 ニュース項目タイトルの全文検索に、 ora:contains() XQuery関数を使用している点にも注目してください。 多様なRSS形式のニュース・フィードを単一のRSS 2.0形式にするために、XMLTypeビュー newsItemsRSSViewも作成されています。

 

2.

5_2_ExplainRSSViews.sqlを開いて実行し、標準のビューで、SQL/XML問合せが、 XMLIndexおよびセカンダリ・テキスト索引を使用するように問合せが最適化されているか確認します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

3.

5_3_CreateRSSResource.sqlを開いて実行し、多様なRSSフィードからのニュース項目を集計および正規化し、正規化されたRSSフィードを表すOracle XML DBリポジトリ・リソースを作成します。 Select connectionウィンドウで、「 system」を選択して「 OK」をクリックします。

 

トピック・リストに戻る

Firefox 2.0ブラウザでの正規化されたRSSフィードの読取り

RSS 2.0形式の処理が可能なニュース・リーダーは複数あります。 この項では、Firefox 2.0ブラウザを使用して、正規化されたRSSフィードを読み取ります。

1.

以下の詳細情報を設定して、sys接続を作成します。

Connection Name: sys
Username: sys
Password: sysのパスワード
Save Password」チェック・ボックスにチェックを入れます。
Role: sysdba

テストして、sysに接続します。

 

2.

sys接続を右クリックして、「 Open SQL Worksheet」を選択します。 「 Run Script」アイコンをクリックして、以下のコマンドを実行します。 Select connectionウィンドウで、「 sys」を選択して「 OK」をクリックします。

exec dbms_xdb.sethttpport(8080);

select dbms_xdb.gethttpport() from dual;

 

3.

Firefox 2.0ブラウザを開いて、URL http://localhost:8080/home/RSS/news2007.xmlを指定します。 プロンプトが表示されたら、以下の詳細情報を入力します。

Username: system
Password: oracle

複数のニュース・フィードから集計されたニュース項目のリストが表示されます。

注:

  • ニュースは変わるため、ユーザーのスクリーンショットに表示される内容は異なります。
  • Firefox 2.0には、RSS形式のファイルを自動的に変換する機能が組み込まれています。 Firefox 2.0をインストールしていない場合、出力はXMLドキュメントの形式で表示されます。

トピック・リストに戻る

クリーンアップ

1.

ユーザー systemで、スクリプト cleanup.sqlを実行します。

トピック・リストに戻る

まとめ

このチュートリアルで学習した内容は、以下のとおりです。

  • 新規ユーザーの作成と必要な権限の付与
  • RSSフィードに関する情報を格納する表の作成
  • RSSニュース項目を格納する表の作成
  • ニュース項目へのXMLIndexの作成
  • 多様なニュース・フィードからのニュース項目を集計および正規化したRSSビューの作成

トピック・リストに戻る

 このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。