(57)【特許請求の範囲】
【請求項１】
リレーショナル・データベース・システムにおいて、データベース内のデータ・フラグメントを管理するコンピュータ実施される方法であって、
照会式を中間範囲表現に変換するステップと、
前記中間範囲表現を整数範囲表現に写像するステップと、
前記データ・フラグメントに関連する検索空間を表現するために索引ツリー・データ構造を作成するステップと、
所望のデータ・フラグメントを突き止めるために前記索引ツリー・データ構造を使用するステップと
を含む方法。
【請求項２】
前記整数範囲表現が、構造化照会言語（ＳＱＬ）データ型から独立である、請求項１に記載の方法。
【請求項３】
さらに、前記データ・フラグメントを更新するために前記索引ツリー・データ構造を使用するステップを含む、請求項１に記載の方法。
【請求項４】
さらに、データ・フラグメントにデータを挿入するために前記索引ツリー・データ構造を使用するステップを含む、請求項１に記載の方法。
【請求項５】
さらに、データ・セット内のデータを選択するために前記索引ツリー・データ構造を使用するステップを含む、請求項１に記載の方法。
【請求項６】
さらに、内部データベース動作中に前記索引ツリー・データ構造を使用するステップを含む、請求項１に記載の方法。
【請求項７】
さらに、ＳＱＬ  ＳＥＬＥＣＴステートメントを使用して前記データを選択するステップを含む、請求項１に記載の方法。
【請求項８】
前記索引ツリー・データ構造が、前記データ・フラグメントを突き止めるのに使用される、請求項１に記載の方法。
【請求項９】
さらに、前記索引ツリー・データ構造を平衡化するためにデータ・セットを均等なセグメントに区分するステップを含む、請求項１に記載の方法。
【請求項１０】
さらに、前記検索ツリー・データ構造を移植するステップを含む、請求項９に記載の方法。
【請求項１１】
さらに、すべてのデータ型を整数空間に写像するステップを含む、請求項１に記載の方法。
【請求項１２】
１つまたは複数の断片化式で使用されるデータ点を収集するステップと、
前記データ点を多次元配列に保管するステップと
をさらに含む、請求項１に記載の方法。
【請求項１３】
さらに、ＮＵＬＬ値の索引点として、前記多次元配列への第１索引を使用するステップを含む、請求項１に記載の方法。
【請求項１４】
さらに、正の無限大の索引点として、前記多次元配列の上限を使用するステップを含む、請求項１に記載の方法。
【請求項１５】
前記中間範囲表現が、ソートされる、請求項１に記載の方法。
【請求項１６】
前記写像するステップが、さらに、前記中間範囲表現を前記整数範囲表現に変換する際に二分探索を使用するステップを含む、請求項１５に記載の方法。
【請求項１７】
前記索引ツリー・データ構造が、多次元検索空間を表す、請求項１に記載の方法。
【請求項１８】
前記使用するステップが、さらに、Ｏ（ｌｏｇ（Ｎ））検索複雑さで前記検索ツリー・データ構造を検索するステップを含む、請求項１に記載の方法。
【請求項１９】
前記データ・フラグメントの１つまたは複数がオーバーラップする、請求項１に記載の方法。
【請求項２０】
前記索引ツリー・データ構造が、二進ツリーである、請求項１に記載の方法。
【請求項２１】
リレーショナル・データベース・システムであって、
照会式を中間範囲表現に変換する手段と、
前記中間範囲表現を整数範囲表現に写像する手段と、
前記データ・フラグメントに関連する検索空間を表現するために索引ツリー・データ構造を作成する手段と、
所望のデータ・フラグメントを突き止めるために前記索引ツリー・データ構造を使用する手段と
を含むリレーショナル・データベース・システム。
【請求項２２】
前記整数範囲表現が、構造化照会言語（ＳＱＬ）データ型から独立である、請求項２１に記載のシステム。
【請求項２３】
さらに、前記データ・フラグメントを更新するために前記索引ツリー・データ構造を使用する手段を含む、請求項２１に記載のシステム。
【請求項２４】
さらに、データ・フラグメントにデータを挿入するために前記索引ツリー・データ構造を使用する手段を含む、請求項２１に記載のシステム。
【請求項２５】
さらに、データ・セット内のデータを選択するために前記索引ツリー・データ構造を使用する手段を含む、請求項２１に記載のシステム。
【請求項２６】
さらに、内部データベース動作中に前記索引ツリー・データ構造を使用する手段を含む、請求項２１に記載のシステム。
【請求項２７】
さらに、ＳＱＬ  ＳＥＬＥＣＴステートメントを使用して前記データを選択する手段を含む、請求項２１に記載のシステム。
【請求項２８】
前記索引ツリー・データ構造が、前記データ・フラグメントを突き止めるのに使用される、請求項２１に記載のシステム。
【請求項２９】
さらに、前記索引ツリー・データ構造を平衡化するためにデータ・セットを均等なセグメントに区分する手段を含む、請求項２１に記載のシステム。
【請求項３０】
さらに、前記検索ツリー・データ構造を移植する手段を含む、請求項２９に記載のシステム。
【請求項３１】
さらに、すべてのデータ型を整数空間に写像する手段を含む、請求項２１に記載のシステム。
【請求項３２】
１つまたは複数の断片化式で使用されるデータ点を収集する手段と、
前記データ点を多次元配列に保管する手段と
をさらに含む、請求項２１に記載のシステム。
【請求項３３】
さらに、ＮＵＬＬ値の索引点として、前記多次元配列への第１索引を使用する手段を含む、請求項２１に記載のシステム。
【請求項３４】
さらに、正の無限大への索引点として、前記多次元配列の上限を使用する手段を含む、請求項２１に記載のシステム。
【請求項３５】
前記中間範囲表現が、ソートされる、請求項２１に記載のシステム。
【請求項３６】
前記写像する手段が、さらに、前記中間範囲表現を前記整数範囲表現に変換する際に二分探索を使用する手段を含む、請求項３５に記載のシステム。
【請求項３７】
前記索引ツリー・データ構造が、多次元検索空間を表す、請求項２１に記載のシステム。
【請求項３８】
前記使用する手段が、さらに、前記検索ツリー・データ構造を検索するＯ（ｌｏｇ（Ｎ））検索複雑さ手段を含む、請求項２１に記載のシステム。
【請求項３９】
前記データ・フラグメントの１つまたは複数がオーバーラップする、請求項２１に記載のシステム。
【請求項４０】
前記索引ツリー・データ構造が、二進ツリーである、請求項２１に記載のシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、リレーショナル・データベースでの断片化を使用するデータの索引付けおよび管理に関する。
【０００２】
【従来の技術】
データベースは、情報の集合である。リレーショナル・データベースは、表の集合としてユーザに知覚されるデータベースである。各表では、項目が行に編成され、項目の属性が列に編成される。表の行のそれぞれは、項目（レコードまたはタプルとも称する）に対応し、表の列のそれぞれは、項目の属性（フィールドまたは、より正確には、属性型またはフィールド型と称する）に対応する。
【０００３】
断片化（フラグメンテーション）は、データベース性能を高めるのに使用される技法である。所与の関係を片またはフラグメントに分割できる場合に、システムがデータ断片化をサポートする。データは、最も頻繁に使用される位置に保管することができる。さらに、２タイプの断片化すなわち、制約事項および射影という関係演算に対応する水平断片化および垂直断片化を使用することができる。行を断片（フラグメント）に割り当てる規則は、データベース・ユーザまたは管理者によって定義され、「断片化方式（フラグメンテーション・スキーム）」の一部である。表の行のどれもが、あるフラグメントについて断片化方式の割当規則を満足しない場合に、所与の表のフラグメントを空にすることが可能である。「断片化除去」は、データベース・システムが、照会の結果に加わることができないフラグメントを表から識別し、照会の処理でこれらのフラグメントを考慮対象から除去し、したがって、データベース・システムの性能を改善する処理である。
【０００４】
また、フラグメントは、別のディスク、もしくはコンピュータ・クラスタまたはネットワーク・アーキテクチャの別のノードに個別に保管することができる。論理的には、すべてのフラグメントを同時に走査し、これによって、データの物理的ストレージの制限の対象になる、完全な表を読み取ることができる総合的な速度を高めることができる。
【０００５】
【発明が解決しようとする課題】
データベース・システムに情報を保管するミッションクリティカル・システムから行われる仕事が増えるにつれて、企業全体の意思決定支援を提供し、データベース照会を介するクリティカルなビジネス情報へのタイムリーなオンライン・アクセスを提供するために、これらのデータベース・システムに課せられる要求がますます高くなる。したがって、そのようなシステムの性能を、継続的に強化する必要がある。データベース・システムの性能を強化する方法の１つが、フラグメント関連動作の改良である。
【０００６】
【課題を解決するための手段】
リレーショナル・データベース・システムは、照会または断片化式を中間範囲表現に変換し、中間範囲表現を整数範囲表現に写像し、データ・フラグメントに関連する検索空間を表現するために索引ツリー（ＳＫＤツリー）データ構造を作成し、索引ツリー・データ構造を使用して所望のデータ・フラグメントを突き止めることによって、データベース内のデータ・フラグメントを管理する。
【０００７】
システムの実施形態に、下記の１つまたは複数を含めることができる。整数範囲表現は、構造化照会言語（ＳＱＬ）データ型から独立とすることができる。ツリー・データ構造は、データ・フラグメントを更新することができる。ツリー・データ構造は、データ・フラグメントにデータを挿入することができる。ツリー・データ構造は、データ・セット内のデータを選択することができる。ツリー・データ構造を、内部データベース動作中に使用することができる。データを、ＳＱＬのSELECTステートメントを使用して選択することができる。データツリー構造を使用して、データ・フラグメントを突き止めることができる。データ・セットを均等なセグメントに区分して、ツリー・データ構造を平衡化することができ、これを使用して、ツリー・データ構造を移植することができる。ツリー・データ構造は、すべてのデータ型を整数空間に写像することもできる。データ点収集を、１つまたは複数の断片化式(フラグメンテーション・エクスプレションズ）に使用することができ、データ点は、多次元配列に保管される。最初の索引を、ＮＵＬＬ値の索引点として配列内で使用することもでき、配列の上限も、正の無限大の索引点として使用することができる。中間範囲表現が、ソートされる。写像ステップに、中間範囲表現を整数範囲表現に変換する際の二分探索を使用するステップを含めることができる。索引ツリー・データ構造は、多次元検索空間を表す。索引ツリー・データ構造は、二進ツリーとすることができ、O(log(N))の検索複雑さで検索することができる。データ・フラグメントがオーバーラップすることができる。
【０００８】
もう１つの態様では、システムに、照会式を中間範囲表現に変換する手段と、中間範囲表現を整数範囲表現に写像する手段が含まれる。このシステムには、データ・フラグメントに関連する検索空間を表す索引ツリー・データ構造を作成する手段と、所望のデータ・フラグメントを突き止めるために索引ツリー・データ構造を使用する手段も含まれる。
【０００９】
本発明の特徴には、下記の１つまたは複数が含まれる。本発明は、データベース内のデータ・フラグメントの管理に関する高い性能を提供する。本発明は、任意の個数の列の断片化方式を管理することができる。この特性を用いると、本発明が、断片化に使用される列の数が非常に大きくなる可能性がある大きいデータベースを管理できるようになる。
【００１０】
ツリーの構成中に、整数配列を使用して、フラグメントに関連する範囲構造を表現する。ツリーが、フラグメントを突き止めるのに使用される時に、配列の索引が、検索を行うのに使用される。整数比較が、ＳＱＬタイプの比較より計算的に「安価」なので、これは、単純であると同時に効率的である。さらに、ＳＱＬデータ型から整数へのモデル化および写像は、データ断片化に関する動作を実行する際の本発明の単純さおよび効率に貢献する。オーバーラップするフラグメントが、ツリーから枝刈りされ、したがって、検索性能が改善される。さらに、本発明によって生成されるツリーの高さは、最小化される。したがって、ツリーの検索が、高速かつ効率的になる。これによって、データベースへの挿入動作および照会最適化（不要なフラグメントの除去）動作が、より効率的になる。また、このシステムは、低いデータ・ストレージ要件を有する。これらの長所に起因して、本発明は、データベース内のデータ・フラグメントを効率的に管理することができる。
【００１１】
【発明の実施の形態】
図１は、本発明によるデータベース・エンジン３０の実施形態を示す図である。データベース・エンジン３０は、クライアント・アプリケーション・プログラミング・インターフェース（ＡＰＩ）３４と通信するユーザ・アプリケーション３２を有する。クライアントＡＰＩ３４は、１つまたは複数のＳＱＬ式を有するＳＱＬ照会をその構成要素に構文解析するＳＱＬパーサ３８と通信し、この構成要素は、照会の構成要素を表す二進ツリー・データ構造に保管することができる。ＳＱＬパーサ３８の出力は、ＳＱＬ式から中間コードを出力するコード・ジェネレータ４０に供給される。中間コードは、ＳＱＬ照会を満足する実行プランを表す。コード・ジェネレータ４０は、冗長なデータの除去と、表名および列名の有効性の確認などのエラー検査の実行も行う。このコードが、最適化プログラム４２によって最適化され、最適化プログラム４２は、照会実行プランを定式化するコストベース分析を使用してコードを最適化する。実行プランに関連する、結果の最適化されたコードが、フラグメント・マネージャ４４に供給され、フラグメント・マネージャ４４は、所定の断片化方式に従って、断片化された表への参照を処理する。フラグメント・マネージャ４４は、索引ツリーを展開するが、この索引ツリーの作成および動作は、下で詳細に説明する。フラグメント・マネージャ４４の出力は、実行プランを実行するためにＲＳＡＭ４６に供給される。ＲＳＡＭ４６は、たとえばディスク・マネージャなどの、１つまたは複数のデータ・ストレージ・デバイス・マネージャを制御する。クライアントＡＰＩ３４、ＳＱＬパーサ３８、コード・ジェネレータ４０、最適化プログラム４２、フラグメント・マネージャ４４、およびＲＳＡＭ４６は、ライブラリ４８を参照し、プロセッサによって実行されるアクセス・メソッドなどのさまざまな低水準ルーチンを呼び出す。実行プランの結果が、ユーザ・アプリケーション３２に供給される。
【００１２】
図２および３は、本発明によるデータ・フラグメントの作成および管理の処理の流れ図である。図２および３では、ユーザ・アプリケーション３２によって生成される照会断片化式が、範囲表現を用いる中間範囲表現に構文解析される（ステップ１０２）。次に、中間範囲表現を、Ｎ次元整数空間に変換するが、ここで、Ｎは、断片化式または断片化方式の列の数である（ステップ１０４）。検索空間を表現する索引ツリーを生成する（ステップ１０６）。このツリーを、データベース・カタログの一部として永久的に保管する（ステップ１０８）。ツリーを構成した後に、下で詳細に説明するように、そのツリーを使用して、データ・フラグメントを突き止めることができる。
【００１３】
図３を参照すると、データを突き止めるためのツリーの応用が示されている。まず、照会断片化式を、範囲表現を用いる中間範囲表現に構文解析する（ステップ１１０）。次に、中間範囲表現をＮ次元整数空間に変換するが、ここで、Ｎは、断片化式または断片化方式の列の数である（ステップ１１２）。その後、ツリーを使用して、データ・フラグメントを突き止める（ステップ１１４）。
【００１４】
図２および３の実施形態では、空間区分問題としてデータ断片化がモデル化される。すなわち、各列が、Ｎ次元空間内の１つの次元とみなされる。ＳＫＤツリーが、索引付け機構として使用される。データ断片化は、さまざまな式すなわち＞、＞＝、＜、＜＝、＝、および論理演算子ＩＮ、ＮＯＴ、ＡＮＤ、ＯＲ、ＩＳＮＵＬＬについて実行することができる。複雑な式を用いる一連の組合せを処理することができる。この実施形態では、異なるＳＱＬデータ型を整数値に写像する。この処理で、断片化式に使用されるすべてのデータ点（ＳＱＬデータ値）が、収集され、多次元配列として保管される。各列のデータ点が、配列に保管される。図２および３の実施形態では、ＮＵＬＬ値の索引点として配列の索引０が使用される。これによって、ＩＳＮＵＬＬ式が極小点としてモデル化される。また、このシステムでは、「正」の無限大の索引点として配列の上限を使用する。
【００１５】
１実施形態では、２種類のノードすなわち、索引ノードおよびデータ・ノードが、ツリー内で使用される。データ・ノードは、ツリーの葉ノードであり、データ項目だけが含まれる。ツリー内のデータ項目は、空間を記述する範囲(low, up)の配列によって表される。(low, up)の各対によって、空間の１つの次元の範囲が記述される。
【００１６】
索引ノードは、ツリーの内部（葉以外の）ノードである。各索引ノードには、下記のフィールドが含まれる。
Index dimension（索引次元）  索引キーが存在する次元。
Index key（索引キー）  索引ノードの索引キー値（ｋ）。
Space covered（カバーされる空間）  各索引が、サブスペースの責任を負い、このフィールドによって、この索引ノードの下のすべてのデータ項目によってカバーされる空間が記述される。
Index bitmap（索引ビットマップ）  このフィールドは、任意選択であり、このノードによってカバーされるフラグメントを表す。これによって、フラグメントをアクティブとしてマークすることがはるかに簡単になる。
Left（左）  このフィールドは、Ｄ次元内のすべてのデータ項目の値が索引キーＫ未満（またはＫと等しい）であるサブスペースを表すＳＫＤツリーをポイントする。
Right（右）  このフィールドは、Ｄ次元内のすべてのデータ項目の値が索引キーＫを超える（またはＫと等しい）サブスペースを表すツリーをポイントする。
Equal flag（等値フラグ）  このフラグは、Ｄ次元の値が索引キーＫと等しいサブスペースをどのサブツリーが表すかを示す。これは、LeftまたはRightのいずれかになる。デフォルトでは、Equal flagにRightがセットされる。
【００１７】
処理は、データ・セットＳから開始される。Ｓの各データ項目によって、ｍ次元空間内のサブスペースが記述され、Ｓのデータ項目は次の形である。
(lb_l, low_l, up_l, ub_l), ..., (lb_m, low_m, up_m, ub_m)
ここで、(lb_i, low_i, up_i, ub_i)のそれぞれが、第Ｉ次元の範囲を記述し、lb_iおよびub_iは、範囲が下の点または上の点を含むかどうかを示す（１＜Ｉ＜ｍ）。さらに、多次元配列Ｖが使用され、ここで、Ｖ［ｉ］に、点の数と、データ・セットＳの第ｉ次元の値が記録される。
【００１８】
その後、データ・セットが、選択された索引キー値を用いて均等に区分され、その結果、平衡ツリーを作成することができるようになる。これは、まず最大の分散（最多の点）を有する次元を、索引付け次元として選択することによって達成される。その次元の中央値の点を索引キー値として使用して、データ・セットを区分する。
【００１９】
索引キー値を選択した後に、そのキーに基づいてデータ・セットを区分する。索引次元がＤであり、索引キー値がＫであり、それに関連するEqual flagがＥである場合に、下記の動作が実行される。データ・セット内の(low, up, flag)の形のデータ項目の次元値ｄのそれぞれについて、区分ルーチンを実行する。図４に、区分アルゴリズムを示す。図４の処理では、データ・セットが、左部分Ｌと右部分Ｒの２つの部分に区分される。処理１２０では、ルーチンappendを呼び出して、データ項目をデータ・セットに追加し、ルーチンsplitを呼び出して、データ項目を分離する。データ項目を分離する際に、データ項目のコピーが作られ、データ項目が、区分する次元およびキーに従って、新しいデータ項目の対応する列の範囲を変更することによって区分される。新しいデータ項目は、区分する次元に正しいフラグを有する必要がある。
【００２０】
また、ツリーの葉ノードのデータ項目は、互いにオーバーラップしてはならない。これは、データ項目を区分に追加する時に、オーバーラッピング検査を追加することによって達成される。データ項目によって表されるサブスペースが、既に区分に含まれるデータ項目によって既に完全にカバーされている場合には、そのデータ項目は、その区分に追加されない。これによって、ツリーの葉ノード内のオーバーラップするサブスペースが効果的に除去される。
【００２１】
図４に移ると、データセットを区分する処理１２０が示されている。各レコードが１つのフラグメント内だけに常駐することができるので、この処理が、断片化方式の管理に必要である。したがって、データセットを区分しなければならない。処理１２０では、データセット内の(low, up, flag)という形式のデータ項目Ｄのそれぞれについて、処理１２０が実行される。処理１２０では、データセットを、左部分Ｌおよび右部分Ｒという２つの部分に区分する。
【００２２】
図４では、各データ項目Ｄのup属性を、索引キー値Ｋと比較する（ステップ１２２）。up属性がＫ未満である場合、または、up属性がＫと等しく、範囲にup境界が含まれない（up_boundary = 0）場合に、データ項目が、左の区分に置かれる（ステップ１２３）。そうでない場合には、処理１２０では、データ項目Ｄのそれぞれのlow属性をＫと比較する（ステップ１２４）。low属性がＫを超える場合、または、low属性がＫと等しく、範囲にlow境界が含まれない（low_boundary = 0）場合に、処理１２０は、そのデータ項目を右区分に置く（ステップ１２６）。そうでない場合に、low属性が、up属性と等しく、かつ、Ｋと等しい場合（ステップ１２８）、処理１２０では、左区分を示すequal flag  Ｅが送られたかどうかを判定する（ステップ１３０）。そうである場合には、データ項目を左区分に置く（ステップ１３２）。ステップ１３０から、Ｅが左区分と等しくない場合には、処理１２０は、Ｅに右区分をセットし、データを、append呼出しを使用してその区分に置く（ステップ１３４）。ステップ１２２、１２６、１３２、または１３４から、処理１２０が終了する。
【００２３】
ステップ１２８から、low属性がup属性と等しくない場合、または、low属性がＫと等しくない場合には、処理１２０は、データ項目を分割し（ステップ１３６）、データ項目を、append関数を使用して右と左の両方の区分に追加し（ステップ１３８）、終了する。
【００２４】
図４の流れ図の擬似コードは、次のようになる。
If up < K または (up = k かつ non-inclusive), append(L, d)を用いてデータ項目を左区分に置く
Else if low > K または (low = k かつ non-inclusive), append(R, d)を用いてデータ項目を右区分に置く
Else if low = up = K: if Equal flag E = Left, append(L, d)を呼び出してデータ項目を左に区分する; otherwise, E に Right をセットし append(R, d)
Otherwise, low <= K <= up だが low = up でない。この場合には、下記のように、データ項目を分割し、その一部が左 L, 一部が右 R に置かれるようにする
（ａ）分割ルーチン split(d, ld, rd, D, K, E) を呼び出すことによって、データ項目を２つの部分 ld および rd に分割する
（ｂ）それらを、それぞれ append(L, ld) および append(R, rd) によって左と右の区分に追加する
【００２５】
断片化を管理するためのツリーの実施形態では、各データ・ノードに１つのデータ項目だけが含まれる。したがって、各レコードは、１つのフラグメントだけに常駐することができる。この実施形態では、データ・セットをさらに区分する必要がある。点のカウントが２未満の時には、いくつかの索引キー値だけを使用することができる。たとえば、範囲(x1, x2)および(x1, x2]は、処理１２０を使用して区分することができない（「］」は、上限が含まれる状態を表す）。この場合には、さらなる区分のための追加の規則を適用する必要がある。この場合には、適当な右の列を選択する必要がある。異なるデータ項目の範囲が異なるフラグを有する列を、索引付けの列として選択しなければならない。これは、ｙが索引付け列として選択された場合に限って、２つの範囲(1 < x < 5, 1 < y < 5)および(1 < x < 5, 1 < y <= 5)を２つに区分できるという観察から得られたものである。正しい区分を達成できるようにEqual flagをセットする必要がある。ヒューリスティックは次の通りである。
/* 最大値は各列に２点である
* 分割キーの選択に関して注意しなければならない
* そうでなければ、再帰が終了しない。
* ２つの点が、ｘ１＜ｘ２であるものとして、
*  次の方式に従う
*                    ｘ２（ｕｐ）
*                      ／＼
*              ＜    ／    ＼  （＞＝）
*            ｘ１（ｌｗ）  ［ｘ２，  ｘ２］
*              ／＼
*      ＜＝  ／    ＼  ＞
*  ［ｘ１，ｘ１］  （ｘ１，  ｘ２）
*/
【００２６】
図５を参照すると、図２および３で作成されたツリーを検索する処理１５０が詳細に示されている。まず、処理１５０は、ツリーの根から開始される（ステップ１５２）。その後、処理１５０では、検索キー値を索引キーと比較する（ステップ１５４）。次に、処理１５０では、キー値を索引キーと比較する（ステップ１５６）。キー値が索引キーより大きい場合には、処理１５０は、ポインタに従い、右のツリーの下に進む（ステップ１６０）。その代わりに、キー値が索引キー以下である場合には、処理１５０は、ポインタに従い、左のツリーの下に進む（ステップ１５８）。
【００２７】
ツリーを検索する時に、この処理が、ツリーの根から開始され、検索されるキー値を索引キーと比較し、比較の結果に従ってポインタに従う。データ・ノード・レベルでは、検索点をテストして、それがそのノード内のサブスペースによってカバーされるかどうかを調べる。
【００２８】
特定の範囲を検索する時には、この処理では、まず、検索されるサブスペースを、索引ノードによってカバーされる空間と比較する（根から始める）。検索されるサブスペースが、索引ノードによって記述される空間をカバーする場合には、索引ノードによってカバーされるすべてのフラグメントを、索引ノードのbitmapフィールドを使用して活動化する。範囲検索では、図４で説明したように区分を行わなければならない場合があり、したがって、ツリーの複数のパスに従う場合がある。処理が葉レベルまで検索を終えた後に、検索空間が、ツリーのノードによって完全にはカバーされていない場合に、残りのフラグメントが存在するならば、残りのフラグメントを活動化する。
【００２９】
図６を参照すると、図２および３で使用されるツリーを作成する処理１８０が詳細に示されている。処理１８０での基本的な前提は、データ・セットが、データ・セットに対する少数の挿入、削除、および更新を有する、比較的静的なものであることである。データ・セットに対する最も頻繁な動作は、ルックアップ（検索）である。この処理では、データ・セットが均等に区分されるように区分値（索引キー値）を選択する。
【００３０】
まず、処理１８０では、データセットに０個の項目が含まれるかどうかを判定する（ステップ１８２）。そうである場合には、処理１８０は、単純に終了する。そうではなく、データセットに１つ以上の項目が含まれる場合には、処理１８０では、データセットに１つの項目だけが含まれるかどうかを検査する（ステップ１８４）。そうである場合には、ツリーのデータ・ノードでその項目を返し（ステップ１８６）、処理１８０が終了する。そうではなく、複数の項目がデータセット内に存在する場合には、処理１８０では、前に説明したように、所定の次元を選択して、データセットを均等に区分する（ステップ１８８）。次に、索引ノードを作成する（ステップ１９０）。処理１８０では、その後、左のツリーを作成し（ステップ１９２）、右のツリーも作成する（ステップ１９４）。その後、１実施形態では、ビットマップを構成することによって、索引ノードに書き込む（ステップ１９６）。完成したツリーを返し（ステップ１９８）、その後、図６の処理が終了する。
【００３１】
図７に移ると、最適化の処理２００が示されている。まず、処理２００では、ユーザ照会空間を整数空間に写像する（ステップ２０２）。次に、処理２００では、オーバーラップする整数空間に関連するフラグメントを判定する（ステップ２０４）。最後に、処理２００では、整数空間にオーバーラップするフラグメントをルック・アップする（ステップ２０６）。ユーザ照会空間の整数空間への写像は、整数演算だけを実行する必要があるので有利である。対照的に、通常のユーザ照会空間には、複雑になる可能性があるさまざまなデータ型が含まれる可能性がある。
【００３２】
図２から７の動作を、Ｎ個のフラグメントを有するｍ個の列に対する範囲式によって断片化された表に適用すると、ツリーの高さが、平均してＯ（ｌｏｇ  Ｎ）になる。レコード挿入中に、正しいフラグメントを見つける検索時間は、Ｏ（ｍ＋ｌｏｇ  Ｎ）にならなければならない。というのは、葉ノードにおりるのにＯ（ｌｏｇ  Ｎ）を要し、レコードがそのフラグメントに属するかどうかを判定するのにｍ回の比較を要するからである。したがって、ツリーを使用することによって、性能が強化される。ツリーがなければ、システムは、フラグメントを見つけるのに平均してＮ／２回の比較を実行すると期待される。１つの次元だけが区分される特殊な場合に、ツリーが二分探索ツリーになることに留意されたい。
【００３３】
範囲照会除去について、検索空間が索引ノードによって記述される空間をカバーする場合に、その索引ノード内のビットマップを使用してその索引ノードによって記述されるすべてのフラグメントが活動化されることの実現にも起因して、性能が改善される。このショートカットによって、かなりの検索コストが節約される。
【００３４】
本発明は、すべての範囲がすべての次元で互いにオーバーラップするが、どれもが他の範囲によってカバーされないというワースト・ケースのシナリオの下では最適でなくなる。このシナリオでは、ツリーの構成によって、より多くの分割が生成され、したがって、性能に悪影響がおよぶ。これはありそうもない状況なので、ツリーによって、総合的により性能がもたらされるはずである。
【００３５】
次に、本発明の１実施形態で使用されるいくつかのデータ構造を説明する。まず、列内の範囲を表す、dimension_tに関連する構造体を下に示す。
/* 列内の点の相対索引によって表される列内の範囲 */
typedef struct dimension
{
char dm_lb;        /* 下限を含める場合は１ */
char dm_ub;        /* 上限を含める場合は１ */
int dm_lw;         /* 範囲の下索引 */
int dm_up;         /* 範囲の上索引 */
} dimension_t;
【００３６】
次に、サブスペースのリンク・リストであるsplistのデータ構造を示す。各サブスペースは、dimension_tの配列である。各サブスペースが、１つのフラグメントを表す。
/* 列内の索引によってインデクシングされる範囲表現によって表されるサブスペース */
typedef struct splist
{
long sp_fragid;
dimension_t *sp_range;
struct splist *sp_next;
}       splist_t;
【００３７】
次に、skdtree_tが、ツリー・データ構造である。これは、ノードが索引ノードとデータ・ノードのどちらであるかを示すフラグを有する。skd_internal_tが、索引ノード・データ構造である。skd_data_tが、データ・ノードのデータ構造である。
0003813089.tif 000002
0003813089.tif 000003
【００３８】
fragrange_tは、フラグメント除去情報データ構造である。これには、あるメタデータ情報およびツリーへのポインタが保管される。これは、フラグメント管理情報に関するアクセス点でもある。
0003813089.tif 000004
ストレージおよび比較の時間を節約するために、すべての点の値（value_t構造体）が、整数値に変換される。この整数値は、colarr_t->col_pts配列内の索引である。
【００３９】
さらに、keyarr_tは、ツリーの構成中に使用されるデータ構造である。これには、キー配列のbase_keyと、配列内のキーの数が記録される。これは、区分中に使用され、base_key変数とcnt変数の両方が、区分に従って修正される。
0003813089.tif 000005
【００４０】
図８から１１に移って、論理演算子を有する単純化された式に対する例示的動作を次に説明する。この例では、単純化された式が、次の通りである。
＜単純式＞  ＜論理演算＞  ＜単純式＞
ここで
＜単純式＞  ＝＞  ＜列＞  ＜演算＞  ＜定数＞
である。この例では、次のコマンドを使用して表が作成される。
CREATE TABLE T( a char(10), b date)
【００４１】
この例では、列ａが、文字型（char）であり、最大１０文字を保管することができ、列ｂが、日付型の情報を保管する。データベースは、第１、第２、および第３のデータベース・フラグメント、ｄｂ１、ｄｂ２、およびｄｂ３について、下記の式によって断片化される。
'cc' < a < 'ff' and '7-1-66' < '10-1-86' in db1
'dd' < a < 'LL' and '7-1-76' < b < '10-1-96' in db2
and the remainder is in db3
【００４２】
図８を参照すると、上の式が、中間表現に変換されている。この表現は、式の範囲構造を記述する２次元配列のリストとして示されている。この時点で、２次元データ点配列がソートされていないことに留意されたい。
【００４３】
図９では、中間表現を整数空間表現に写像する動作が実行される。この段階で、フラグメント・データ点配列がソートされる。さらに、配列の位置０が、ＮＵＬＬ値のために予約され、データ点が、その後に保管される。また、上限値upに、データ点配列への索引値が保管される。'ff'が、ソートされたデータ点配列の第３要素なので、upに３の値が保管される。写像動作が、dimension_t配列の残りの要素について実行される。
【００４４】
図１０および１１に、この例のツリーを作成するステップを示す。まず、システムが、最大の個数のデータ点を有する列を選択する。この例では、ａおよびｂが、同一の個数のデータ点を有する。したがって、システムは、デフォルト選択としてａを選択する。
【００４５】
図１０では、システムが、索引に列ａ、キーに２、EqualにRightをセットされて、dimension_t配列を分割する。この分割によって、１つの左区分と２つの右区分が作成される。左区分（下限＝１、上限＝２）は、１つのデータ・ノードだけを有するので、システムは、左区分について終了している。
【００４６】
右区分に関して、システムは、列ｂが最も多数のデータ点を有するので、列ｂを選択する。索引に列ｂ、キーに２、EqualにRightをセットされた分割の後に、ツリーが、１つの左区分と２つの右区分を有する。やはり、左区分は、１つのノードだけを有するのでそのまま残される。右区分が、索引に列ａ、キーに３、EqualにRightをセットされた状態でもう一度分割される。
【００４７】
図１１に、ステップ３での右列の分割の結果を示す。この場合には、分割によって、もう１つの左区分と１つの右区分がもたらされる。図１１の最下部の区分に、オーバーラップする区分が含まれることに留意されたい。最下部の区分は、その後、破棄される。この形で、オーバーラップするフラグメントが、ツリーから枝刈りされ、したがって、検索性能が高まる。さらに、本発明によって生成されるツリーの高さは、最小化される。
【００４８】
動作中に、ユーザが、下記などの照会を実行することができる。
Select from T when 'dd' < a 'ff' & '7-1-76 < b < '7-1-86'
【００４９】
この照会は、図１２の中間形態に解決される。この例では、写像処理によって、中間表現が３の整数値に写像されて、値'7-1-86'を表す。その後、ＳＫＤツリーを、ＳＱＬ比較演算ではなく、配列の索引に対する整数比較演算を使用して、すばやく検索することができる。これは、ＳＱＬタイプの比較と比較して、単純であり効率的である。
【００５０】
したがって、このツリーは、データベース内のデータ・フラグメントの管理に関して高い性能をもたらす。断片化方式が、この例では２つの列だけを表すが、ツリーは、断片化に使用される列の数が非常に多くなる可能性がある大きいデータベースを管理することができる。ＳＱＬデータ型から整数へのモデル化および写像は、データ断片化に関する動作を実行する際のシステムの単純さおよび効率に貢献する。
【００５１】
図１３に、リレーショナル・データベース・システムをサポートし、単に表と称するリレーショナル・データベース表を保管するのに適するプラットフォームであるコンピュータ・システム４００を示す。コンピュータ・システム４００には、１つまたは複数のコンピュータ４０２（個別にはコンピュータ４０２ａおよび４０２ｂ）が含まれる。複数のコンピュータをリンク４０４によって接続することができ、リンク４０４は、コンピュータのクラスタを作成する高速バックボーンもしくはコンピュータをリンクするローカル・エリア・ネットワーク接続または広域ネットワーク接続とすることができる。コンピュータは、１つまたは複数の永続的データ・ストア４０６ａから４０６ｅを有する。通常、各データ・ストアは、他のすべてのデータ・ストアのディスク・ドライブから独立に動作する１つまたは複数のディスク・ドライブを含むストレージ・サブシステムであり、このディスク・ドライブは、関連するコンピュータにインストールされたディスク・コントローラを介して制御され、データベース・システムの最終的な制御の下で動作する。
【００５２】
例示のために説明され、使用されるデータベース・システムでは、データベース定義が、当初は、データベース・システムに対する「create database」コマンドの動作によってデータベースが配置される１つのデータベース・ストレージ・スペースに常駐する。データベースには、当初は、システム・カタログと称するリレーショナル表の組（図示せず）が含まれる。システム・カタログによって、すべての表の定義およびすべての表の断片化を含む、データベースのすべての態様が記述される。たとえば「create table」コマンドを用いて、新しい表が作成される時に、新しい表を記述するために、新しいデータがシステム・カタログに追加される。
【００５３】
システム・カタログには、データベースの断片化に関する情報を永続的に保管するための、システム・フラグメント表が含まれる。各フラグメントは、システム・フラグメント表の個々の行によって表現することができる。システムは、フラグメントへの参照を必要とする時に、システム・フラグメント表に対して照会して、任意の所与の表に関する必要なフラグメント情報を得ることができる。システム・フラグメント表の属性の１つが、断片化方法である。本明細書で後で説明する参照断片化方式を使用して断片化された表は、参照断片化方式を用いて作成されたものとしてフラグメントを識別する、「reference」などの属性値を有する。参照断片化方式によって使用される参照キー情報も、システム・カタログ内の表に保管される。
【００５４】
各データ・ストアに、データベース・システムによって管理される１つまたは複数の表の１つまたは複数のフラグメント４０８ａから４０８ｉを保管することができる。一般に、並列に動作することができるデータ・ストレージ・サブシステムにまたがってフラグメントを分割しないことが有利である。
【００５５】
図１４に示されているのは、図１に関して前に説明したコンピュータ・システム・プラットフォーム内での使用に適するコンピュータ１００２のブロック図である。本発明は、ディジタル電子回路内またはコンピュータ・ハードウェア内、ファームウェア、ソフトウェア、もしくはこれらの組合せで実施することができる。本発明の装置は、コンピュータ・プロセッサによる実行のために機械可読記憶装置内で有形に実施されるコンピュータ・プログラム製品で実施することができ、本発明の方法ステップを、入力データに対して作用し、出力を生成することによって本発明の機能を実行するためのプログラムを実行するコンピュータ・プロセッサによって実行することができる。適当なプロセッサ１０２０には、たとえば、汎用マイクロプロセッサと特殊目的マイクロプロセッサの両方が含まれる。一般に、プロセッサは、読取専用メモリ１０２２またはランダム・アクセス・メモリ１０２１から命令およびデータを受け取る。コンピュータ・プログラム命令を有形に実施するのに適するストレージ・デバイスには、例としてＥＰＲＯＭ、ＥＥＰＲＯＭ、およびフラッシュ・メモリ・デバイスなどの半導体メモリ・デバイスを含むすべての形態の不揮発性メモリ、磁気テープ、内蔵ハード・ディスクおよび取外し可能ディスク１０４０などの磁気ディスク、光磁気ディスク、およびＣＤ−ＲＯＭディスクが含まれる。前述のいずれであっても、特別に設計されたＡＳＩＣ（特定用途向け集積回路）によって補足するか、それに組み込むことができる。
【００５６】
他の実施形態は、請求項の１つまたは複数の範囲に含まれる。
【図面の簡単な説明】
【図１】  本発明によるデータベース・エンジンを示す図である。
【図２】  ツリー・データ構造を作成する処理を示す流れ図である。
【図３】  照会に応答してツリー・データ構造を適用する処理を示す流れ図である。
【図４】  図２から３のデータ断片化処理でのデータセット区分の処理を示す流れ図である。
【図５】  図２から３で作成されたツリーを検索する処理を示す流れ図である。
【図６】  図２から３に従ってツリーを作成する処理を示す流れ図である。
【図７】  本発明によるデータ断片化を最適化する処理を示す流れ図である。
【図８】  図１のシステムの例示的動作を示す図である。
【図９】  図１のシステムの例示的動作を示す図である。
【図１０】  図１のシステムの例示的動作を示す図である。
【図１１】  図１のシステムの例示的動作を示す図である。
【図１２】  図１のシステムの例示的動作を示す図である。
【図１３】  本発明によるデータベース・システムの実施形態を実施するのに適するコンピュータ・システム・プラットフォームを示すブロック図である。
【図１４】  図１のデータベース・エンジンでの使用に適するコンピュータおよびコンピュータ要素を示すブロック図である。
【符号の説明】
３０  データベース・エンジン
３２  ユーザ・アプリケーション
３４  クライアント・アプリケーション・プログラミング・インターフェース（ＡＰＩ）
３８  ＳＱＬパーサ
４０  コード・ジェネレータ
４２  最適化プログラム
４４  フラグメント・マネージャ
４６  ＲＳＡＭ
４８  ライブラリ
【図１】
0003813089.tif 000006
【図２】
0003813089.tif 000007
【図３】
0003813089.tif 000008
【図４】
0003813089.tif 000009
【図５】
0003813089.tif 000010
【図６】
0003813089.tif 000011
【図７】
0003813089.tif 000012
【図８】
0003813089.tif 000013
【図９】
0003813089.tif 000014
【図１０】
0003813089.tif 000015
【図１１】
0003813089.tif 000016
【図１２】
0003813089.tif 000017
【図１３】
0003813089.tif 000018
【図１４】
0003813089.tif 000019