(57)【要約】アプリケーションプログラム（データベースなど）は、アプリケーションプログラムによって行なわれる機能（照会など）のためにアプリケーションプログラムによって使用されるメモリの量を規定する値（外部で設定されるグローバルな値とも呼ばれる）に応答する。一実施例では、命令のシーケンス（「メモリブローカ」とも呼ばれる）は、外部で設定されるグローバルな値を使用して、メモリを割当てるときに使用される１つまたは複数の内部の値を計算する。メモリブローカは機能に対して割当てられているメモリに基づいて内部の値を動的に改め、フィードバックループを形成する。
2005508033.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ内のデータベースに関連する複数のプロセスにメモリを割当てる方法であって、
前記プロセスに割当てられるメモリの合計の量の第１の値を記憶するステップと、
前記第１の値に基づいて、前記プロセスの少なくとも１つにおいて少なくとも１つのオペレータによって割当てられるメモリの量の第２の値を導くステップとを含む、方法。
【請求項２】
第２の値の量のメモリを割当てるステップと、
前記第２の値に基づいて前記第１の値を変更するステップと、
前記第１の値を変更するステップの後に、導く動作を繰返すステップとをさらに含む、請求項１に記載の方法。
【請求項３】
第２の値の量のメモリを割当てるステップと、
前記第１の値を変更することなく、導く動作を繰返すステップとをさらに含む、請求項１に記載の方法。
【請求項４】
前記プロセスのすべては前記コンピュータ内の共有メモリへのアクセスを有し、
前記方法は前記第２の値を前記共有メモリに記憶するステップを含む、請求項１に記載の方法。
【請求項５】
１つのオペレータによって使用されるメモリの推定値を前記共有メモリに記憶するステップをさらに含む、請求項４に記載の方法。
【請求項６】
前記推定値は前記１つのオペレータによって必要とされるメモリについてのものである、請求項５に記載の方法。
【請求項７】
各プロセスは、各オペレータに対して前記共有メモリに、
最適モードに必要とされるメモリの第１の推定値と、
ワンパスモードに必要とされるメモリの第２の推定値と、
最小モードに必要とされるメモリの第３の推定値とを記憶するステップをさらに含む、請求項４に記載の方法。
【請求項８】
前記第２の値を前記推定値の少なくとも１つと比較するステップと、
前記比較するステップの結果に基づいてオペレータに割当てられるメモリの量を判定するステップとをさらに含む、請求項７に記載の方法。
【請求項９】
前記第２の値に基づいて各プロセスがメモリを割当てるステップと、
各プロセスが前記プロセスに割当てられるメモリの量を前記共有メモリに記憶するステップとをさらに含む、請求項４に記載の方法。
【請求項１０】
各プロセスが前記プロセスにおいて各オペレータによって使用されるメモリの量、前記プロセスの他の部分によって使用されるメモリの量、および割当てられているが前記プロセスによって使用されないメモリの量を前記共有メモリに記憶するステップをさらに含む、請求項９に記載の方法。
【請求項１１】
前記コンピュータは値によって制約されない付加的なプロセスを含む、請求項１に記載の方法。
【請求項１２】
前記第２の値は前記プロセスのすべてにおいて前記オペレータのすべてに共通である、
請求項１に記載の方法。
【請求項１３】
判定する動作を定期的に繰返すステップをさらに含む、請求項１に記載の方法。
【請求項１４】
前記第１の値が前記複数のプロセスに割当てられたメモリによってある予め定められた量だけ超過されたことに応答して、判定する動作を繰返すステップをさらに含む、請求項１に記載の方法。
【請求項１５】
複数の命令のシーケンスを記憶したコンピュータ読取可能な媒体であって、前記複数の命令のシーケンスは、コンピュータによって実行されると前記コンピュータに請求項１に記載の方法を実行させる命令のシーケンスを含む、コンピュータ読取可能な媒体。
【請求項１６】
搬送波媒体で実現されかつ複数の命令のシーケンスで符号化される信号であって、前記複数の命令のシーケンスは、コンピュータによって実行されると前記コンピュータに請求項１に記載の方法を実行させる命令のシーケンスを含む、信号。
【請求項１７】
コンピュータ内のデータベースに関連する複数のプロセスにメモリを割当てる方法であって、
オペレータに割当てられるメモリの予め定められた値を、オペレータの最適な実行に必要とされるメモリの第１の推定値、オペレータのワンパス実行に必要とされるメモリの第２の推定値、およびオペレータの最小の実行に必要とされるメモリの第３の推定値の３つの推定値のうちの少なくとも１つと比較するステップと、
比較するステップの結果に基づいて前記オペレータに割当てられるメモリの量を導くステップとを含む、方法。
【請求項１８】
前記量は、前記第１の推定値が前記予め定められた値よりも小さい場合に前記第１の推定値であると判定される、請求項１７に記載の方法。
【請求項１９】
前記量は、前記予め定められた値が前記第１の推定値と前記第２の推定値との間である場合に少なくとも前記第２の推定値から導かれる、請求項１７に記載の方法。
【請求項２０】
前記量は、その他のプロセスに対する前記プロセスの優先順位からも導かれる、請求項１９に記載の方法。
【請求項２１】
前記量は、前記予め定められた値が前記第１の推定値と前記第３の推定値との間である場合に少なくとも前記予め定められた値から導かれる、請求項１７に記載の方法。
【請求項２２】
前記量は、前記予め定められた値が前記第３の推定値より小さい場合に前記第３の推定値から導かれる、請求項１７に記載の方法。
【請求項２３】
比較する動作の前に、
前記プロセスに割当てられるメモリの合計に基づいて前記予め定められた値を判定するステップをさらに含む、請求項１７に記載の方法。
【請求項２４】
コンピュータ内の複数のプロセスにメモリを割当てる方法であって、
各プロセスが前記プロセスによって必要とされるメモリの量の推定値を前記コンピュータの共有メモリに記憶するステップと、
各プロセスが前記推定値を前記共有メモリから検索された値と比較するステップと、
各プロセスが前記比較するステップの結果に基づいてメモリを割当てるステップとを含む、方法。
【請求項２５】
各プロセスはデータベースに関連し、
前記推定値および前記値はデータベース照会を実現するオペレータに対するものである、請求項２４に記載の方法。
【請求項２６】
各プロセスは対応する前記オペレータの複数の実行のモードに対して複数の推定値を記憶し、
割当の動作で割当てられるメモリは、前記第１の推定値が前記値よりも小さい場合に第１の推定値であると判定される、請求項２５に記載の方法。
【請求項２７】
前記オペレータはソートであり、
前記割当の動作で割当てられるメモリは、前記値が前記第１の推定値と中間の推定値との間である場合に前記中間の推定値であると判定され、前記中間の推定値は前記第１の推定値と前記第２の推定値との間にある、請求項２６に記載の方法。
【請求項２８】
前記オペレータはハッシュ結合であり、
前記割当の動作で割当てられるメモリは、前記値が前記第１の推定値と中間の推定値との間である場合に前記値であると判定され、前記中間の推定値は前記第１の推定値と前記第２の推定値との間にある、請求項２６に記載の方法。
【請求項２９】
コンピュータ内の複数のプロセスにメモリを割当てる方法であって、
各プロセスがデータベース照会を実現するオペレータによって必要とされるメモリの推定値をある予め定められた数と比較するステップと、
各プロセスが比較の結果に基づいてメモリを割当てるステップとを含む、方法。
【請求項３０】
前記予め定められた数は割当に利用可能なメモリを示し、前記方法は、
前記予め定められた数が前記推定値を超えたときに前記割当てるステップを行なうステップと、
前記推定値が前記予め定められた数を超えた場合にプロセスを待ち行列に入れるステップとをさらに含む、請求項２９に記載の方法。
【請求項３１】
前記推定値は前記オペレータの最小モードに必要とされるメモリに関するものであり、
前記割当てるステップは前記推定値が前記予め定められた数を超えたときでも行なわれる、請求項２９に記載の方法。
【請求項３２】
コンピュータ内の複数のプロセスにメモリを割当てる方法であって、
前記プロセスに割当てられるメモリの合計に関連する第１の値を記憶するステップと、
前記第１の値から第２の値を導くステップと、
プロセスに対してメモリを割当てるために前記第２の値を使用するステップと、
前記使用するステップの後に前記第２の値を改めるステップとを含む、方法。
【請求項３３】
前記改めるステップは改められた第２の値を提供し、前記方法は、
別のプロセスに対してメモリを割当てるために前記改められた第２の値を使用するステップをさらに含む、請求項３２に記載の方法。
【請求項３４】
前記改められた第２の値は前記第２の値および前記第１の値の各々から導かれる、請求項３３に記載の方法。
【請求項３５】
前記改めるステップは定期的に行なわれる、請求項３２に記載の方法。
【請求項３６】
メモリの割当および割当の解除の際に各プロセスがメモリの使用についての統計値を更新するステップと、
前記統計値を前記第１の値および前記第２の値の少なくとも１つと比較するステップとを含み、前記改めるステップは前記比較するステップの結果に基づく、請求項３２に記載の方法。
【請求項３７】
各プロセスは前記比較するステップを行ない、前記結果に応答して前記改めるステップを起動する、請求項３６に記載の方法。
【請求項３８】
データベースに関連する複数のプロセスを実行するコンピュータであって、
前記プロセスに割当てられるメモリの合計の量の第１の値を記憶するための手段と、
前記第１の値に基づいて、前記プロセスの少なくとも１つにおいて少なくとも１つのデータベースオペレータによって割当てられるメモリの量の第２の値を導くための手段とを含む、コンピュータ。
【請求項３９】
第２の値の量のメモリを割当てるための手段と、
前記第２の値に基づいて前記第１の値を変更するための手段とをさらに含む、請求項３８に記載のコンピュータ。
【請求項４０】
データベースに関連する複数のプロセスを実行するコンピュータであって、
データベースオペレータに割当てられるメモリの予め定められた値を、前記データベースオペレータの最適な実行に必要とされるメモリの第１の推定値、前記データベースオペレータのワンパスの実行に必要とされるメモリの第２の推定値、および前記データベースオペレータの最小の実行に必要とされるメモリの第３の推定値の３つの推定値の少なくとも１つと比較するための手段と、
前記データベースオペレータに割当てられるメモリの量を導き、比較の結果を受取るために前記比較するための手段に結合される手段とを含む、コンピュータ。
【請求項４１】
前記３つの推定値を記憶するメモリをさらに含み、
前記導くための手段は、第１の推定値が前記値よりも小さい場合に前記第１の推定値を選択するための手段を含む、請求項４０に記載のコンピュータ。
【請求項４２】
そこで実行する複数のプロセスにメモリを割当てるコンピュータであって、
前記プロセスに割当てられるメモリの合計に関連する第１の値を記憶するための手段と、
前記第１の値から第２の値を導くための手段と、
前記プロセスにメモリを割当てるために前記第２の値を使用するための手段と、
前記使用の後に前記第２の値を改めるための手段と、
別のプロセスにメモリを割当てるために前記改められた第２の値を使用するための手段とを含む、コンピュータ。
【請求項４３】
メモリの割当および割当の解除の際にメモリの使用についての統計値を更新するための手段と、
前記統計値を前記第１の値および前記第２の値の少なくとも１つと比較するための手段とをさらに含む、請求項４２に記載のコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
典型的なデータベースシステムでは、ユーザは、Oracleなどのデータベースアプリケーションにコマンドをサブミットすることで、情報を記憶、更新および検索する。トランザクションを実行するとき、データベースアプリケーションは情報をメモリおよびディスク上に記憶する。最高の性能のためには、できるだけ多くの情報をディスク上ではなくメモリに記憶しなければならない。しかしながら、メモリ資源は限られており、データベースアプリケーションはメモリの割当を調整しなければならない。このことは、データベースアプリケーションによって使用される構造に利用可能なメモリを配分することを伴う。
【背景技術】
【０００２】
オラクルコーポレイション（Oracle Corporation）からおよびインターネットのhttp://oradoc.photo.net/ora81/DOC/server.815/a67781/toc.htmで入手可能な「Oracle8iの概念（“Oracle8i Concepts”）」と題される本に説明されるように（この本の全体をここに引用により援用する）、データベースアプリケーションOracleによって使用される構造の２つは、システムグローバルエリア（System Global Area;ＳＧＡ）およびプログラムグローバルエリア（program Global Area;ＰＧＡ）と呼ばれるメモリのエリアである。ＳＧＡは、Oracleプロセスがアクセスする必要のあるデータベースおよびインスタンスの状態についての一般的な情報を含む。ユーザデータはＳＧＡには記憶されない。ＳＧＡのサイズはOracleのスタートアップ時に決定される。たいていのシステムでは最適な性能のため、ＳＧＡ全体が現実のメモリに収まることが必要である。データベースアドミニストレータ（ＤＢＡ）は、ＳＱＬステートメント“SHOW SGA.”を発行することで、どれだけ多くのメモリがＳＧＡに割当てられているかを見ることができ、内部構造の各々を見ることができる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ＰＧＡは、プロセスが開始されるときに、データを保持するために作られ、各プロセスの情報を制御する。そのようなＰＧＡは共有メモリにあってもよいが、ＰＧＡはOracle内の各プロセスに対してプライベートである。ＰＧＡの当初のサイズは対応するプロセスのスタートアップ時に固定され、オペレーティングシステムに特有である。現在、Oracle8iでは、ＤＢＡは、SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE、CREATE_BITMAP_AREA_SIZEなどのさまざまなパラメータを使用してＰＧＡのメモリの使用を制御することができる。そのようなパラメータについてさらに情報が必要な場合は、http://oradoc.photo.net/ora81/DOC/server.815/a67775/toc.htmで入手可能な「Oracle8iの調整（“Oracle8i Tuning”）」と題される書籍を参照されたい（この書籍の全体をここに引用により援用する）。
【０００４】
「割当てられた値またはしきい値に従ってソート動作からのデータを記憶するためにプライベートまたは共有バッファメモリを割当てるための方法（“Method for allocating either private or shared buffer memory for string data from sort operations in accordance with an assigned value of threshold value”）」と題されるCohenらに付与された米国特許第５，７９９，２１０号、「連続的に再使用可能な実行メモリ（“Serially reusable execution memory”）」と題されるJasujaらに付与された米国特許第５，９８７，５８０号、「ある数のプロセスに非常に大きなサイズの物理的メモリバッファのアクセスを提供するためのアドレス指定方法およびシステム（“Addressing method and system for providing access of a very large size physical memory buffer to a number of processes”）」と題されるFrankらに付与された米国特許第５，８６０，１４４号、および「ビットマップインデックスを使用するコンピュータ内での動的なメモリの割当（“Dynamic memory allocation in a computer using a bit map index”）」と題されるMcMahonらに付与された米国特許第５，７８４，６９９号も参照されたい。これらはすべてデータベースプロセスによるメモリの使用に関する。
【０００５】
さらに情報として、ネットワークおよび情報システム（Networking and Information Systems）1(6):629-652(1998)に発表された「大きな照会実行のための動的なメモリの割当（“Dynamic Memory Allocation for Large Query Execution”）」と題される、Luc Bouganim、Olga Kapitskaia、Patrick Valduriezによる文献を参照されたい。さらに、Association for Computing Machinery, Inc.によって発行された、情報および知識管理会議１９９８の議事録（Proceedings of Conference on Information and Knowledge Management, 1998）の１０５頁〜１１５頁の上述の同じ３人の著者らによる「大きな照会実行のためのメモリ適合スケジューリング（“Memory-Adaptive Scheduling for Large Query Execution”）」と題される文献も参照されたい。さらにこの分野には、Diane L DavisonおよびGoetz Graefeによる「複数ユーザの照会実行のための動的な資源調停（“Dynamic Resource Brokering for Multi-User Query Execution”）」と題される、SIGMOD Conference 1995:281-292に発表された文献もある。
【課題を解決するための手段】
【０００６】
概要
この発明に従ってプログラムされたコンピュータは、データベースなどのアプリケーションによって使用されるメモリの合計量を規定する値に応答する。一例では、データベースアドミニストレータ（ＤＢＡ）はそのような値（「外部で設定されるグローバルな値」とも呼ばれる）を提供する。別の例では、外部で設定されるグローバルな値は、たとえば、現在システム内で利用可能なメモリの量に基づいて自動的に判定される。その後、コンピュータは、外部で設定されるグローバルな値から（全体的にまたは少なくとも部分的に）導かれた量のメモリ（たとえば、データベース照会によって使用される）を割当てる。
【０００７】
プログラムされたコンピュータの一実施例は、外部で設定されるグローバルな値から、アプリケーションのためのメモリ（たとえば、データベース照会を実現するオペレータによって必要とされるメモリ）の割当で使用される内部の値（「メモリの境界」と呼ばれる）を導く。メモリの境界は、たとえばデータベースを実現するプロセスおよび構造に応じて、当業者に明らかな態様であればどのように行なってもよい。
【０００８】
一実施例では、プログラムされたコンピュータは、行なわれているメモリの割当に基づいて動的にメモリの境界を改め、フィードバックループを形成する。任意で、メモリの境界の判定において、プログラムされたコンピュータはアプリケーション外の情報（たとえば、データベースでないプロセスによって割当てられるメモリの量など）に応答してもよく、こうすればコンピュータ内の限られたメモリが有効に使用される。
【発明を実施するための最良の形態】
【０００９】
詳細な説明
この発明に従ってソフトウェアを用いてプログラムされると、コンピュータは、データベースなどのアプリケーションによって使用されるメモリの合計量を規定する値１１（図１Ａ）に応答する。なお、以下の説明ではデータベースアプリケーションを参照するが、実施例によっては、ここに記載される態様で他のアプリケーションをプログラムしてもよい。値１１（「外部で設定されるグローバルな値」とも呼ばれる）は、たとえば、データベースアドミニストレータ（ＤＢＡ）によって提供されてもよいし、または、たとえばコンピュータで現在利用可能なメモリに基づいて自動的に判定してもよい。実施例に応じて、外部で設定されるグローバルな値１１は、アプリケーションによって（超えてはならない）限界として使用してもよいし、または（時々到達されることもあれば到達されないこともある、たとえばたいていの場合に到達されないかまたは超えられる）ターゲットとして使用してもよい。
【００１０】
一実施例では、データベースシステム１０（図１Ａ）は、たとえば、照会を実行するために、アプリケーションのプロセスに利用可能でないメモリの量１２（図１Ａ）を勘案してデータベースソフトウェアの内部の値１４（以降は「グローバルな内部の値」）を計算する（論理１３を参照）。具体的には、論理１３（図１Ａ）は、割当てられているが使用されていないメモリ（「フリーなメモリ」と呼ばれる）、および照会を実現するオペレータ（ソート、ハッシュ結合およびビットマップマージなど）に関係のないメモリ（「その他のメモリ」と呼ばれる）を勘案する。
【００１１】
実施例に応じて、データベースシステム１０（図１Ａ）はグローバルな値１４を使用して別の内部の値１７（「メモリの境界」とも呼ばれる）を計算し（論理１５を参照）、これは各オペレータに対するメモリの割当で使用される。メモリの境界１７はオペレータレベルの値であり、各オペレータのワークエリアに対して各プロセス１８によって割当てられ得るメモリの量を規定する。各プロセス１８はメモリの境界１７をオペレータによって必要とされるメモリの量２０と比較して、割当てるメモリの量２１を判定し、その後、適切なメモリの量を割当てる。しかしながら、データベースの種類（たとえば、階層的）および／またはデータベースを実現する構造およびプロセスに応じて、メモリの境界は外部で設定されるグローバルな値から直接的に、すなわち、上述のグローバルな内部の値１４を計算することなく導いてもよい。さらに、代替の実施例では、オペレータレベルの値１７は使用されず、その代わりに各プロセスがメモリの使用についての統計値を勘案してフィードバックループを実現しつつ、グローバルな内部の値１４または外部で設定されるグローバルな値１１（実現例による）に基づいてオペレータに割当てられるメモリの量を判定する。
【００１２】
そのような一実施例では、データベースシステム１０（図１Ａ）は次のようにフィードバックループを実現する。データベースシステム１０によって現在割当てられるメモリの合計が外部で設定されるグローバルな値を超えているとき、データベースシステム１０はメモリの境界を低減して（またはその逆）、データベースシステム１０によって割当てられるメモリの合計が上述のようにターゲットまたは限界としての外部で設定されるグローバルな値１１に近づくようにする。メモリの境界が使用されない場合、そのような実施例は、値１１が変更されない場合でもグローバルな内部の値１４を変更してもよい。
【００１３】
上述の動作は、この開示を読めば当業者に明らかとなるような態様であればどのように行なってもよい。たとえば、フィードバックループは定期的または非同期的もしくは両方でメモリの境界１７（および／またはグローバルな内部の値１４）を改めることに基づいてもよい。一実施例では、データベースシステム１０は、メモリの使用に関する統計値に基づいて定期的に（たとえば、３秒ごとに）メモリの境界１７を改める。データベースシステム１０は、メモリを割当てるとき、たとえばデータベースシステム１０によって割当てられるメモリの合計が外部で設定されるグローバルな値１１をある予め定められた量（たとえばゼロ、または値１１の１０％であってもよい）だけ超える場合に、メモリの境界１７を非同期的に改めてもよい。また、割当てられるメモリの量２１は、必要な量２０であってもよいし、メモリの境界１７であってもよいし、またはこれらの１つまたは両方から導かれる何らかの量であってもよく、そのオペレータが他のオペレータよりも優先順位が高いと思われる場合は、たとえば複数のメモリの境界または複数の推定量であってもよい。説明したばかりの例では、各オペレータは優先順位の代わりにある量の「貨幣」を割当てられ、メモリの境界１７はメモリを「購入する」ために貨幣を使用して支払われる価格であってもよい。そのような場合、各オペレータに割当てられる「貨幣」の量はオペレータが受取るメモリの量を決定する。
【００１４】
一実施例では、データベースシステム１０は、上述のメモリの境界１７を計算する命令のシーケンス（以降は「メモリブローカ」）２２を含む。メモリブローカ２２は、データベース照会を実現するプロセスとは別の異なるプロセスとして実現してもよい。この場合、データベース照会プロセス１８はメモリの境界１７を１つまたは複数の推定値と比較して、適切なメモリの量を割当てる。メモリブローカ２２とデータベース照会プロセス１８との間の情報の転送は、メッセージまたは共有メモリを通じて実現してもよい。
【００１５】
代替の実施例では、メモリブローカ命令シーケンスは別のプロセスとしてセットアップされず、それの代わりにデータベース照会プロセスの各々がファンクションコードを用いてこれらの命令を呼出す。したがって、（後述するように、「ソート」および「ハッシュ」オペレータに対する異なる関数の代わりに）共通の関数を使用してすべてのオペレータにメモリを割当ててもよい。そのような共通の関数を使用するとき、各プロセスは、（これも上述の）外部で設定されるグローバルな値を直接的に使用してこれから割当てられるメモリの量を導く。
【００１６】
ある実施例の特徴が別の実施例に組合されると、メモリブローカは（上述の）グローバルな内部の値１４を単に計算し、各照会プロセスはグローバルな内部の値１４を使用してオペレータに対して割当てられるメモリの量を導く。その実施例に応じて、メモリの境界１７は、たとえば、優先順位の高い照会はメモリの境界の２倍または３倍までメモリを割当ててもよく、普通の優先順位の照会はメモリの境界までメモリを割当ててもよいというように、各オペレータにメモリを割当てるときに異なる使われ方をしてもよい。したがって、オペレータに対する限界は、この例では、オペレータを実行しようとしている特定の照会の優先順位によって異なる。別の例では、メモリの境界は「限界」ではなく、「価格」として作用する。さらに、すべてのオペレータ（たとえば、通常の優先順位の照会）に対して共通なメモリの境界１７を有する代わりに、オペレータの各種類に対して１つずつ、いくつかのメモリの境界を使用してもよい。
【００１７】
一実施例では、オペレータによって必要とされるワークエリアメモリは、メモリを割当てるときに各プロセスによって推定され、オペレータの動作するモード、たとえば（１）ディスクアクセスのない最適モード、（２）ディスクアクセスが行なわれるがディスク上のデータを通るのに１回のパスしか必要とされないワンパスモード、および（３）ディスク上のデータにわたって複数のパスが必要とされる最小モードなどのモードに応じて１つの実現でいくつかの推定値がつくられる。照会を実行するのにオペレータによって必要とされる時間は実行のモードによって異なり、たとえば、図６に示されるように、最適モードでは必要とされる時間が最も少なく、最小モードでは最も長い時間が必要とされ、ワンパスに必要な時間は最大と最小との間である。なお、同じオペレータについて、そのような推定値は入力データのサイズに応じて異なる照会に対して異なり得る。その後、この実現例では、各プロセスはこれら推定値およびメモリの境界に応じてそのオペレータにある量のメモリを割当てる。
【００１８】
たとえば、「ソート」オペレータを呼出すプロセスは、最適メモリ推定値がメモリの境界より小さい場合には最適メモリ推定値、メモリの境界が最適メモリ推定値とワンパスメモリ推定値との間である場合にはワンパスメモリ推定値、メモリの境界がワンパスメモリ推定値よりも小さい場合には最小メモリ推定値というように、割当てられるワークエリアメモリ（「ソートエリア」とも呼ばれる）の量を判定する。
【００１９】
この特定の例では、「ハッシュ結合」オペレータを呼出すプロセスは、最適メモリ推定値がメモリの境界より小さい場合には最適メモリ推定値、メモリの境界が最適メモリ推定値と最小メモリ推定値との間である場合にはメモリの境界、メモリの境界が最小メモリ推定値よりも小さい場合には最小メモリ推定値というように、割当てられるワークエリアメモリ（「ハッシュエリア」とも呼ばれる）の量を判定する。これは、ハッシュ結合オペレータは余分なメモリの利益を受けるが、ソートオペレータは利益を受けないためである。この例では、メモリの境界が最小メモリ推定値を下回る場合、一実施例ではすべてのオペレータはそれぞれの最小メモリ推定値を受取るが、別の実施例ではそのようなオペレータは（メモリの境界が最小メモリ推定値より増やされるまで）待ち行列に入れられる。
【００２０】
したがって、データベースシステム１０は、先行技術のデータベースを使用するときに手動では調整が難しいパラメータをＤＢＡが調整するのを可能にする。具体的には、割当てられるメモリの量の調節は、オペレータの相対的な使用頻度、各オペレータに対するメモリ要件、およびシステム内で同時にアクティブであるオペレータのセットに依存するべきである。これらの条件は１日の中で大きく変化する可能性があり、特にその場限りの環境に対してはそうである。出願人に既知の先行技術のパラメータは自動的に調節されないため、それらはシステムでのメモリの使用の大小を補償しない。また、出願人に既知の先行技術のパラメータは照会が使用するメモリの最大量を制御しないため、メモリの過剰割当を悪化させる傾向があり、しばしばメモリの枯渇によるスラッシングを引起す。最後に、そのような先行技術のパラメータはＰＧＡメモリをしばしば浪費するが、これは受容可能な性能を得るのに必要とされるよりも多くのメモリが割当てられるためである。先行技術で使用されないそのようなメモリは、上述の外部で設定されるグローバルな値１１を使用するときに他の照会または他のアプリケーションによって使用されるようにするのがよい。
【００２１】
上述の動作を実現する一実施例のコンピュータ１００（図１Ｂ）は、オペレーティングシステム１０１、ビジネス論理１０２、ネットワークアプリケーション１０３およびデータベースアプリケーション１１０などのある数のソフトウェアプログラムを実行する。コンピュータ１００はどのようなコンピュータでもよく、IBM personal Computer（ＰＣ）などのコンピュータ、またはUltra SparcII Computer 100などのSunワークステーションであってもよく、命令を実行するための１つまたは複数の中央処理ユニット（ＣＰＵ）、データおよび命令を保持するための不揮発性メモリ（ディスクなど）、および実行中にデータおよび命令を一時的に保持するための揮発性メモリ（たとえば、ＤＲＡＭ）を含む。コンピュータ１００はＣＰＵとメモリとを相互に接続するバスも含む。コンピュータ１００は、情報をユーザに表示するための表示装置（たとえば、ブラウン管）、およびユーザからのコマンドを受取るための１つまたは複数の入力装置（キーボードおよび／またはマウスなど）を含んでもよい。
【００２２】
以下の説明では、明白に示されていない場合でも、そのようなコンピュータ１００の使用が本質的に必要とされる。データベースアプリケーション１１０はさまざまな種類の照会を実行して、データベース（たとえば、リレーショナルデータベースであってもよい）へ情報を記憶し、そこから情報を検索する。各照会は、通常の態様で、ソート、ハッシュ結合およびビットマップマージなどの１つまたは複数のオペレータを介して実行されてもよい。各照会の実行中、コンピュータ１００は以下に説明するようにメモリを割当てる。割当は、（データベースパラメータPGA_AGGREGATE_TARGETの値によって表わされる）外部で設定されるグローバルな値１１に直接的または間接的に基づいてもよい。この特定の実施例では、値１１は、データベース照会を実行するプロセス（「サーバプロセス」と呼ばれることがある）によって内部で使用するために割当てられるメモリの合計に対するターゲットとして使用される。一実施例では、ユーザインターフェイス１１１（図１Ｂ）はデータベースアドミニストレータからグローバルな値１１を受取り（動作１１２を参照）、共有メモリにその値を記憶する（動作１１３を参照）。各プロセスは共有メモリから読出された値１１に（少なくとも部分的に）基づいてその内部使用のためのメモリを割当てる。
【００２３】
データベース１１０の一実施例は命令のシーケンス（以降は「メモリブローカ）１１５を含み、これはグローバルな値１１および任意で現在のメモリの使用についての統計値から内部の値を導き（図１Ｂの動作１１６を参照）、メモリを割当てるときにサーバプロセスによって使用するためにその内部の値を記憶する（動作１１７を参照）。その実現例に応じて、内部の値はすべてのプロセス１２０Ａ〜１２０Ｚによって割当てられるメモリに当てはまるグローバルな内部の値１４であってもよいし、またはオペレータに対して割当てられているメモリにのみ当てはまるオペレータレベルのメモリの境界１７であってもよい。メモリの使用の統計値に基づいて、メモリブローカ１１５はサーバプロセス１２０Ａ〜１２０Ｚによるメモリの割当に応答して内部の値を動的に改める（ここでＡ≦Ｉ≦Ｚであり、Ｚはプロセスの現在の数であり、フィードバックループを形成する（図１Ｂの枝１１８によって示される）。
【００２４】
実施例に応じて、サーバプロセス１２０Ａは、外部で設定されるグローバルな値または内部の値１４および１７のうちの１つを使用して割当てられるメモリを判定し、その後、メモリを割当てる（動作１２１を参照）。次に、プロセス１２０Ａはメモリの使用についての統計値を更新し（たとえば、割当てられたメモリの量を示すため）、通常の態様で照会の実行を進める。照会の処理が完了すると、プロセス１２０Ａは以前に割当てられたメモリの割当を取消し（動作１２３を参照）、メモリの使用の統計値を更新する（動作１２４を参照）。
【００２５】
上述のように、メモリブローカ１１５は動作１１６においてメモリ使用の統計値を使用し、実施例に応じて内部の値１４および１７のどちらかまたは両方を改める。たとえば、メモリブローカ１１５が、プロセスが多くあり過ぎ、割当てられているメモリの合計が外部で設定されるグローバルな値を大きく超えるかもしれないと考えると、この場合、メモリブローカ１１５は内部の値１４および１７のどちらかまたは両方を低減するため、（現在の量より）少ない量のメモリがプロセスによって今後割当てられる。メモリブローカ１１５が、プロセスが少な過ぎ、割当てられているメモリの合計が外部で設定されるグローバルな値１１を大きく下回ると考えると、メモリブローカ１１５は内部の値１４および１７のどちらかまたは両方を増加させて、より多くの量のメモリがプロセスによって今後割当てられるようにすることがある。この実施例では、外部で設定されるグローバルな値１１および内部の値１４ならびに１７は、ある範囲内へのターゲットを満たそうとするデータベースアプリケーション１１０によってターゲットとして扱われる。
【００２６】
この実施例のメモリブローカ１１５は、定期的（たとえば、３秒ごと）に動作して、メモリを割当てるためにプロセス１２０Ａ〜１２０Ｚによって使用されている内部のターゲットを改める。しかしながら、サーバプロセス１２０Ｉは、たとえば、割当てられるメモリの合計が外部で設定されるグローバルな値１１をある予め定められた量だけ超えた場合にメモリブローカ１１５を呼出してもよい。具体的には、一実施例では、プロセス１２０Ａは、プロセス１２０Ａ〜１２０Ｚのすべてによって割当てられるメモリの合計と外部で設定されるグローバルな値１１との差（以降は「ドリフト」）を計算する（図１Ａの動作１２５を参照）。具体的な一実現例では、「ドリフト」は、メモリの境界１７の最後の計算からの増分の割当または割当の解除を示す符号付きの数である。この具体的な実現例は、メモリの境界１７が再計算されるたびにドリフトをゼロに設定する。その後、オペレータに対してメモリを割当てる各プロセス１２０Ｉは、割当てられたメモリの量だけドリフトを増分する（同様に、メモリが解放されると、ドリフトは解放されたメモリの量だけ減分される）。
【００２７】
割当の後、プロセス１２０Ａは、ドリフトが、たとえば外部で設定されるグローバルな値１１の１０％を超えているかをチェックし、そうであればメモリブローカ１１５を呼出す。呼出されると、メモリブローカ１１５は上述の態様で内部の値１４および１７のどちらかまたは両方を改める。プロセス１２０Ａはドリフトも計算し（図１Ｂの動作１２６を参照）、メモリの割当を解除するときにメモリブローカ１１５に警告を与えてもよい。
【００２８】
実施例に応じて、メモリブローカ１１５はグローバルな内部の値１４を使用してオペレータレベルで適用される別の内部の限界１７を計算してもよい。具体的には、そのようなオペレータレベルの限界（「メモリの境界」と呼ばれる）１４１（図２）は共有メモリ１４０に保持され、各照会内の各オペレータに対して、サーバプロセス１２Ａによって割当てられるメモリに対する限界（またはターゲット）を示す。したがって、サーバプロセス１２０Ａ〜１２０Ｚは、メモリの境界１４１を（たとえば、ワンパスモードで動作するのにオペレータにとって）必要なメモリの推定値１４２Ｉと比較して、割当てられるメモリを判定し、その後、適切な量のメモリを割当てる（または実現例応じて待ち行列に入れられる）。なお、この実現例では、同じメモリの境界１４１を使用してすべてのオペレータにメモリを割当てるが、別の実現例では、オペレータの各種類に対して異なるメモリの境界を使用してもよい（たとえば、ハッシュ結合はソートに対する対応する境界と異なる境界を有してもよい）。
【００２９】
推定値１４２Ａ〜１４２Ｐの各々は、メモリが割当てられるオペレータのプロファイル１４３Ｊに保持される。一実現例では、ある数のプロファイル１４３Ａ〜１４３Ｖの各々は共有メモリ１４０に保持される。この実現例では、プロセス１２０Ａ〜１２０Ｚは、最適モード、ワンパスモードおよび最小モードの各々で動作するのに必要とされるメモリの３つの推定値を含む対応するプロファイル１４３Ｊを共有メモリ１４０に作ることによって、各オペレータを登録する（図１Ｂの動作１２７を参照）。「最適」モードは「キャッシュ」モードとも称される。なぜなら、実行中にオペレータによってディスクアクセスが必要とされないためである。
【００３０】
その後、プロセス１２０Ｉは、最適メモリ推定値１４２Ｐがメモリの境界１４１よりも小さい場合には最適メモリ推定値１４２Ｐ（図３の動作１５１〜１５２を参照）、メモリの境界１４１が最適メモリ推定値１４２Ｐとワンパスメモリ推定値１４２Ｉ（図２）との間である場合にはワンパスメモリ推定値１４２Ｉ（図３の動作１５３〜１５４を参照）、メモリの境界１４１が最小メモリ推定値１４２Ｉ（図２）より小さい場合には最小メモリ推定値１４２Ａ（図３の動作１５５を参照）のように、データベースアプリケーション内のソートオペレータに対して割当てるメモリの量を判定する。ソートオペレータは、ワンパス推定値からキャッシュ推定値へのメモリの増加の利益をあまり受けないため（最適からワンパスへのメモリの増加と比較して）、この説明したばかりの割当が使用される。
【００３１】
他のところで述べるように、これから割当てられるメモリの量の判定の具体的な方法はプロセスの属性（たとえば、優先順位）またはオペレータなどのいくつかの要因によって異なる。図１Ｂの動作１２７は任意であり、共有メモリ１４０にオペレータのプロファイルを登録する必要はなく、その代わりに他の実現例では、そのようなプロファイルは各プロセス１２０Ａによってそれ自身の内部のメモリに個々に維持される。
【００３２】
なお、最小メモリ推定値１４２Ａは一部のオペレータに対してメモリの境界１４１より大きくてもよく、１つの実施例ではそのようなプロセスは待ち行列に入れられず、最小メモリ推定値１４２Ａを割当てることを許可されるため、照会が実行される。そのような場合に、他のプロセスが過少に割当てる場合、すなわちメモリの境界１４１よりも少なく割当てる場合、アプリケーションによって割当てられるメモリの合計は外部で設定されるグローバルな値１１を下回ることがある。しかしながら、メモリの境界１４１より多くのメモリを割当てるプロセス１２０Ａ〜１２０Ｚは過少に割当てるプロセスを上回ることがあり、割当てられるメモリの合計が外部で設定されるグローバルな値１１を超え、グローバルな内部の値１４が（メモリブローカ１１５によって）低減され、メモリの境界１４１が（これもメモリブローカ１１５によって）低減されることがある。その後、プロセス１２０Ａ〜１２０Ｚは、値１１が変更されないままであれば割当てたであろう量よりも少ない量のメモリを割当てさせられる。このように、プロセス１２０Ａ〜１２０Ｚの間ではある妥協が行なわれるため、外部で設定されるグローバルな値１１が達成される。プロセス１２０Ａ〜１２０Ｚの合計数が過剰な場合、たとえばすべてのプロセスに対する最小メモリ推定値１４２Ａ〜１４２Ｚの和が値１１を超える場合、どのプロセスに対しても付加的なメモリは割当てられず、その代わりにメモリの要求は待ち行列に入れられる。
【００３３】
一実施例では、プロセス１２０Ａ〜１２０Ｚは、図１Ａに関して述べたように、メモリが割当てられるかまたは割当が解除されるたびにメモリの使用についての統計値１６０（図２）の更新も行なう。具体的には、統計値１６０は割当てられているが使用されていないメモリ（「フリーなメモリ」と呼ばれる）１６１（図２および図４）の量を含む。たとえば、プロセス１２０Ｉは１ＭＢを割当てる必要があり得るが、オペレーティングシステム１０１が４ＭＢの増分でのみメモリを提供する場合（たとえば、これがページサイズであるため）、３ＭＢはフリーなメモリであり、４ＭＢは割当てられたメモリであり、１ＭＢは使用されるメモリである。フリーなメモリ１６１（図４）は、通常他のプロセス１２０Ｊには利用できない。
【００３４】
プロセス１２０Ａ〜１２０Ｚは、統計値１６０において、照会を実現するオペレータ（たとえば、ソート、ハッシュ結合およびビットマップマージなど）に関連しないメモリ（「その他のメモリ」と呼ばれる）１６２（図２および図４）の量も更新する。たとえば、プロセス１２０Ｉは、照会実現オペレータに関連せずかつメモリ１６２が使用されるＰＬ／ＳＱＬまたはＪＡＶＡ（Ｒ）命令シーケンスを含んでもよい。通常、その他のメモリ１６２は、オペレータが機能する態様（たとえば、ワンパス対マルチパスなど）を変更することで変更することはできない。
【００３５】
プロセス１２０Ａ〜１２０Ｚは、統計値１６０において、オペレータによって実際に使用されるメモリ（「ワークエリアメモリ」と呼ばれる）の量１６３も維持する。プロセス１２０Ａ〜１２０Ｚによる統計値１６０の維持は、一実施例では「マロック（malloc）」および「フリー（free）」を呼出すラッパー関数で実現される。さらに、統計値１６０は個々のプロセス１２０Ａ〜１２０Ｚの各々に対して別々に維持してもよく、またはこれに代えて、各統計値の総合計（すべてのプロセス１２０Ａ〜１２０Ｚにわたる）を維持してもよい。
【００３６】
一実施例では、メモリブローカ１１５は上述の統計値１６０を使用してグローバルな内部の値１４を以下のように計算する（図５にTiとして示され、これは以下の態様でワークエリアメモリ１６３の量に対するターゲットとして使用される。具体的には、メモリブローカ１１５はまず、使用されるメモリ１６４（図５にUmとして示される）とワークエリアメモリ１６３（図５にWmとして示される）との差であるその他のメモリ１６２（図５にＯｍとして示される）を計算する。次に、メモリブローカ１１５は外部で設定されるグローバルな値１１（「PGA AGGREGATE TARGET」とも呼ばれ、図５にTpgaとして示される）がその他のメモリ１６２より小さいかをチェックし（図５の動作１７２を参照）、そうであれはTiがTpgaの６％になるように設定する。
【００３７】
したがって、あり得る最悪の場合、その他のメモリ１６２のメモリが大きすぎると、Tpgaのある最小値（たとえば、６％）がグローバルな内部の値１４として使用される。これは、その他のメモリ１６２のサイズがメモリブローカ１１５の制御を超越しているためである。その他のメモリ１６２がTpgaより小さい場合、動作１７４で、メモリブローカ１１５はグローバルな内部の値１４をTpgaとOmとの差の９０％に設定し、動作１７５に進む。これは、メモリブローカ１１５の２つの連続する動作間の時間に割当てられるメモリの変化を勘案するための「安全策」として行なわれる（一例では、割当てられたメモリは３秒で１０％より速く大きくなるとは予想されない）。
【００３８】
次に、動作１７５では、メモリブローカ１１５は割当てられたメモリ（図５にAmとして示される）がTpgaより大きいかをチェックし、そうであれば動作１７６に進み（過剰割当に対処するため）、または動作１７７に進む（過小割当に対処するため）。動作１７６では、メモリブローカ１１５は、比率Wm／（Om＋Wm）として係数Fwa（「ワークエリア割当係数」とも呼ばれる）を計算し、さらに比率（Am−Tpga）／Amとして別の係数Foa（「過剰割当係数」とも呼ばれる）を計算し、現在の限界Tiを（１−Fwa＊Foa）で乗じたものが新しい限界Tiだと判定する。
【００３９】
動作１７７では、メモリブローカ１１５はAmの９０％がTpgaより小さいか、およびすべての最適メモリ割当の和がTpgaより大きいかもチェックし、そうであれば、Tiには変更は行なわれない。またこれに代えて、メモリブローカ１１５は動作１７９に進み、上述のワークエリア割当係数Fwaを計算する。次に、動作１８０では、メモリブローカ１１５は比率（Tpga−Am）／Tpgaとして過小割当係数Fua（「ブースティング係数」とも呼ばれる）を計算する。次に、メモリブローカ１１５は現在の限界Tiを（１＋Fwa＊Fua）で乗じたものを新しい限界Tiとして計算する。次に、メモリブローカ１１５は（動作１８２で）新たに計算された限界TiまたはTpgaの６％のどちらか大きい方をグローバルな内部の値１４として設定し、これはここに記載されるように使用される。
【００４０】
具体的には、今後、新たに計算されたグローバルな内部の値１４がさまざまなオペレータによって必要とされるメモリを割当てるために使用される。他のところに記載されるように、そのようなグローバルな内部の値１４は、（各個々のオペレータに対してメモリを割当てている）プロセスによって直接的に使用してもよいし、またはそのようなプロセスによって使用されるメモリの境界１７を計算するために使用してもよい。１つの具体的な実施例では、メモリの境界１７は添付の付録の擬似コードに説明されるようにグローバルな内部の値１４から計算される。
【００４１】
ここに記載されるメモリの自動的かつ動的な割当は、たとえば、２つの値AUTOおよびMANUALの１つに設定され得る“WORKAREA_SIZE_POLECY”と呼ばれ得るデータベースパラメータを使用することで、先行技術の手動のメカニズムと組合せて使用してもよい。このパラメータをAUTOに設定すると自動的かつ動的な割当が呼出される。また、（上述の）別のデータベースパラメータPGA_AGGREGATE_TARGETを実現してもよく、データベースアドミニストレータによって設定されるとき、パラメータWORKAREA_SIZE_POLICYのデフォルト値は自動的にAUTOに設定される。
【００４２】
またはこれに代えて、パラメータWORKAREA_SIZE_POLICYの値は、PGA_AGGREGATE_TARGETが設定されていないときに自動的にMANUALに設定される。パラメータWORKAREA_SIZE_POLICYがMANUALに設定されている場合、PGA_AGGREGATE_TARGETはこの実施例では使用されず、その代わりにデータベースは先行技術のメカニズムを使用する（たとえば、各オペレータに対してメモリ上でデータベースアドミニストレータによって設定された個々のターゲットを使用することによって）。
【００４３】
自動および手動のメカニズムは、たとえば後方互換性を維持するために組込んでもよく、一部のオペレータは手動のメカニズムを使用し、一部は自動のメカニズムを使用してもよい。そのような組合せの動作の場合、グローバルな内部の値１４は、手動のメカニズムによって使用されるメモリを収容するために自動的に低減される。
【００４４】
メモリの使用に応じて、メモリブローカ１１５はオペレータがメモリを割当てるとすぐ、たとえば、動作する照会の数に急激な増加がある場合にメモリの境界１７を低減することがある。逆に、メモリの低下の要求がある場合にはメモリの境界１７を増加させてもよい。メモリの境界１７に対する新しい内部の値が計算されると、値１７は１つの具体的な実施例では、メモリを割当てようとしている新しいオペレータにのみ計算後に適用される。代替の実施例では、メモリの境界１７のそのような新しい値は、以前にメモリを割当てかつ現在実行しているオペレータによっても使用され、これによって実行中にそれらの以前に割当てられたメモリが低減（または増加）される。
【００４５】
メモリの境界１７の変化に対するオペレータの応答性は、ある所与の間隔内でメモリブローカ１１５がメモリの境界１７を再計算する回数、および／またはメモリの境界１７での変化の量に影響し得る。たとえば、現在実行しているオペレータが応答性に欠けるかまたは応答が遅い場合（メモリブローカ１１５の応答性と比較して）、メモリブローカ１１５はグローバルな内部の値１４およびメモリの境界１７を繰返し低減し、割当てられるメモリの合計が外部で設定されるグローバルな値１１のターゲットに近づくようにする。
【００４６】
メモリの割当の後のメモリの境界１７の変化に応答するため、オペレータ（ソートおよびハッシュ結合など）は、それらの実行中の都合のよい時点でメモリの境界１７（またはグローバルな内部の値１４）に変化がないかをチェックしてもよい。メモリの境界１７（またはグローバルな内部の値１４）の変化がチェックされる点は、同期的（たとえば、毎秒ごと）または非同期的（たとえば、オペレータの実行中に１つまたは複数の動作が行なわれた後）にセットアップしてもよい。両方の実施例において、オペレータは、メモリブローカ１１５によって行なわれる決定によって、たとえば最適からワンパス、またはワンパスから最小へとモードを変更し、そのためそれらの割当てられるメモリも変化する。さらに、そのような実施例のオペレータは、それらの実行中にメモリ要件の推定値を動的に改めてもよい。モードの変更および割当てられたメモリの変更を実行中に実現するためのハッシュ結合オペレータおよびソートオペレータに対する修正は以下に簡単に述べる。
【００４７】
一実施例では、（上述の）AUTOバージョンのハッシュ結合オペレータはそのワークエリアについての情報を登録する（たとえば、最適モード、ワンパスモードおよび最小モードの３つのモードの各々で必要とされるメモリの推定値を記憶する）。この実施例では、各オペレータに対する「モード」と呼ばれる変数（ＳＧＡにある）は、オペレータの動作の現在のモードを示し、そのメモリの使用を示す。この実施例では、各オペレータに対する「モード」変数はこの実施例のオペレータによってのみ変更される（別の実施例ではメモリブローカ１１５がそのような変更を行なってもよい）。
【００４８】
メモリの境界１７が十分に大きい限り、ハッシュ結合オペレータは最適で動作し、ハッシュ結合オペレータはメモリの当初の量を割当て、そのメモリを（最適モード推定値まで）動的に増加させて入力行を記憶する。しかしながら、最適モードで動作しているときでも、ハッシュ結合オペレータはワンパス要件に基づいて入力データを分割し、メモリの境界１７が低減された場合にワンパスモードへと切換わるのを可能にする。この実施例では、メモリでのビルドのときに、メモリの境界１７が最適からワンパスへのモードの変更を引起こすのに十分に低減された場合、ハッシュ結合オペレータは適切な量のデータをディスクにフラッシュすることによって、そのワークエリアをワンパス要件へとサイズを変更する。
【００４９】
（ビルド局面での）ワンパスモード中、ハッシュ結合オペレータは通常の態様で働く。しかしながら、ワークエリアは１つのビルドパーティション、および付加的なパーティション当たり１つまたは複数のＩＯスロットを含むようにサイズを決められる（非同期的な入出力をサポートするため）。この局面中、ワークエリアは入力が予想よりもはるかに大きい場合でもサイズ変更されない。ハッシュ結合オペレータは、ビルドが開始されたときにワンパスモードに対して推定された量のメモリのみを使用する。
【００５０】
一旦最初のワンパスビルド（最初のビルド）が終わると、ビルドの各パーティションのサイズがわかる。最も大きいパーティションの実際のサイズが各パーティションに対して予想される共通のサイズ（たとえば、ワンパスサイズ）より２倍（またはそれ以上）大きい場合、ハッシュ結合オペレータは、最初のビルドからの行を使用して再ビルドする。再ビルドの動作は正確なサイズを使用してビルドパーティションの理想的な数を判定し、したがってワークエリアメモリのより正確な推定値を判定する。
【００５１】
２回目のビルドは（たいていの場合）最初のビルドよりも速い。なぜなら、再ビルド中の入力データサイズはもともとのデータサイズよりも小さく、ビルド時間は一般にプローブ時間と比較して非常に小さいためである。また、余分な再ビルド時間は、ハッシュ結合オペレータの全体的な実行時間と比較すればとるに足りないものである。なぜなら、プローブ時間の方がずっと大きいためである。しかしながら、そのような再ビルドからセーブされるメモリは巨大な場合がある（推定値にエラーがある場合、入力サイズは重要である）。
【００５２】
メモリの境界１７が「キャッシュ」（「最適」とも呼ばれる）モードでの実行を可能にするほど大きい限り、ハッシュ結合はメモリでプローブする。境界１７が「ワンパス」へのモードの変更を引き起こすほど十分に低減されると、ハッシュ結合はハッシュエリアのサイズを変更することでワンパスプローブへと切換わる。そのとき、パーティションのサブセットがディスクへとフラッシュされ、メモリに残っているパーティションとともにプローブはワンパスモードで進む。後に、メモリの境界１７がワンパス推定値よりも小さく改められた場合、現在メモリに残っているすべてのビルドパーティションはディスクへとフラッシュされる。プローブは最小要件（たとえば、パーティション当たり２スロット）に基づいて分割される。
【００５３】
ビルド／プローブパーティションの各対に対して、ハッシュ結合オペレータは、２つのパーティションの最も小さいものをメモリにキャッシュするために十分なメモリを割当てる。あり得る余分なビルド局面のため、消費されるメモリは入力サイズの測定値が不正確な場合でも理想的なワンパスメモリ要件に近いべきである。
【００５４】
「AUTO」バージョン（上述）で動作しているときにソートオペレータに行なわれる修正は、ハッシュ結合オペレータに行なわれるものと類似である。ソートオペレータはどの時点でも最適モードからワンパスモードへと切換わることができる。ソートオペレータは入力サイズの不良な測定値を勘案するために、各ソートのランのサイズを徐々に増加させる。このようにして、ソートオペレータは常にメモリの小幅な増加を用いてワンパスマージを行なう。
【００５５】
一実施例では、ソートオペレータによって推定されるワークエリアがある予め定められた値（１２８ＫＢなど）を超えた場合、ソートオペレータはそのワークエリアプロファイル（推定値を含む）を登録する。予め定められた値に等しいかそれより小さい推定値は登録されず、オンライントランザクション処理（ＯＬＴＰ）環境におけるメモリブローカ１１５の使用の影響が限られる。ソートオペレータへの入力は、多くの場合、他の環境と比較して非常に小さい。したがって、メモリブローカ１１５の小さなワークエリアに対する関与は避けられる。
【００５６】
ソートオペレータの最適モードはMANUAL（上述）バージョンのソートオペレータに類似である。下にある行ソースからフェッチされた行はソートオペレータのワークエリアに加えられる。ワークエリアのサイズは怠惰な態様で増加される。どこかの時点でメモリ要件が最適メモリ推定値よりも大きい場合（たとえば、入力が予想よりも大きい場合）、３つの測定値のうちの１つまたは複数が更新される。メモリの境界１７が現在の実行に対して最適メモリ推定値の割当を可能にするのに十分に大きい限り、ソートオペレータは、ソートが開始されたときに作られた当初の最適メモリ推定値よりも要件が大きい場合でもそのワークエリアを拡張し続ける。
【００５７】
どこかの時点でメモリの境界１７が最適からワンパスへのモードの変更を引き起こすのに十分に低減された場合、ソートオペレータは現在および最初のソートのランをディスクへとフラッシュする。次に、ソートオペレータは現在のワンパスメモリ推定値へとワークエリアを縮小する、その時点で、ソートオペレータはワンパスモードへと切換わる。
【００５８】
ワンパスモードでは、ソートオペレータは入力サイズの不良な測定値を勘案するためそのワークエリアを動的に拡張する。たとえば、実際の入力サイズが、予想されるサイズの１００ＭＢではなく、８００ＭＢであると仮定する（８倍離れている）。ソートオペレータがソートのランの最初のセットを生成するとき、推定された１００ＭＢの入力サイズに基づいてワークエリアのサイズを決める。このことによって、６４ＫＢ入出力サイズを仮定して当初のワークエリアサイズは２．５ＭＢとなる。１００ＭＢの入力が一旦消費されると、これは４０のランに対応し、ソートオペレータはより多くの行をソートする必要があると気づく。その時点で、ソートオペレータは推定入力サイズが２倍離れていることを前提とし、１００ＭＢでなく２００ＭＢの新しい推定値を仮定する。この新しい推定値に基づいて、ワークエリアは、その実際のサイズを係数sqrt(2)で乗じることでサイズを変更される。なぜなら、ワンパスに必要とされるメモリは入力サイズの平方根として変化するためである。入力からのすべての行が消費されるまで、同じ技術が繰返される。
【００５９】
この例では、最初の１００ＭＢに対して各々２．５ＭＢの４０のランがあり、次の１００ＭＢに対して各々３．５ＭＢの２９のランがあり、次の２００ＭＢに対して各々５ＭＢの４０のランがあり、最後の４００ＭＢに対して各々７ＭＢの５６のランがあってもよい。ソートオペレータの最初の局面の終了時で、入力サイズが８００ＭＢであると最初からわかっていれば得られたであろう「理想的な」回数の１１４のランではなく、合計１６５のランがある。これらのランは１０．３ＭＢ（１６５×６４ＫＢ）のマージエリアを使用してワンパス動作でマージされる。これは、１２８である理想的なランの回数のワンパスマージに必要とされる８ＭＢ（１２８×６４ＫＢ）よりもわずかに大きいメモリである。
【００６０】
一般に、ソートオペレータへの入力の推定されるサイズSestimは理想的な入力サイズＳと比較して最大で係数２nだけ離れている（すなわち、２n-1Ｓ＜Sestim＜＝２nＳ）。ソートランの最終的な回数Nfinalは次のように表わすことができる。
【００６１】
【数１】
2005508033.tif 000003
【００６２】
ここで、Ｎは実際のサイズＳに対する理想的なランの回数である（すなわち、Ｎ＝sqrt（Ｓ／Ｃ））。上述の例では、８倍離れているので、ｎは３である。上述の式を使用すると、当業者はソートオペレータが理想的なワンパスのランの回数の１．４５倍を生成すると計算できる。それはワンパスマージ局面が理想的なワンパスメモリの１．４５倍消費することを意味する。ｎが１であるとき（２倍離れている）、この係数は１．２であり、ｎ
が無限であるとき、この係数は１／（２−sqrt（２））に集束し、１．７である。このため、最悪の場合、余分なメモリの消費はマージ局面中、理想の要件の１．７倍に制限される（既知の入力サイズを仮定して）。また、ソートオペレータ全体でのメモリ消費が考慮される場合、それはわずかに小さい。なぜなら、ランは理想的なメモリよりも少ないメモリを使用して生成されるためである。
【００６３】
この技術がなければ、ワンパスマージを行なうと、ワンパスマージに対するメモリよりも２n多いメモリが必要となる。メモリの消費の面では、これよりさらに悪い。なぜなら、マージパスの継続時間はランの回数に比例するからである。動的にワークエリアのサイズを適合しないと、ソートオペレータは（小さな）多くのランを生成し、マージ局面の継続時間を増加させる。
【００６４】
この開示を見れば、当業者にはここに記載される実施例および実現例のさまざまな修正および適合が明らかとなるであろう。たとえば、照会の実行の完了後、その照会に特有な統計値を保存して、その同じ照会を（たとえば、別のプロセスによって）再び実行する必要があるときに推定値を作るのに使用してもよい。
【００６５】
すべてのアクティブなオペレータがそれらの最小のメモリを用いて動作することができる場合で、より多くのメモリが利用可能であると仮定すると、メモリブローカはメモリの増加の利益を最も受けるオペレータにまずメモリを割当ててもよい。たとえば、より多くのメモリをハッシュ結合オペレータに与えてその応答時間が５分から１分へと低減されるように（５倍の高速化）メモリブローカをプログラムしてもよいし、対して同じ量のメモリを別のハッシュ結合オペレータに与えてその応答時間が１時間から３０分に低減されるようにしてもよい（たった２倍の高速化）。したがって、一実施例は応答時間の高速化を考慮し、絶対的な時間の改善は考慮していない。さらに、メモリの境界はここに記載するように（プライベートなメモリでなく）共有メモリのオペレータによって必要とされるすべてのメモリを割当てるデータベースで使用することができる。
【００６６】
したがって、ここに記載される実施例および実現例のさまざまな修正および適合は特許請求の範囲に含まれる。
【００６７】
付録
2005508033.tif 000004
2005508033.tif 000005
2005508033.tif 000006
【図面の簡単な説明】
【００６８】
【図１Ａ】この発明に従ってプログラムされたコンピュータのデータおよび論理を示すデータフロー図である。
【図１Ｂ】図１Ａに示される種類のコンピュータでアプリケーションによって行なわれる動作を示す図である。
【図２】図１Ｂに示される種類の複数のサーバプロセスによる共有メモリの使用を示す高レベルなブロック図である。
【図３】図１Ｂのサーバプロセスによって行なわれる比較動作の一実施例で行なわれる動作のフローチャートである。
【図４】図１Ｂの１つまたは複数のサーバプロセスに割当てられるメモリをともに形成するさまざまな構成要素のベン図である。
【図５】内部のターゲットを判定する動作の一実施例で図１Ｂのメモリブローカによって行なわれる動作のフローチャートである。
【図１Ａ】
2005508033.tif 000007
【図１Ｂ】
2005508033.tif 000008
【図２】
2005508033.tif 000009
【図３】
2005508033.tif 000010
【図４】
2005508033.tif 000011
【図５】
2005508033.tif 000012
【国際公開パンフレット】
2005508033.tif 000013
2005508033.tif 000014
2005508033.tif 000015
2005508033.tif 000016
2005508033.tif 000017
2005508033.tif 000018
2005508033.tif 000019
2005508033.tif 000020
2005508033.tif 000021
2005508033.tif 000022
2005508033.tif 000023
2005508033.tif 000024
2005508033.tif 000025
2005508033.tif 000026
2005508033.tif 000027
2005508033.tif 000028
2005508033.tif 000029
2005508033.tif 000030
2005508033.tif 000031
2005508033.tif 000032
2005508033.tif 000033
2005508033.tif 000034
2005508033.tif 000035
2005508033.tif 000036
2005508033.tif 000037
2005508033.tif 000038
2005508033.tif 000039
2005508033.tif 000040
2005508033.tif 000041
2005508033.tif 000042
2005508033.tif 000043
2005508033.tif 000044
2005508033.tif 000045
2005508033.tif 000046
【国際公開パンフレット（コレクトバージョン）】
2005508033.tif 000047
2005508033.tif 000048
【国際調査報告】
2005508033.tif 000049
2005508033.tif 000050
2005508033.tif 000051