Oracle Database 10g の新しい SQL 性能 正規表現 ... the track name here Oracle Database 10g...
Transcript of Oracle Database 10g の新しい SQL 性能 正規表現 ... the track name here Oracle Database 10g...
Identify the track name here
OOrraaccllee DDaattaabbaassee 1100ggのの新新ししいい SSQQLL性性能能:: 正正規規表表現現、、ネネイイテティィブブ値値、、LLOOBBパパフフォォーーママンンススおおよよびびそそのの他他のの機機能能
Geoff Lee, Oracle Corporation
Peter Linsley, Oracle Corporation
Jonathan Gennick, O'Reilly & Associates
概要
Oracleの SQLエンジンは、すべての Oracle Detabaseアプリケーションの基盤です。Oracle SQLはたえず進化を続け、ま
すます高度化するデータベース・アプリケーションの増加による拡大する要求に応え、新しい標準ベースのコンピュー
ティング・アーキテクチャ、APIおよびネットワーク・プロトコルの使用を可能にします。
Oracle Database 10gにはいくつかの新しい SQL機能が導入されており、このことが、Oracleの実装を、最も広く採用され
る耐久性のあるコンピューティング・スタンダードの 1つとしています。このホワイト・ペーパーでは、Oracle Database
10gで SQLに新たに導入された正規表現、ネイティブ値、LOBパフォーマンス、その他の新しい機能および拡張機能に
ついて、紹介していきます。新たに組み込まれたこれらの SQL性能は、高パフォーマンスかつスケーラブルなライフ・
サイエンス、ビジネス・インテリジェンス、コンテンツ管理、E-Business、その他のデータベース・アプリケーションの
開発には欠くことのできない要素です。
以降の項では、次の各項目を詳しく取り上げます。
• Oracle Database 10gの、SQLに対する IEEE/POSIX標準ネイティブ正規表現サポートの導入。この導入により、デー
タベース内のテキストの検索および操作機能を大幅に刷新しています。正規表現は、厳密に書式化されていない自由
形式のテキストを扱う場合、特に役に立ちます。
• IEEE 754 Standard for Binary Floating-Point Arithmetic(バイナリ浮動小数点演算の IEEE754標準規格)に基づいた、Oracle
Database 10gの新しいネイティブ浮動小数点データ型。このデータ型の採用により、XML標準および Java標準全般に
おける浮動小数点処理パフォーマンスが格段に向上するとともに、必要な記憶領域が大幅に減少します。
• LOBデータ型のパフォーマンスの改善。Oracle Database 10gでは、非構造データを処理できるよう、スタック全体(SQL
レイヤーおよびその API)を通して LOBデータ型のパフォーマンスが大幅に改善されています。
さらに、LOBのサイズ制限は、以前の 4ギガバイトをはるかに上回るテラバイト単位に拡張されました。
• コレクション型の様々な拡張機能。これらの拡張機能により、多様な ANSI SQL標準Multiset型操作と、XML、Java、
ビジネス・インテリジェンスおよび空間データ管理の各アプリケーションで広く使用されるネスト構造データの柔軟
な格納オプションが提供されます。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
1
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
Oracle Regular Expression
正規表現は、テキスト内の一定のパターンを識別する効果的な方法です。識別するテキストをパターンで表現しますが、
これには、3文字の単語といった単純なものから、電子メール・アドレスなどの複雑なものまで使用できます。
正規表現を使用したパターン一致は、あらゆるタイプの文字列操作に適用できます。Webアプリケーションでは、中間
層との間で送受信するデータを検証、解析、操作、書式化する際に正規表現による検索が幅広く活用されています。
また、驚くほど多くの中間層処理で、この文字列処理が利用されています。生物情報工学では、この機能を DNAやプロ
テイン・シーケンスの識別に役立てています。一方、言語学者は、自然言語の調査に正規表現を使用します。メール・サー
バーでの潜在的なスパマーの識別など、サーバー構成はしばしば正規表現の形式で構成されます。おそらく、スパマー自
身も、インターネット・ベースのデータ・ストアから被害者の電子メール・アドレスを簡単に収集するために、正規表現
を使用しているはずです。プロトコル標準や言語標準の多くが、正規表現をフィルタおよび検証の際の構成要素として受
け入れます。つまり、正規表現がもたらす機能性を有効に活用できないアプリケーションなど想像できないということで
す。
Oracle Regular Expressionでは、従来に比べさらに複雑なパターンを表現できる高度なメタキャラクタ・セットを提供しま
す。これらはすべて、SQLおよび PL/SQLで使用可能なデータベースに対しネイティブで、既存のソリューションが持っ
ていた制限が取り払われています。この機能を活用することで、アプリケーションがより効果的に実行されるようになる
だけでなく、データ・フローが改善され、アプリケーション環境がより堅牢になります。
データ・フローの改善
中間層のテクノロジではこれまでも正規表現による検索機能が活用されてきましたが、バックエンド・データベースでの
サポートは、非常に有用であるにもかかわらず、しばしば見過ごされてきました。Oracle Regular Expressionの導入によっ
て、データベース内での文字列操作機能が向上し、任意の層で正規表現ベースの文字列操作を実行できるフレキシビリ
ティがもたらされ、データベースがインターネットにより近いものとなります。
Oracle Regular Expressionは、データの更新や選択、画面表示のための書式化など、様々なデータ操作シナリオで使用でき
ます。次の項では、これらのシナリオについて、データ・フローの観点から説明します。
データベースからクライアントへ
Webアプリケーションでは、データベースからのデータをフィルタし、画面表示用に書式化する必要があるため、正規
表現は特に有用です。たとえば、あるアプリケーションが、XXXXXXXXXXの書式の 10桁数字として CHAR(10)列に
保存されている電話番号を選択するとします。エンド・ユーザーの画面に表示する際は、この列を(XXX)XXX-XXXX
という書式に変換する必要があります。この処理が中間層で行われる場合は、同じデータへアクセスする他のクライアン
トはその書式化のロジックをコピーする必要があります。DBA(データベース管理者)が SQL*Plusを通じて表を問い合
せる場合などでは、ディスクに保存されている以外の書式で表示するには、独自の書式化操作を適用する必要があります。
ただし、これを行うには、データを使用するすべてのクライアントが、データベース内で電話番号がどのように保存され
ているかに関する情報を保持していなければなりません。クライアントでこのような可能性がある場合、バックエンドの
書式を変更するのは難しくなります。
この問題は、REPLACE関数を有効にする正規表現(REGEXP_REPLACE)を使用するデータベース・ビューを作成し、
電話番号を再書式化することで、簡単に解決できます。この中央処理ロジックのおかげで、データを使用するクライアン
トは、単純にビューに対して問合せを行い、再書式化された電話番号を取得できます。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
2
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
正規表現は、クライアントで必要な行の結果セットをフィルタしたり、絞り込むために使用されることがよくあります。
LIKE条件を有効にする正規表現(REGEXP_LIKE)を使用すると、このフィルタ処理をデータベース内のデータに対し
直接実行できます。結果として、ネットワーク・フローが最小限に抑えられ、同時に、データの取得作業がデータベース
の管理下で、まさにその作業に最適な場所において実行されます。このように、複雑なロジックがデータに近い場所で実
行されることにより、エンド・ユーザーが必要としないデータはデータベースから取り出されず、クライアント側の処理
が減少するため、環境がより安定します。
データベースの更新
Oracle Database 10gでは、正規表現の形式で更新を実行できます。これまでは、最も簡単な方法でも、まず問合せセット
を選択し、クライアント内で正規表現ベースの更新を実行してから、その結果をデータベースに書き込む必要がありまし
た。Oracle Database 10gでは、これらの操作をすべて単一の Update文で実行できます。この方法では、データはデータベー
スから取り出されないため、ネットワークの通信量が減少する、セキュリティが強化される、パフォーマンスが向上する
などの利点があります。
クライアントからデータベースへ
クライアントからデータベースへのデータ・フローでは、主に、格納するデータの検証と書式化で正規表現が活用されま
す。
たとえば、クレジット・カードや電子メール・アドレスが一定のパターンと一致するかどうかを検証したり、ユーザーが
入力した電話番号をデータベースでの格納に適した書式に変換するとします。データベースからクライアントへのデー
タ・フローと同様、こうした操作は中間層で行うこともできますが、その場合、このロジックにアクセスできるのは中間
層のクライアントのみになります。
列のデータに必要な書式を正規表現で表す場合、その正規表現自体がデータのプロパティなので、クライアント・ロジッ
クで具体化させる必要がありません。正規表現の形式で列の制約を定義することで、データのソース元が外部のクライア
ントか内部の PL/SQLルーチンかにかかわりなく、一定のパターンに一致するデータのみが表に取り込まれるようになり、
データベースを保護できます。
前述したこれらのシナリオを考えるとき、Oracle Regular Expressionと SQLの組合せが、アプリケーション内の文字列操
作とパターン一致の実行方法を劇的に変える、非常に強力な機能であることがわかります。
Oracle Regular Expression の主な機能
ほとんどの正規表現実装は、ある程度、POSIX標準に規定されている基本正規表現および拡張正規表現(BREおよび ERE)
の動作に基づいています。これらは、しばしば、UNIXスタイルの正規表現と呼ばれます。この標準には拡張の余地が多
くあり、ほとんどの正規表現実装はこれを活用しているため、一般に、各実装は互いに異なっています。
Oracle Regular Expressionが POSIX ERE定義を基礎としているのは、この非互換性のためです。このことによって、同じ
標準に準拠する実装での Oracle Regular Expressionの動作が保証されます。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
3
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
インタフェース
Oracle Regular Expressionは、SQLおよび PL/SQLのいずれでも使用可能な次のインタフェースによって実装されます。
SQL関数 説明
REGEXP_LIKE パターンと一致するかどうかを判定
REGEXP_SUBSTR パターンと一致させる対象の文字列を決定
REGEXP_INSTR 一致が起こった文字列内の位置を判定
REGEXP_REPLACE パターンを検索および置換
有効な引数および構文の詳細は、『SQLリファレンス』の「条件」および「関数」を参照してください。
メタキャラクタ
サポートされている全メタキャラクタのリストは、『SQLリファレンス』の付録 Cを参照してください。ここでは参照
用に一覧してあるだけで、詳細は説明していません。
構文 説明 分類
. 任意の文字に一致 ドット(Dot)
a? 「a」が 0回または 1回一致 数量子(Quantifier)
a* 「a」が 0回または複数回一致 数量子(Quantifier)
a+ 「a」が 1回または複数回一致 数量子(Quantifier)
a|b 「a」または「b」に一致 代替(Alternation)
a{m} 「a」が m回一致 数量子(Quantifier)
a{m,} 「a」が最低 m回一致 数量子(Quantifier)
a{m,n} 「a」が m回と n回の間で一致 数量子(Quantifier)
[abc] 「a」、「b」、「c」のいずれかに一致 ブラケット表現(Bracket Expression)
(…) 式をグループ化 副次式(Subexpression)
\n n番目の副次式に一致 後方参照(Backreference)
[:cc:] ブラケット表現内の文字クラスに一致 文字クラス(Character Class)
[.ce.] ブラケット表現内の照合要素に一致 照合要素(Collation Element)
[=ec=] ブラケット表現内の等価クラスに一致 等価クラス(Equivalence Class)
ロケール・サポート
ロケール・サポートとは、所定のプロパティ(キャラクタ・セット、言語、地域およびソート順序)のもとでの正規表現
の動作のことです。正規表現はテキストのマッチングを行うためのものですが、テキストは常に英語とは限りません。
つまり、あらゆる言語のテキストやキャラクタ・セットを処理する必要があり、そのためにロケール固有のプロパティに
従う必要があります。ほとんどの標準正規表現は、異なるロケールのサポートに関しては曖昧になりがちです。POSIX
でも、ロケールのサポートのために必要な対策を取っているとしていますが、Oracleのロケール定義にはうまく適合しま
せん。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
4
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
Oracle Regular Expressionによるパターン一致では、セッション環境から定義される、基礎にあるロケールが考慮されます。
これは、大文字小文字の区別やアクセントによる区別を行うかどうか、文字が一定範囲内にあることを考慮するかどうか、
どの照合要素を有効とするかなどの、パターン一致機能のあらゆる側面に影響します。たとえば、ドット(.)が現行の
キャラクタ・セットでの 1文字を検出し、データの 1バイトを検出するわけではないことからもわかるように、エンジン
は完全に文字依存です。
Oracle での正規表現の使用
関数の概要
この項では、Oracle Regular Expressionサポートを提供する関数と、その簡単な使用例を紹介します。
関数はすべて同様の形式を持ち、CHAR、VARCHAR2、CLOB、NCHAR、NVARCHARおよび NCLOBの各データ型を
サポートします。
REGEXP_LIKE
REGEXP_LIKE条件は、他の REGEXP関数とは少し異なり、ある文字列内でパターンが一致したかどうかを示すブール
値のみを返します。どのような一致がどこであったかについての詳細は返しません。一致オプションが唯一のオプション
引数で、位置および一致内容はここでは扱われません。
ここで、動詞「fly」の活用形を含む行を検索する式を記述する例を想定してみます。次の正規表現で、「fly」、「flying」、
「flew」、「flown」および「flies」に一致する行を検索できます。
SELECT c1 FROM t1 WHERE REGEXP_LIKE(c1, ‘fl(y(ing)?|(ew)|(own)|(ies))’);
REGEXP_SUBSTR
この関数は、特定のパターンに一致する実際のデータを返します。パターンがどのように一致したかが明確でない場合は、
REGEXP_INSTRを使用して、正確な文字オフセットを取得できます。前述のシナリオを使用すると、次のようになりま
す。
SELECT REGEXP_SUBSTR( ‘the bird flew over the river’, ‘fl(y(ing)?|(ew)|(own)|(ies))’) FROM dual; → flew
REGEXP_INSTR
REGEXP_INSTR関数は、正規表現による検索を実行して、一致した文字の先頭または末尾の位置を返します。
INSTRと異なり、REGEXP_INSTRは、文字列の末尾からは機能しません。戻り値を分析する場合、返された文字件数の
すぐ前の位置に、一致位置を表示すると役立ちます。この関数の結果を他の SQL関数の入力値として使用する場合、値
を同じように解釈するとは限らないため、注意が必要です。戻り値に関する一般的なシナリオは、後で説明します。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
5
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
REGEXP_REPLACE
Oracle Regular Expressionは、一致により検出したパターンを置換える機能と組み合せたとき、その優秀性が最も明確にな
ります。この関数は、正規表現と一致するものを検索し、それを指定したテキスト文字に置換えます。置換えるテキスト
文字には、一致に含まれる副次式への後方参照も含めることができるため、検索操作および置換操作を非常に厳密に制御
できます。
単純な HTML フィルタ
REGEXP_REPLACEを使用すると、データの一部分を簡単にフィルタできます。この例を見ると、HTMLフィルタがい
かに簡単に記述できるかがわかります。
SELECT REGEXP_REPLACE (c1, ‘<[^>]+>’) FROM t1;
後方参照の使用
一致した副次式への参照は置換文字列内で、使用でき、\nとして識別されます(このとき、nは、n番目の副次式の参
照を意味します)。REPLACE式の一部としてバックスラッシュ(\)を指定するには、バックスラッシュを「\\」と
してエスケープする必要があります。
DDL との使用
制約
Oracle Regular Expressionを使用して、制約に基づいて表への入力を許可するデータをフィルタできます。次の例は、
VARCHAR2列でアルファベット文字のみを許可するように列を構成する方法を示しています。
この構成によって、句読記号、数字、空白要素などの表への入力がすべて禁止されます。
CREATE TABLE t1 (c1 VARCHAR2(20), CHECK (REGEXP_LIKE(c1, '^[[:alpha:]]+$'))); INSERT INTO t1 VALUES ('newuser'); → 1 row created. INSERT INTO t1 VALUES ('newuser1'); → ORA-02290:check constraint violated INSERT INTO t1 VALUES ('new-user'); → ORA-02290:check constraint violated
許可するデータに関する記述が列定義と連動し、すべての受信データに対するシールドとして機能するため、データベー
スへの送信前にクライアントでデータをフィルタする必要がありません。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
6
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
索引
普通は、頻繁にアクセスし、簡単に索引付けされる列に索引を作成することで、表へアクセスする時のパフォーマンスを
向上します。Oracle Regular Expressionでは、列内のデータの開始文字を把握している必要があるため、索引があまり簡単
に使用できません。そのため、列を抽象的なパターンで検索する機能にはあまり適していません。ただし、1つの問合せ
内で、1つの列に同じ式が発行されることが予想されるケースでは、機能別索引(functional index)を使用できます。機
能別索引は、次の結果に基づいて作成されます。
CREATE INDEX t1_ind ON t1 (REGEXP_SUBSTR(c1, 'a')); SELECT c1 FROM t1 WHERE REGEXP_SUBSTR(c1, 'a') = 'a';
ビュー
ビューは、問合せサブセットや、エンド・ユーザーへ表示する前のデータの書式化のために、非常に有用なメカニズムで
す。この例では、ビューと正規表現を組み合せることで、データを簡単に再書式化できることを示しています。たとえば、
電子メール・アドレスを、判読可能な状態に保ったまま、自動検出されないように改変する必要があるとします。
この場合、1つの方法として、各文字間にスペースを挿入する方法があります。REGEXP_REPLACEと後方参照を次のよ
うに使用して、各文字の後にスペースが入るように置換できます。
CREATE VIEW v1 AS SELECT empno, REGEXP_REPLACE(email, '(.)', '\1 ‘) email FROM emp; SELECT email FROM v1 WHERE empno = 7369; → j d o e @ s o m e w h e r e . c o m
PL/SQL との使用
Oracle Regular Expressionの関数は SQL文の一部とする必要はなく、PL/SQLの組込み関数として完全にサポートされてい
ます。
1つの例として、指定したデータに対しいくつかの正規表現操作を実行する関数を作成するとします。
この場合、コードは次のようになります。
src := REGEXP_REPLACE (src, ‘<regexp_1>’); src := REGEXP_REPLACE (src, ‘<regexp_2>’); src := REGEXP_REPLACE (src, ‘<regexp_3>’);
PL/SQLは、また正規表現の機能性を高める目的にも使用できます。n番目の副次式を返す関数を作成するために使用で
きる PL/SQLの例を次に示します。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
7
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
CREATE FUNCTION regexp_subx ( input VARCHAR2, regx VARCHAR2, subx NUMBER) RETURN VARCHAR2 IS ret VARCHAR2(4000); BEGIN ret := REGEXP_SUBSTR (input, regx); ret := REGEXP_REPLACE (ret, regx, ‘\’ || subx); RETURN (ret); END regexp_subx; /
パフォーマンスに関する配慮
コンパイルやマッチング・ロジック固有の複雑さが原因となって、正規表現機能を使用して行う処理は非正規表現を使用
した場合に比べて実行速度が遅くなる可能性があります。ある式が供給されると、コンパイラがその文字列を内部書式に
変換する処理を開始します。この処理によって、正規表現が確実にエラーのない、正しく書式化されたものになります。
この処理だけでも、特に、(誤った書式の表現が構成されることがあり得ない)LIKEの引数などの解析と比較した場合、
パフォーマンスに対する負担が大きくなる可能性があります。一方、コンパイルされた正規表現が実行時に非常に最適化
されていると、正規表現機能の実行速度が上がることもあります。これは、特に単一の正規表現をベースにした関数では
なく、数多くの異なる SQL条件内に複雑な正規表現を記述する必要がある場合に、特に当てはまります。正規表現機能
では、通常の索引は使用できないことに留意してください。
REGEXP_LIKEは、コンパイル方法が少し異なります。それは、REGEXP_LIKEの一致が発生した位置は識別せず、パター
ンの一致が文字列内で発生したかどうかの識別のみを行う処理用に最適化されているためです。このため、
REGEXP_LIKEの処理速度は他の正規表現に比べてかなり速く、処理時間の長い他の正規表現機能の事前処理として利用
できます。
Oracle Regular Expressionでは、複数の LIKE文や PL/SQLロジックを必要とする複雑な式の場合、単一の関数内で同じロ
ジックを実行する際は処理速度が大幅に速くなります。ただし、どの程度速くなるかは、使用する正規表現だけでなく、
一致の対象とするデータによっても左右されるため、特定するのは困難です。
正規表現と特定のテキスト・セグメントの組合せによっては、一致の識別を行う対象が膨大な数になり、最悪の場合、す
べての対象を処理した挙句、一致が存在しないこともあります。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
8
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
ネイティブ浮動小数点データ型
Oracle Database 10gでは、2つの新しいネイティブ浮動小数点データ型が導入されています。BINARY_FLOATデータ型お
よび BINARY_DOUBLEデータ型は、それぞれ 32-bit IEEE 754形式および倍精度 64-bit IEEE 754形式で浮動小数点データ
を格納します。Oracle NUMBERデータ型と比較した場合、通常は、BINARY_FLOATおよび BINARY_DOUBLEのほうが、
浮動小数点データに対する算術演算速度が速くなります。また、桁数の多い値は、BINARY_FLOATおよび
BINARY_DOUBLEに格納すると、スペースの節約になります。
BINARY_FLOATデータ型および BINARY_DOUBLEデータ型に対する算術演算(およびデータベースでサポートされてい
る関連クライアント・インタフェース)は、ハードウェア・ベンダーから供給されるネイティブな命令セットにより実行
されます。IEEE 754標準規格に準拠しているため、サポートされているプラットフォーム全体で共通の結果が保証され
ます。さらに、ネイティブ浮動小数点データ型には、次のような多くの特長があります。
binary_floatまたは binary_doubleタイプの列を持つ表を作成できる。 •
•
•
•
•
•
•
•
•
•
選択リストに binary_floatや binary_doubleの列を含めることができる。
binary_float列および binary_double列について索引を作成できる。
binary_float列および binary_double列に対し、集計がサポートされている。
binary_floatおよび binary_doubleは、order by句および group by句でサポートされている。
binary_floatおよび binary_doubleの記憶域は、プラットフォームから独立している。
これまでのリリースでは、Oracle RDBMSでの数値のデータ型は Oracle Numberのみで、すべての算術演算がこのデータ
型を使用して行われています。Oracle Numberには、次のような利点があります。
ソフトウェアに実装されているため、ポータブルである。
10進表記が使用されているため、文字列が数値に変換された場合でも精度が落ちず、丸め処理は 10進値に対し
行われる。この動作は多くのアプリケーションで必要とされます。
RDBMSで 1つの数値型のみを使用するように制限することで、ほとんどの算術演算子および数学関数が多重定
義されない。日付データ型を除き、算術は Oracle Number算術であり、数学関数は Oracle Numberを補助するのみ
です。より多くのデータ型がサポートされると、算術演算子および数学関数が多重定義され、その結果、多重定
義された演算子および関数を解決する規則によって、算術式評価の実装および記述が複雑になります。
ただし、現在のデータベース・アプリケーションでは、Javaや XMLが広く使用されています。これらの言語は、IEEE 754
Standard for Binary Floating-Point Arithmetic(バイナリ浮動小数点演算の IEEE754標準規格)をサポートしています。
さらに、ライフ・サイエンス、OLAP、データ・マイニングなど、多くのデータベース・アプリケーションで、拡張精度
浮動小数点計算が必要とされます。したがって、この新しい数値型が持つ高パフォーマンスで記憶領域の節約にもなる優
れた機能は、多岐にわたるアプリケーションにおいて有用です。BINARY_FLOATおよび BINARY_DOUBLEは、Oracle
Numberに置き換わるものではありません。これらは、Oracle Numberと並ぶもう 1つの選択肢で、次のような利点があり
ます。
binary_floatおよび binary_doubleは、RDBMSクライアントにより使用されるデータ型と適合する。Javaおよび
XMLスキーマは、どちらも IEEE 754データ型と等価なデータ型をサポートします。現行では、数値データはOracle
Numberとして保存する必要があります。Oracle Numberへの変換により精度が落ち、エラーが増える場合があり
ます。Oracle Numberでは 10進法を使用しており、binary_floatおよび binary_doubleでは 2進法を使用しているた
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
9
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
め、精度が落ちる可能性があります。また、Oracle Numberによって表される値のセットは、binary_floatまたは
binary_doubleにより表される値のサブセットでもスーパーセットでもありません。
binary_floatおよび binary_doubleのほうが、算術の処理速度が速くなる。処理速度は、Oracle Numberでの場合に
比べ、5倍から 10倍速くなります。
•
•
•
ディスクに値を保存する際、binary_floatおよび binary_doubleのほうが数バイト小さくなる可能性がある。
Oracle Numberでは、1~22バイト使用します。
IEEE 754は、数値アルゴリズムの記述に必要な、Oracle Numberでは提供していない多くの機能を提供する。
浮動小数点数システムの概念
浮動小数点数システムは、コンピュータ・システムで数値を表記および操作するための一般的な方法です。浮動小数点数
は、符号(sign)、符号付指数部(exponent)および仮数(significand)の 3つの構成要素で表記され、基数(base)の固
定を前提とします。その値は、仮数と指数乗した基数との符号付乗算の結果です。
(-1)sign . significand . base exponent
浮動小数点数書式は、浮動小数点数の 3つの構成要素の表記方法を指定するものです。表記の指定により、その書式で表
記できる値の範囲および精度が決まります。定義上、値の範囲は書式で表記可能な最小値および最大値の間の範囲であり、
精度は仮数部の桁数です。
浮動小数点値の書式では、無限大精度および無限大範囲のいずれもサポートしません。数の表記にはビット数に制限があ
り、書式で表記できるのは制限された数の値のみです。書式で可能な精度よりも高い精度を使用する浮動小数点数は、丸
め処理されます。
浮動小数点の書式
次の表は、IEEE 754標準規格での必須書式および Oracle NUMBERでの必須書式の値範囲および精度を示したものです。
IEEE 754書式の範囲および精度
範囲および精度 単精度 32ビット 1 倍精度 64ビット 1 Oracle NUMBER
正の最大正規数 3.40282347e+38 1.7976931348623157e+308 10e125
正の最小正規数 1.17549435e-38 2.2250738585072014e-308 1e-130
正の最大非正規数 1.17549421e-38 2.2250738585072009e-308 適用なし
正の最小非正規数 1.40129846e-45 4.9406564584124654e-324 適用なし
精度(桁数) 6 - 9 15 - 17 38 - 40
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
10
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
ネイティブ浮動小数点データ型の比較演算子
比較演算子として、等しい(equal to)、等しくない(not equal to)、より大きい(greater than)、以上(greater than or equal
to)、より小さい(less than)、以下(less than or equal to)および順序付けしない(unordered)、が定義されています。
特別なケースとして、次のものがあります。
比較では、0の符号は無視される(−0は+0と等しく、−0は+0よりも小さいとは認識されません)。 •
•
•
•
•
•
•
•
最低 1つの演算子が NaN(Not a Number)で、比較演算子が「等しくない(not equal to)」以外の演算子の場合、
すべての比較に falseが返される。
最低 1つの演算子が NaN(Not a Number)で、比較演算子が「等しくない(not equal to)」の場合、すべての比
較に trueが返される。
ネイティブ浮動小数点データ型の算術演算子
算術演算子として、乗算、除算、加算、減算、剰余算および平方根が定義されています。演算の結果を丸めるための端数
処理方法を定義できます。演算子の実行時に例外を発生させることができます。また、例外を無効にすることも可能です。
最近まで、Javaでは、厳密な再現性のために浮動小数点算術を必要としました。IEEE 754では、そのような動作を必要
としません。IEEE 754では、算術を含めた演算の結果を、演算で演算子が使用する範囲よりも広い範囲を使用する格納
先へ配布できます。倍精度の乗算の結果を、拡張倍精度の格納先に算出できます。これを行う場合、格納先が単精度また
は倍精度であるときと同様、結果を丸める必要があります。ただし、結果の範囲(指数に使用されるビット数)には、格
納先の書式(拡張倍精度)でサポートされている、より広い範囲を使用できます。このことから、丸め処理の重複による
エラーが発生し、結果の最後の仮数ビットが正しくなくなる場合があります。
これは、IA-32および IA-64命令セット・アーキテクチャを実装しているハードウェア上での倍精度の乗算および除算で
のみ起こりうるエラーです。このケースとハードウェアの不具合を例外として、これらのデータ型の算術は、異なるプラッ
トフォーム間全体で再現可能です。計算の結果が NaNの場合は、すべてのプラットフォームで、expr IS NANが trueであ
る値が生成されます。ただし、すべてのプラットフォームで、同じビット・パターンが生成されるとは限りません。
ネイティブ浮動小数点データ型の変換関数
変換関数は、浮動小数点書式と 10進精度を使用する文字列書式間の変換を行うように、定義されています。精度は変換
処理の間に落ちることがあります。また、変換処理の間に例外を発生させることが可能です。実行できる変換は次のとお
りです。
float型から double型への変換
double型から float型への変換
float型および double型から decimal型(文字列)への変換
decimal型(文字列)から float型および double型への変換
float型および double型から整数値の float型および double型への変換
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
11
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
ネイティブ浮動小数点データ型をサポートする数値関数
現行の SQL組込み数値関数(ABS、ACOSなど)では、次のように、binary_floatデータ型および binary_doubleデータ型
をサポートしています。
SQL> select ceil(1.2343243e2F) from dual; CEIL(1.2343243E2F) ------------------ 1.24E+002
ネイティブ浮動小数点データ型をサポートする集計関数
集計関数は、単一行ではなく行のグループに基づいて、単一の結果行を返します。集計関数は、選択リストや ORDER BY
句および HAVING句に指定できます。これらは通常、SELECT文内で GROUP BY句とともに使用されます。
Oracleでは、GROUP BY句は、問い合せた表またはビューの行をグループに分ける処理に使用しています。GROUP BY
句を含む問合せでは、選択リストの要素は、集計関数、GROUP BY式、定数、またはこれらのうちの 1つに関する式で
す。Oracleでは、集計関数は各行グループに適用され、各グループに対し単一の結果行を返します。
ネイティブ浮動小数点データ型を導入することで、現在、多くの組込み集計関数(AVG、CORR、MAX、MIN、STDDEV
など)が、これらの新規導入データ型をサポートしています。
ネイティブ浮動小数点データ型をサポートする分析関数
分析関数は、行のグループに基づいて集計値を算出します。集計関数とは異なり、分析関数は各行に対し複数の行を返し
ます。行のグループはウィンドウ(Window)と呼ばれ、分析句により定義されます。各行に対し、行のスライド・ウィ
ンドウ(Sliding Window)が定義されます。ウィンドウは、「現行の行」に対する計算の実行で使用する行範囲を決定し
ます。ウィンドウのサイズは、物理的な行数または論理的な範囲(時間など)のいずれでも定義できます。
分析関数は、最後の ORDER BY句を除き、問合せで実行される演算の最後です。すべての結合、ならびに WHERE句、GROUP
BY句、HAVING句すべてが、分析関数の処理前に完了しています。したがって、分析関数は、選択リストまたは ORDER
BY句にのみ指定できます。分析関数は、一般に、累積集計、移動集計、中央集計およびレポート作成集計の計算に使用
されます。
ネイティブ浮動小数点データ型を導入することで、現在、多くの組込み分析関数(AVG、CORR、MAX、MIN、STDDEV
など)が、これらの新規導入データ型をサポートしています。
ネイティブ浮動小数点列に対する制約
多数の制約のうちの 1つを使用して、整合性制約を定義できます。整合性制約とは、データベース内の値を制限する規則
のことです。Oracle Database 10gでは、浮動小数点データ型の列に対し、次の 6種類の制約を作成します。
• NOT NULL制約。この制約は、データベースの値が NULLになることを禁止します。
• 一意制約。この制約は、複数の行が同じ列または列の組合せで同じ値を持つのを禁止しますが、一部の値が NULLに
なることを許可します。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
12
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
• 主キー制約。この制約は、1つの宣言で NOT NULL制約と一意制約を組み合せたものです。つまり、複数の行が同じ
列または列の組合せで同じ値を持つこと、および値が NULLになることを禁止します。
• 外部キー制約。この制約は、ある表の値が別の表の値と一致することを要求します。
• CHECK制約。この制約は、データベースの値が、指定された条件を満たすことを要求します。
• REF制約。REF列は、定義上は別のオブジェクト型またはリレーショナル表の中のオブジェクトを参照します。
REF制約を使用すると、REF列と参照先のオブジェクトの間の関係をさらに詳しく指定できます。
次の例は、浮動小数点データ型に対しこれらの制約を作成する方法を示したものです。
SQL> create table floating_point_table1 ( fltNnull binary_float constraint flt_null not null, dblNnull binary_double constraint dbl_null not null, fltUnq binary_float constraint flt_unq unique, dblUnq binary_double constraint dbl_unq unique, fltChk binary_float constraint flt_chk check ( fltChk is not nan ) , dblChk binary_double constraint dbl_chk check ( dblChk is not infinite) , fltPrm binary_float constraint flt_prm primary key); Table created. SQL> create table floating_point_table2 ( dblPrm binary_double constraint dbl_prm primary key, fltFrn binary_float constraint flt_frn references floating_point_table1(fltPrm) on delete cascade); Table created.
ネイティブ浮動小数点データ型のクライアント・インタフェース
SQL、PL/SQL、OCI、OCCI、Pro*C/C++、JDBCおよび XML(XMLスキーマ・マッピング)を含む数多くのクライアン
ト・インタフェースに、ネイティブ浮動小数点データ型のサポートが実装されています。
SQL のネイティブ浮動小数点データ型
SQLデータ型の BINARY_FLOATおよび BINARY_DOUBLEは、SQL環境にネイティブ浮動小数点データ型を実装します。
また、これらのデータ型で機能する多くの SQL関数が提供されています。BINARY_FLOATおよび BINARY_DOUBLEは、
SQL構文内の式(expr)が指定されているすべての場所でサポートされます。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
13
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
OCI のネイティブ浮動小数点データ型 SQLT_BFLOAT および SQLT_BDOUBLE
Oracle Call Interface(OCI)アプリケーション・プログラミング・インタフェースは、IEEE 754単精度および倍精度のネ
イティブ浮動小数点データ型を、それぞれ SQLT_BFLOATデータ型および SQLT_BDOUBLEデータ型で実装します。
IEEE 754標準規格の C言語 float型および double型を実装しているプラットフォームでは、OCIデータ型(SQLT_BFLOAT
および SQLT_BDOUBLE)と SQLデータ型(BINARY_FLOATおよび BINARY_DOUBLE)間の変換は正確に行われます。
Oracle オブジェクト型でサポートするネイティブ浮動小数点データ型
SQLデータ型 BINARY_FLOATおよび BINARY_DOUBLEは、Oracleオブジェクト型の属性としてサポートされています。
LOB の拡張機能
一時 LOB のパフォーマンスの改善
Oracle Database 10gリリースでは、Reference on Read and Copy on Writeメカニズムの導入により、一時 LOBのパフォーマ
ンスおよび記憶要件が大幅に改善されています。このメカニズムの基本概念は、割当て後の LOB値のディープ・コピー
は行わないということにあります。そのかわり、各 LOBについて参照件数を記録して、一時 LOBの参照数を把握します。
LOBから新しいコピーが作成されると件数が 1件増え、LOBのコピーが削除されると 1件減ります。件数が 0になった
時点で、一時 LOBが削除されます。つまり、参照が存在する限り、一時 LOBデータは保持されます。読取り操作では、
この参照モデルは問題なく機能します。ただし、値セマンティクスを維持するために、LOBを変更した場合には LOBの
新しいコピーを作成する必要があります。新しい LOBは、変更前に作成されたコピーとはまったく関係がなく、そのた
め新しい LOBの参照件数は 1件にリセットされます。
おもに一時 LOBへの読取り操作を使用するアプリケーションでは、変数割当ての時や関数コール・パラメータを渡す際
に、ディープ・コピーによってパフォーマンスや記憶領域に負担をかける必要がなくなります。
サイズ制限のない LOB のサポート
これまで LOBデータ型(BLOB、CLOBおよび NCLOB)の最大サイズは 4294967295(4ギガバイト-1(2^32−1))で、4
バイト unsigned int型(UB4)のサイズ制限でした。LOBの新しい最大サイズは、(4ギガバイト−1)*(db_block_size)
です。そのため、実際の LOB最大サイズはデータベースのブロック・サイズによって異なります。たとえば、データベー
ス・ブロック・サイズの許容範囲を 2~32キロバイトと仮定した場合、サイズ制限は 8~128テラバイトになります。
サイズ制限のない LOB(つまり、サイズが 4ギガバイト以上の LOB)は、次のプログラミング環境でサポートされてい
ます。
DBMS_LOBパッケージを使用する PL/SQL環境 •
•
•
JDBC(Java Database Connectivity)を使用する Java環境
OCI(Oracle Call Interface)を使用する C言語環境
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
14
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
サイズ制限のない LOB の最大記憶容量
サポートされている環境では、LOBの作成および操作は、データベース構成の最大記憶域サイズまで実行可能です。
構成の許容最大記憶容量は、データベース・ブロック・サイズ設定内の DB_BLOCK_SIZE初期化パラメータの値によっ
て異なり、DB_BLOCK_SIZEパラメータ値の(4ギガバイト−1)倍として算出されます。たとえば、データベース・ブロッ
ク・サイズの許容範囲を 2~32キロバイトと仮定した場合、記憶容量は 8~128テラバイトになります。
この記憶容量は、サイズ制限のない LOBをサポートする環境内のすべての LOB型に対し適用されますが、CLOB型およ
び NCLOB型は文字数でサイズを測定し、BLOB型ではバイト数でサイズを測定することに注意してください。
PL/SQL、JDBC および OCI とのサイズ制限のない LOB の使用
現在、サイズ制限のない LOBは、DBMS_LOB PL/SQLパッケージのすべての APIでサポートされています。
DBMS_LOB.GET_STORAGE_LIMIT関数は、データベース構成の記憶容量を返します。また、Oracle JDBCクラスでも、
JDBC内のすべての LOB ASIでサイズ制限のない LOBをサポートしています。
Oracle Call Interface APIは、サイズ制限のない LOBの操作に特化された関数セットを提供します。たとえば、データを挿
入または取得するための、ユーザー定義の読取りおよび書込みコールバック関数が、LOBをストリームするポーリング・
メソッドの代替機能として提供されています。これらの関数の実装はユーザーが行い、OCILobRead()、
OCILobWriteAppend()および OCILobWrite()callsを通じて OCIに登録します。これらのコールバック関数は、必要に応じ
て、OCIによりコールされます。4GBより大きいサイズの LOBでは、OCILobRead2()、OCIWriteAppend2()および
OCILobWrite2()は、パラメータ長さが oraub8として定義されているコールバック関数を持ちます。
CLOBと NCLOB間の変換
Unicodeとデータベース各国語キャラクタ・セット間のデータ変換は、ますます頻繁に行われるようになっています。
CLOBと NCLOB間の明示的な変換は、TO_CLOB関数および TO_NCLOB関数によって、すでに SQLおよび PL/SQLで実
行可能です。Oracle Database 10gでは、問合せ操作および DML操作における SQL INおよび OUTバインド変数の暗黙的
な変換、PL/SQL関数およびプロシージャのパラメータ渡しの暗黙的な変換、および PL/SQL変数割当ての暗黙的な変換
が、それぞれ導入されています。たとえば、次のシナリオでは、変換は完全に透過的です。
例 1
CREATE TABLE my_table (nclob_col NCLOB); DECLARE clob_var CLOB; nclob_var NCLOB; BEGIN clob_var := 'clob data'; -- initialize the CLOB value; -- Bind a CLOB into an NCLOB column INSERT INTO my_table VALUES (clob_var); SELECT nclob_col INTO clob_var FROM my_table; -- Define an NCLOB column as a CLOB var END; /
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
15
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
例 2
CREATE FUNCTION TRY_ME (a IN CLOB) RETURN NCLOB is BEGIN RETURN a; END; / DECLARE clob_var CLOB; nclob_var NCLOB; BEGIN nclob_var:= 'nclob data'; /* Pass an NCLOB into a function which takes a CLOB Return an NCLOB variable to a CLOB variable. */ clob_var:=TRY_ME(nclob_var); end; /
キャラクタ・セットの変換を伴う BFILE の CLOB/NCLOB へのロード
外部の BFILE型データをデータベース LOBへロードする際は注意が必要です。ロード元とロード先のキャラクタ・セッ
ト幅または文字幅の制約のために、データが読取り不可能になる可能性があるからです。新しい LOADFROMFILE2()プ
ロシージャは、文字データの CLOBまたは NCLOBへのロードに関し、より優れた機能性を提供します。
このプロシージャは、DBMS_LOBパッケージおよび OCIで使用できます。
LOADFROMFILE2()プロシージャを使用すると、csid(キャラクタ・セット ID)パラメータを通じて BFILEのキャラク
タ・セットを指定できます。CLOBまたは NCLOBの場合は、この新しいプロシージャを使用して、指定した外部の BFILE
キャラクタ・セットから CLOBで使用しているデータベース・キャラクタ・セットまたは NCLOB用のデータベース各
国語キャラクタ・セットへ、データを変換できます。ロード元(BFILE)とロード先(内部 LOB)が同じ幅の固定幅キャ
ラクタ・セットである場合は、変換は行われません。ロード先のキャラクタ・セットの幅が固定されていない場合、デー
タベースでは可変幅データは UCS2形式で格納されるため、データは UCS2(2バイト Unicode)形式に変換されます。
キャラクタ・セットを指定しない場合は、CLOBでは現行のデータベース csidが、NCLOBではデータベース各国語 csid
が、それぞれデフォルトで使用されます。
ロード元: BFILE CharacterSet1 ロード先: LOB CharacterSet2 キャラクタ・セットの変換 (変換前 → 変換後)
固定幅 固定幅 cs1 → cs2 if (cs1!=cs2)
可変幅 固定幅 cs1 → cs2
固定幅 可変幅 cs1 → UCS2
可変幅 可変幅 cs1 → UCS2
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
16
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
LOB および可変幅 LOB 記憶域でのトランスポータブル表領域のサポート
Oracle Database 10gでは、クロス・プラットフォーム・ポータブル表領域機能によって、異なるプラットフォーム上の
独立したデータベース間で表領域を移動できます。
コレクション拡張機能
ネストした表を格納する表領域の指定
ネストした表を、その親表以外の表領域に格納できます。次の SQL文では、ネストした表が users表領域に格納されます。 CREATE TABLE people_tab ( people_column people_typ ) NESTED TABLE people_column STORE AS people_column_nt (TABLESPACE users);
TABLESPACE句を指定しない場合は、ネストした表の記憶表は親表がある表領域内に作成されます。表が複数のレベル
にネストされている場合は、直近の親表と同じ表領域に子表が作成されます。
ALTER TABLE MOVE文を発行することで、表を異なる表領域に移動できます。ネストした表の列がある表に対し ALTER
TABLE MOVE文を発行すると、親表のみが移動し、ネストした表の記憶表については操作が行われません。
ネストした表の記憶表を異なる表領域に移動するには、次のように、記憶表に対して ALTER TABLE MOVE文を発行し
ます。 ALTER TABLE people_tab MOVE TABLESPACE users; ALTER TABLE people_column_nt MOVE TABLESPACE example;
これで people_tab表は users表領域に、ネストした表は example表領域に、それぞれ保存されます。
ネストした表のための ANSI SQL 標準の多重集合(MULTISET)操作
Oracle Database 10gでは、NESTED TABLEコレクション型用の多重集合(MULTISET)演算子を数多くサポートしてい
ます。実際のアプリケーションでは、コレクション型は抑止関係のモデル化に使用されています。コレクション型用の比
較演算子および集合演算子は、これらのアプリケーションにおける強力なツールです。Oracleでは、VARRAYおよび
NESTED TABLEの 2つのコレクション・データ型をサポートしています。
ネストした表は、順序付けされていない、すべて同じデータ型のデータ要素のセットです。表の定義にはネストの最大数
は指定されておらず、要素の順序も保存されていません。
ネストした表の要素は、実際は、各要素が属している親表行や親オブジェクトを識別する列を含む、別個の記憶表に格納
されています。ネストした表にある列は 1つで、その列のタイプは組込みタイプまたはオブジェクト・タイプのいずれか
です。ネストした表の列がオブジェクト・タイプの場合、その表は、オブジェクト・タイプの各属性の列とともに、複数
列表としても表示できます。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
17
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
ネストした表の比較
等価および不等価の比較
等価(=)および不等価(<>)条件では、入力した 2つのネストした表が等しいかどうかを判定します。
結果はブール値で返されます。
2つのネストした表が、同じ名前のタイプおよび同じカーディナリティを持ち、その要素が等しい場合には、それらの表
は等しいとされます。
要素は、マップ・メソッドを必要とするオブジェクト・タイプを除き、要素自体の等価性定義が等しいかどうかによって、
等しいかどうかが決まります。
たとえば、次のようになります。
CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER ); / CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; END; / CREATE TYPE people_typ AS TABLE OF person_typ; / CREATE TABLE students ( graduation DATE, math_majors people_typ, chem_majors people_typ, physics_majors people_typ) NESTED TABLE math_majors STORE AS math_majors_nt NESTED TABLE chem_majors STORE AS chem_majors_nt NESTED TABLE physics_majors STORE AS physics_majors_nt; INSERT INTO students (graduation) VALUES ('01-JUN-03'); UPDATE students SET math_majors = people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), person_typ(31, 'Sarah Chen', '111-555-2212'), person_typ(45, 'Chris Woods', '111-555-1213')), chem_majors = people_typ (person_typ(51, 'Joe Lane', '111-555-1312'), person_typ(31, 'Sarah Chen', '111-555-2212'), person_typ(52, 'Kim Patel', '111-555-1232')),
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
18
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
physics_majors = people_typ (person_typ(12, 'Bob Jones', '111-555-1212'), person_typ(45, 'Chris Woods', '111-555-1213')) WHERE graduation = '01-JUN-03'; SELECT p.name FROM students, TABLE(physics_majors) p WHERE math_majors = physics_majors; no rows selected
この例では、ネストした表に、マップ・メソッドが関連付けられる person_typオブジェクトがあります。
IN 条件による比較
IN条件では、ネストした表がネストした表のリスト内にあるかどうかを確認します。結果はブール値で返されます。
ネストした表が存在しない(空の)ネスト表の場合は、NULLが返されます。
たとえば、次のようになります。
SELECT p.idno, p.name FROM students, TABLE(physics_majors) p WHERE physics_majors IN (math_majors, chem_majors); no rows selected
多重集合のサブセットの比較
SUBMULTISET [OF]条件では、ネストした表が別のネストした表のサブセットかどうかを確認します。
結果はブール値で返されます。OFキーワードはオプションで、SUBMULTISETだけを使用した場合と機能は同じです。
この演算子は多重集合演算にのみ使用されるので、ネストした表用にのみ実装されています。
たとえば、次のようになります。
SELECT p.idno, p.name FROM students, TABLE(physics_majors) p WHERE physics_majors SUBMULTISET OF math_majors; IDNO NAME ---------- ------------------------------ 12 Bob Jones 45 Chris Woods
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
19
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
ネストした表のメンバーの比較
MEMBER [OF]または NOT MEMBER [OF]条件では、ある要素がネストした表のメンバーかどうかを確認します。
結果はブール値で返されます。OFキーワードはオプションで、結果には影響しません。
たとえば、次のようになります。
SELECT graduation FROM students WHERE person_typ(12, 'Bob Jones', '1-800-555-1212') MEMBER OF math_majors; GRADUATION ---------- 01-JUN-03
このとき、person_typ (12, 'Bob Jones', '1-800-555-1212')は、ネストした表 math_majorsの要素と同じ
タイプの要素です。
空の比較
IS [NOT] EMPTY条件では、NULL要素があるかどうかにかかわらず、ネストした表が空か空でないかを確認します。
ネストした表に対し NULLが与えられている場合、結果は NULLになります。結果はブール値として返されます。
SELECT p.idno, p.name FROM students, TABLE(physics_majors) p WHERE physics_majors IS NOT EMPTY; IDNO NAME ---------- ------------------------------ 12 Bob Jones 45 Chris Woods
集合(要素の一意性)の比較
IS [NOT] A SET条件では、ネストした表が一意の要素で構成されているかどうかを確認します。
結果はブール値で返されます。
たとえば、次のようになります。
SELECT p.idno, p.name FROM students, TABLE(physics_majors) p WHERE physics_majors IS A SET; IDNO NAME ---------- ------------------------------ 12 Bob Jones 45 Chris Woods
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
20
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
多重集合(MULTISET)演算
CARDINALITY
CARDINALITY関数は、VARRAYまたはネストした表内の要素の数を返します。戻り型は数値型(NUMBER)です。
VARRAYまたはネストした表が NULLコレクションの場合は、NULLが返されます。
たとえば、次のようになります。
SELECT CARDINALITY(math_majors) FROM students; CARDINALITY(MATH_MAJORS) ------------------------ 3
COLLECT
COLLECT関数は、要素のセットから多重集合を作成する集計関数です。この関数は、要素型の列を入力として受け取り、
選択された行から多重集合を作成します。結果を取得するには、この関数を CAST関数内で使用し、出力タイプを
COLLECTに指定する必要があります。
MULTISET EXCEPT
MULTISET EXCEPT演算子では、2つのネストした表が入力され、1番目のネストした表には存在するが 2番目のネスト
した表には存在しない要素で構成される、ネストした表が返されます。入力するネストした表と結果として返されるネス
トした表は、すべて同じタイプ名です。
この演算子には、ALLまたは DISTINCTオプションが使用できます。デフォルトは ALLです。
ALLオプションでは、たとえば ntab1 MULTISET EXCEPT ALL ntab2という指定の場合、ntab2内の要素以外の ntab1
内のすべての要素が、結果として含まれます。特定の要素が、ntab1で m回、ntab2で n回それぞれ出現する場合、結
果の表では、mが nより大きいときはその要素が(m – n)回出現し、それ以外のときはその要素は出現しません。
DISTINCTオプションでは、出現の回数にかかわりなく、ntab1に存在し、ntab2にも存在する要素はすべて除外され
ます。
たとえば、次のようになります。
SELECT math_majors MULTISET EXCEPT physics_majors FROM students WHERE graduation = '01-JUN-03'; MATH_MAJORSMULTISETEXCEPTPHYSICS_MAJORS(IDNO, NAME, PHONE) ------------------------------------------------------------------ PEOPLE_TYP(PERSON_TYP(31, 'Sarah Chen', '111-555-2212'))
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
21
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
MULTISET INTERSECTION
MULTISET INTERSECT演算子は、入力する 2つのネストした表に共通する値で構成される、ネストした表を返します。
入力するネストした表と結果として返されるネストした表は、すべて同じタイプ名です。
この演算子には、ALLまたは DISTINCTオプションが使用できます。デフォルトは ALLです。ALLオプションでは、特
定の値が ntab1で m回、ntab2で n回それぞれ出現する場合、結果にはその要素がMIN (m, n)回出現します。
DISTINCTオプションでは、NULL値の重複(存在する場合)も含め、結果内の重複分は削除されます。
たとえば、次のようになります。
SELECT math_majors MULTISET INTERSECT physics_majors FROM students WHERE graduation = '01-JUN-03'; MATH_MAJORSMULTISETINTERSECTPHYSICS_MAJORS(IDNO, NAME, PHONE) ------------------------------------------------------------------ PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
MULTISET UNION
MULTISET UNION演算子は、入力した 2つのネストした表に含まれている値で構成される、ネストした表を返します。
入力するネストした表と結果として返されるネストした表は、すべて同じタイプ名です。
この演算子には、ALLまたは DISTINCTオプションが使用できます。デフォルトは ALLです。ALLオプションでは、NULL
のすべての重複を含め、ntab1および ntab2に含まれるすべての要素が結果の要素になります。特定の値が ntab1で m
回、ntab2で n回それぞれ出現する場合は、結果にはその要素が(m + n)回出現します。DISTINCTオプションでは、
NULL値の重複(存在する場合)も含め、結果内の重複分は削除されます。
たとえば、次のようになります。
SELECT math_majors MULTISET UNION DISTINCT physics_majors FROM students WHERE graduation = '01-JUN-03'; MATH_MAJORSMULTISETUNIONDISTINCTPHYSICS_MAJORS(IDNO, NAME, PHONE) ----------------------------------------------------------- PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(31, 'Sarah Chen', '111-555-2212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213')) SELECT math_majors MULTISET UNION ALL physics_majors FROM students WHERE graduation = '01-JUN-03'; MATH_MAJORSMULTISETUNIONALLPHYSICS_MAJORS(IDNO, NAME, PHONE) ----------------------------------------------------------- PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(31, 'Sarah Chen', '111-555-2212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'), PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
22
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
POWERMULTISET
POWERMULTISET関数は、指定した多重集合から、空以外のすべてのサブ多重集合を生成します。
POWERMULTISET関数には、多重集合を評価する任意の式を入力できます。多重集合引数のカーディナリティの制限は
32です。
たとえば、次のようになります。
SELECT * FROM TABLE(POWERMULTISET( people_typ ( person_typ(12, 'Bob Jones', '1-800-555-1212'), person_typ(31, 'Sarah Chen', '1-800-555-2212'), person_typ(45, 'Chris Woods', '1-800-555-1213')))); COLUMN_VALUE(IDNO, NAME, PHONE) ----------------------------------------------------------- PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212')) PEOPLE_TYP (PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212')) PEOPLE_TYP (PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP (45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP (PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP (PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) 7 rows selected.
POWERMULTISET_BY_CARDINALITY
POWERMULTISET_BY_CARDINALITY関数は、指定したカーディナリティのネストした表の、空以外のすべてのサブ多
重集合を返します。ネストした表の行が、結果として返されます。
POWERMULTISET_BY_CARDINALITY(x, l)は TABLE(POWERMULTISET(x)) p where CARDINALITY(value(p)) =
lと等価です(このとき、「x」は多重集合で、「1」は指定したカーディナリティです)。
POWERMULTISET_BY_CARDINALITYへの最初の入力パラメータとして、ネストした表を評価する任意の式を使用でき
ます。長さのパラメータは正の整数である必要があります。そうでない場合、エラーが返されます。ネストした表のカー
ディナリティの制限は 32です。
たとえば、次のようになります。
SELECT * FROM TABLE(POWERMULTISET_BY_CARDINALITY( people_typ ( person_typ(12, 'Bob Jones', '1-800-555-1212'), person_typ(31, 'Sarah Chen', '1-800-555-2212'), person_typ(45, 'Chris Woods', '1-800-555-1213')),2));
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
23
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
COLUMN_VALUE(IDNO, NAME, PHONE) ------------------------------------------------------------ PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212')) PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '1-800-555-1212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213')) PEOPLE_TYP(PERSON_TYP(31, 'Sarah Chen', '1-800-555-2212'), PERSON_TYP(45, 'Chris Woods', '1-800-555-1213'))
SET
SET関数は、ネストした表の重複を除去したセットに変換し、要素が互いに一意(DISTINCT)であるネストした表を返
します。結果として返されるネストした表は、入力するネストした表と同じ名前のタイプです。
たとえば、次のようになります。
SELECT SET(physics_majors) FROM students WHERE graduation = '01-JUN-03'; SET(PHYSICS_MAJORS)(IDNO, NAME, PHONE) ------------------------------------------------------------- PEOPLE_TYP(PERSON_TYP(12, 'Bob Jones', '111-555-1212'), PERSON_TYP(45, 'Chris Woods', '111-555-1213'))
結論
Oracleの SQLは、グリッド・コンピューティングの拡大・浸透における先導役として、絶えず発展を続けています。
Oracle Database 10gでは、Oracle SQLエンジンの一層の発展に重要な要素となるシステム固有の正規表現、ネイティブ浮
動小数点データ型、LOBパフォーマンスの改善およびコレクション型の拡張機能が採用されています。結果として、Oracle
Database 10gでは、Gridデータのプロビジョニング、統合および処理のために、SQLと重要なデータ処理機能や Java、
XMLの統合が、より充実したものになっています。
文字列の検索、操作、検証および書式化のための機能は、テキスト・データを扱うすべてのアプリケーションの中核機能
であり、正規表現は、それらの処理を実行する最も高度な方法と考えられています。Oracle Databaseの SQLおよび PL/SQL
にネイティブ正規表現サポートを導入したことで、問合せやデータ定義、文字列操作での正規表現の使用が可能になり、
データベースでのテキストの検索および操作機能に大幅な刷新がもたらされました。
E-Business、ビジネス・インテリジェンス、ライフ・サイエンスおよびその他多くの基幹業務アプリケーションでは、デー
タベースに構造化データおよび非構造化データとして格納されている膨大な量のデータ・セットに対し、非常に高度な
データ操作や浮動小数点計算が要求されます。データベース内のデータ処理機能(浮動小数点データ型や LOBの処理な
ど)をさらに強化したことで、ネットワークの通信量の輻輳が減り、データの共有が促進され、結果として、非常にスケー
ラブルなグリッド・コンピューティング・インフラストラクチャが確立されています。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
24
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.
Identify the track name here
Oracleの JavaおよびXML言語バインドAPIは、データベース・サーバーへのダイレクトなインタフェースを提供します。
これらの包括的な APIは最新の標準規格をサポートしており、Java、XML、C/C++およびその他のプログラミング言語を
通じて、幅広い Oracleデータベース・サービスが供給されます。
さらに、Oracle Database 10gでは、グローバルな企業のニーズに応えるため、管理機能、グリッド・コンピューティング・
インフラストラクチャ、データベースWebサービス、OLAP、データ・マイニングおよびその他の領域においてきわめて
多くの改善が行われています。Oracleのデータベース技術は、基幹業務アプリケーションの開発、デプロイメントおよび
管理のための最も総合的なソリューションを提供します。
SQL技術の誕生以来、オラクル社は常に、最も強力な SQL技術の先導者です。今後も、その最高の SQL技術をもって、
パートナ企業やお客様のニーズに応え続けていきます。Oracle Database 10gの新しい SQL性能は、グリッド環境で実行す
る、多機能かつスケーラブルで、同時処理が可能な、パフォーマンスの高いデータベース・アプリケーションを開発する
ための、最も総合的な機能性を提供します。
Oracle Database 10g の新しい SQL 性能: 正規表現、ネイティブ値、LOB パフォーマンスおよびその他の機能 Paper #
25
Oracle Corporation 発行「NEW SQL CAPABILITIES IN ORACLE DATABASE 10G: REGULAR EXPRESSIONS, NATIVE NUMBER, LOB PERFORMANCE, AND MORE」の翻訳版です。
Copyright © 2003 Oracle Corporation All rights reserved.