この章では、ラージ・オブジェクト(LOB)の概要と、LOBデータ型をアプリケーション開発に使用する方法について説明します。この章の内容は次のとおりです。
ラージ・オブジェクト(LOB)とは、大量のデータを保持するように設計されたデータ型のセットです。LOBには、データベースの構成に応じて最大サイズが8から128TBのデータを保持できます。データをLOBで格納すると、アプリケーションで効率的にアクセスして操作できます。
この項では、アプリケーション開発時に使用する各種のデータを紹介し、ラージ・オブジェクトに適したデータの種類について説明します。
現在のアプリケーションでは、次の種類のデータを扱う必要があります。
単純な構造化データ
この種のデータは、ビジネス・ルールに基づいて構築された単純な表に編成できます。
複雑な構造化データ
この種のデータは複雑な性質を持つため、コレクション型、REF型およびユーザー定義型など、Oracleデータベースのオブジェクト・リレーショナル機能に適しています。
半構造化データ
この種のデータは、通常はデータベースで解析されない論理構造を持っています。たとえば、アプリケーションや外部サービスで処理されるXML文書は、半構造化データとみなせます。アプリケーションで半構造化データを処理できるように、データベースにはOracle XML DB、アドバンスト・キューイングおよびメッセージなどのテクノロジが用意されています。
非構造化データ
この種のデータは、小さい論理構造に分解されることがなく、通常はデータベースやアプリケーションで解析されません。たとえば、バイナリ・ファイルとして格納されたフォト・イメージは、非構造化データです。
ラージ・オブジェクトは、最後の2種類のデータ、つまり半構造化データおよび非構造化データに適しています。ラージ・オブジェクト機能を使用すると、データベースからアクセスするオペレーティング・システム・ファイルのみでなく、データベースにもこの種のデータを格納できます。
インターネットおよびコンテンツ・リッチなアプリケーションの普及に伴い、データベースでは、次のことを実現するためのデータ型のサポートが不可欠になっています。
非構造化データと半構造化データの効率的な格納
大量のデータの最適化
データベースの内外に格納されたデータにアクセスするための一定の方法の提供
半構造化データの例には、XML文書やワード・プロセッサ・ファイルなどのドキュメント・ファイルがあります。この種のドキュメントの場合、データはアプリケーションで処理または解析される論理構造に含まれており、データベースへの格納時に小さい論理単位に分解されることはありません。
通常、半構造化データが関係するアプリケーションは、大量の文字データを使用します。キャラクタ・ラージ・オブジェクト(CLOB
)データ型と各国語キャラクタ・ラージ・オブジェクト(NCLOB
)データ型は、この種のデータの格納と操作に理想的です。
文字データは、バイナリ・ファイル・オブジェクト(BFILE
データ型)にも格納できます。BFILE
を使用して、オペレーティング・システム・ファイルからCLOB
またはNCLOB
インスタンスに読取り専用データをロードし、アプリケーションで操作できます。
非構造化データが標準コンポーネントに分解されることはありません。たとえば、従業員に関するデータは、文字列として格納される名前、ID番号などの識別子および給与などに構造化できます。これに対して、写真データは1と0(ゼロ)の長いストリームで構成されます。これらのビットは、ディスプレイで写真を見られるようにピクセルのオンとオフの切り替えに使用されますが、データベース記憶域に関しては、それより細かい構造に分解されることはありません。
また、テキスト、図形イメージ、静止ビデオ・クリップ、フル・モーション・ビデオおよびサウンド・ウェーブフォームなどの非構造化データは、サイズが大きくなる傾向があります。従業員レコードは通常、数百バイトですが、マルチメディア・データは、わずかであってもその何千倍もの大きさになる場合があります。
SQLデータ型は、BLOB
データ型(バイナリ・ラージ・オブジェクト)やBFILE
データ型(バイナリ・ファイル・オブジェクト)を含む大量の非構造化バイナリ・データに理想的です。
データベースでは、LONGデータ型およびLOBデータ型をサポートしています。LOBの方がメリットが多いため、可能な場合は、LONGではなくLOBを使用するように既存のアプリケーションを変更してください。LONGからLOBへ移行すると、LONG列にアクセスしている既存のアプリケーションを簡単に移行してLOB列を使用できます。
バージョン7以前のOracle Database用に開発されたアプリケーションでは、非構造化データを大量に格納するためにLONGまたはLONG RAWデータ型を使用していました。
Oracle8i以上のデータベースでは、大量の構造化および半構造化データの格納にLOBデータ型の使用をお薦めします。LOBデータ型には、LONG型およびLONG RAW型と比較して次のようなメリットがあります。
LOB容量: LOBには、はるかに大量のデータを格納できます。LOBには、システム構成に応じて4GB以上のデータを格納できます。LONG型とLONG RAW型では、データは2GBに制限されます。
表当たりのLOB列数: 1つの表は複数のLOB列を持つことができます。1つの表の各LOB列には、任意のLOB型を使用できます。Oracle Databaseリリース7.3以上では、表は1つのLONG列またはLONG RAW列に制限されます。
ランダムなピース単位のアクセス: LOBはデータへのランダム・アクセスをサポートしますが、LONGでサポートされるのは逐次アクセスのみです。
LOBはオブジェクトの属性にもなります。
各種のLOBは、データベースまたは外部ファイルに格納できます。
注意: データベース内のLOBを、内部LOBまたは内部永続LOBと呼ぶこともあります。 |
データベース内のLOBは、領域が最適化され効率的なアクセスが可能になるような形でデータベース表領域に格納されます。内部LOBの宣言がサポートされているSQLデータ型は、BLOB
、CLOB
、およびNCLOB
です。これらのデータ型の詳細は、「ラージ・オブジェクト・データ型」を参照してください。
永続LOBと一時LOB
内部LOB(データベース内のLOB)には、永続LOBと一時LOBがあります。永続LOBとは、データベースの表の行に存在するLOBインスタンスです。一時LOBは、ローカル・アプリケーションの有効範囲内でのみLOBをインスタンス化する場合に作成されます。
一時インスタンスを表の行に挿入すると、通常のインスタンスになります。
永続LOBは、コピー・セマンティクスを使用し、データベース・トランザクションに参加します。トランザクションまたはメディアに障害が発生した場合は永続LOBをリカバリでき、永続LOB値に対する変更はすべてコミットまたはロールバックできます。つまり、データ・オブジェクトの使用に関連するすべてのACID (原子性、一貫性、独立性、耐久性)プロパティは、永続LOBの使用に関連します。
外部LOBは、データベース表領域の外にあるオペレーティング・システム・ファイルに格納されるデータ・オブジェクトです。データベースは、SQL BFILE
データ型を使用して外部LOBにアクセスします。BFILE
データ型は、唯一の外部LOBデータ型です。
BFILE
は読取り専用データ型です。データベースでは、BFILE
に格納されているデータに対する読取り専用のバイト・ストリーム・アクセスが可能です。アプリケーション内でBFILEに書き込むことはできません。
データベースは、BFILE
列で参照セマンティクスを使用します。BFILE
型の表列に格納されたデータは、データベース表領域ではなくオペレーティング・システム・ファイルに物理的に置かれます。
通常、BFILE
は次のデータの格納に使用します。
図形など、アプリケーションの実行中に変化しないバイナリ・データ
後で操作できるようにBLOB
やCLOB
のような他のラージ・オブジェクト型にロードされるデータ
マルチメディアなど、バイト・ストリーム・アクセスに適したデータ
比較的サイズの大きい読取り専用データ(データベース表領域の大量使用を回避するため)
ハード・ディスク・ドライブ、CD-ROM、PhotoCDおよびDVDなど、オペレーティング・システムからアクセスする任意のストレージ・デバイスにBFILE
データを保持できます。データベースでは、オペレーティング・システムが、これらのオペレーティング・システム・ファイルへのストリーム・モード・アクセスをサポートしている場合、BFILE
にアクセスできます。
注意: 外部LOBは、トランザクションには関係ありません。LOBの整合性および耐久性は、OSで管理されるファイルシステムによってサポートされる必要があります。 |
LOBインスタンスはロケータと値を持ちます。LOBロケータは、LOB値が物理的に格納されている場所への参照です。LOB値は、LOBに格納されているデータです。
LOBをパラメータ渡しなどの操作に使用する場合、実際にはLOBロケータを渡すことになります。ほとんどの場合、LOBロケータのセマンティクスに関係なく、アプリケーションでLOBインスタンスを操作できます。一部のプログラミング言語でのポインタとは異なり、LOBロケータを間接参照する必要はありません。
LOBロケータのセマンティクスとLOB値の格納方法については、いくつかの考慮事項があります。詳細は、このマニュアル全体の該当する箇所で説明しています。
どのプログラム環境でも、内部LOBと外部LOBのデータベース・セマンティクスには次のような違いがあります。
表1-1 に、データベースでサポートされる各ラージ・オブジェクト・データ型と、各データ型が使用される典型的なデータの種類を示します。この表に示されているデータ型名は、データベースで提供されるSQLデータ型です。通常、この表とこのマニュアルの他の部分に記載されているデータ型の説明は、他のプログラム環境で提供される対応するデータ型にも適用されます。また、LOBという用語は、通常はすべてのラージ・オブジェクト・データ型の集合を指すことに注意してください。
表1-1 ラージ・オブジェクト・データ型
SQLデータ型 | 説明 |
---|---|
バイナリ・ラージ・オブジェクト すべての種類のデータがバイナリ形式で格納されます。通常は、イメージ、オーディオおよびビデオなどのマルチメディア・データに使用します。 |
|
キャラクタ・ラージ・オブジェクト 文字列データがデータベース・キャラクタ・セット形式で格納されます。データベース・キャラクタ・セットを使用する大きい文字列またはドキュメント専用です。データベース・キャラクタ・セットの文字は固定幅形式です。 |
|
各国語キャラクタ・セット・ラージ・オブジェクト 文字列データが各国語キャラクタ・セット形式で格納されます。各国語キャラクタ・セットを使用する大きい文字列またはドキュメントに使用します。可変幅形式の文字がサポートされます。 |
|
外部バイナリ・ファイル ホスト・オペレーティング・システムのファイルシステム内でデータベースの外部に格納される、データベース表からアクセス可能なバイナリ・ファイルです。
|
LOBデータ型は、オブジェクト・データ型のフィールドまたはメンバーとして宣言できます。たとえば、オブジェクト型でCLOB
型の属性を持つことができます。通常、LOB列内のLOBインスタンスの使用方法と、オブジェクト・データ型のメンバーであるLOBインスタンスの使用方法に違いはありません。使用方法の違いについては、該当する場合に説明します。このマニュアルでは、LOB属性はオブジェクト・データ型のメンバーであるLOBインスタンスを指します。特に明記しないかぎり、LOB列の説明はLOB属性にも該当します。
LOBを使用して他のユーザー定義のデータ型を作成したり、他のデータ型をLOBとして格納できます。この項では、LOB型を使用して格納または作成するデータ型の例として、データベースで提供される一部のデータ型について説明します。
次の使用例で表を作成すると、データベースではVARRAY
型のインスタンスがLOBの配列として格納されます。
VARRAYの記憶域句(VARRAY varray_item STORE AS
)を指定せず、宣言したVARRAYデータのサイズが4000バイトを超える場合。
STORE AS LOB句(VARRAY varray_item STORE AS LOB ...
)を使用してVARRAY列のプロパティを指定した場合。
LOBデータ型を使用して他のデータ型を格納する方法のよい例が、XMLType
データ型です。XMLType
データ型はCLOB
として格納される場合があります。XMLType
データ型をCLOB
として格納するように表または列を設定すると、データベースにスキーマをほとんど使用しないXML文書を格納できます。
関連項目:
|
Oracle Multimediaでは、LOBデータ型を使用して、MultimediaのORDAudio、ORDDoc、ORDImageおよびORDVideoなど、マルチメディア・アプリケーション用に特化されたデータ型が作成されます。Oracle Multimediaはデータベースのインフラストラクチャを使用して、オブジェクト型、メソッド、およびデータベースにこの特定の型のデータを表すために必要なLOBを定義します。
関連項目:
|