(57)【要約】      （修正有）【課題】データベースを参照する際の参照コストの増加を抑制したインデックス生成方法及び計算機システムを提供する。【解決手段】ＳＱＬ処理部１１１、パラメータ管理部１１２、バッファメモリ１１５、バッファメモリ管理部１１４、パラメータ生成部１１３、インデックス生成部１１６からなり、パラメータ生成部はパラメータ管理部から生成するインデックスの基本情報、テーブル情報、バッファメモリ容量を取得し、バッファメモリ容量と生成するインデックスの容量を比較してインデックスの階層ごとに充填率を計算する手段と、新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較する手段と、比較の結果、前記バッファメモリ容量の容量が不足する場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する手段とを持つ計算機システム。【選択図】図１
2014130492.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとバッファメモリと記憶装置とを備えた計算機システムであって、
前記記憶装置は、情報が格納されたテーブルを有し、
前記バッファメモリ及び前記記憶装置は、各々、前記テーブルを検索するためのインデックスの格納領域を有しており、
前記インデックスは、根ノードと葉ノードを含む複数のノードからなる階層構造のインデックスであり、
前記計算機システムは、
新たに生成する前記インデックスの容量と前記バッファメモリ容量とを比較して前記インデックスの階層ごとに充填率を計算する機能と、
設定された条件の範囲で各階層の前記充填率を小さくする機能と、
新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較する機能と、
比較の結果、前記バッファメモリ容量の容量が不足する場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する機能とを有する
ことを特徴とする計算機システム。
【請求項２】
請求項１において、
新たに生成する前記インデックスの階層数が元のインデックスの階層数に対して減少している場合には、前記葉ノードの充填率を低くし前記階層ごとに前記充填率を再設定することにより前記階層数が変化しないようにした新たな前記インデックスを生成する機能を有する
ことを特徴とする計算機システム。
【請求項３】
請求項２において、
前記インデックスは、データを格納するページと、前記テーブルのページが保持するキー値と、前記各ページへのポインタを含み、
前記記憶装置は、前記インデックスごとに生成されるインデックス管理情報を有し、
前記インデックス管理情報は、前記インデックスの階層ごとの各階層のページ数及び充填率の情報を有しており、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層の前記ページを前記バッファメモリに配置可能か否かを判定する機能と、
前記インデックスの前記ページの全てを格納しても前記バッファメモリに空き容量がある場合には、前記各階層のノードの充填率を小さくして新たな前記インデックスを生成するする機能とを有する
ことを特徴とする計算機システム。
【請求項４】
請求項２において、
前記インデックスは、前記根ノードと前記葉ノードの間に少なくとも２階層の内部ノードを有し、かつ、データを格納するページと、前記テーブルのページが保持するキー値と、前記各ページへのポインタを含み、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層のページを前記バッファメモリに配置可能か否かを判定する機能と、
前記インデックスの前記ページの全てを格納できない場合には、前記内部ノードの充填率が、前記葉ノードに近い前記内部ノードの充填率ほど高く、前記根ノードに近い前記内部ノードの充填率ほど低くなるように再設定して新たな前記インデックスを生成するする機能とを有する
ことを特徴とする計算機システム。
【請求項５】
プロセッサとバッファメモリと記憶装置とを備えた計算機システムであって、
前記記憶装置は、情報が格納されたテーブルを有し、
前記バッファメモリ及び前記記憶装置は、各々、前記テーブルを検索するためのインデックスの格納領域を有しており、
前記インデックスは、根ノードと葉ノードを含む複数のノードからなる階層構造のインデックスであり、
前記計算機システムは、
入力データに基づいて、前記インデックスを生成するためのパラメータをインデックス管理情報として生成するパラメータ生成部と、
前記インデックス管理情報と前記入力データに基づいて、前記インデックスを生成するインデックス生成部とを備えており、
前記インデックス管理情報は、前記インデックスの階層ごとのページ数及び充填率の情報を有しており、
新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較し、前記バッファメモリ容量の容量が不足している場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する
ことを特徴とする計算機システム。
【請求項６】
請求項５において、
新たに生成する前記インデックスの階層数が元のインデックスの階層数に対して減少している場合には、前記葉ノードの充填率を低くし前記階層ごとに前記充填率を再設定することにより前記階層数が変化しないようにした新たな前記インデックスを生成する
ことを特徴とする計算機システム。
【請求項７】
請求項６において、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層のページを前記バッファメモリに配置可能か否かを判定し、
前記インデックスの前記ページの全てを格納しても前記バッファメモリに空き容量がある場合には、前記各階層のノードの充填率を小さくして新たな前記インデックスを生成する
ことを特徴とする計算機システム。
【請求項８】
請求項６において、
前記入力データを受け付けて処理するＳＱＬ処理部と、
前記ＳＱＬ処理部の処理結果の情報を管理するパラメータ管理部と、
前記バッファメモリの使用用途や容量を管理するバッファメモリ管理部とを備えており、
前記記憶装置は、前記インデックスのインデックス名、レコード数、キー長の情報を含むテーブル管理情報を有し、
前記パラメータ管理部は、前記ＳＱＬ処理部から受信したデータに基づき、前記記憶装置に前記テーブル管理情報を作成し、前記インデックス名、前記レコード数、前記キー長を更新し、
前記パラメータ管理部は、前記ＳＱＬ処理部からの前記データを全て前記テーブル管理情報に更新し、
前記パラメータ生成部及び前記インデックス生成部は、前記インデックス名毎に、前記階層構造の設定、更新を行う
ことを特徴とする計算機システム。
【請求項９】
請求項７において、
前記記憶装置は、ユーザ設定情報及び前記インデックスごとに生成される前記インデックス管理情報を有し、
前記ユーザ設定情報は、前記インデックス名毎に、レコードのキー値及び前記ページのポインタからなるエッジやレコードを格納するページサイズ、前記ページに格納するエッジやレコードの最大充填率、前記ページに格納する前記エッジや前記レコードの最小充填率、前記テーブルや前記インデックスが利用可能な前記バッファメモリ容量に関して、各々に対応する数値データが格納されており、
前記インデックス管理情報は、前記パラメータ名として、前記インデックス名、前記インデックスの階層数、前記葉ノードの最大エッジ格納数、内部ノードの最大エッジ格納数、前記根ノードの最大エッジ格納数、前記インデックスの各階層の前記ページ数、前記インデックスの各階層の前記充填率、前記インデックスの各階層のページの総容量を保持しており、
前記パラメータ生成部及び前記インデックス生成部は、前記ユーザ設定情報及び前記インデックス管理情報に基づいて前記階層構造の設定、更新を行う
ことを特徴とする計算機システム。
【請求項１０】
計算機システムにおけるインデックスの生成方法であって、
前記計算機システムは、プロセッサとバッファメモリと記憶装置とを備え、
前記記憶装置は、情報が格納されたテーブルを有し、
前記バッファメモリ及び前記記憶装置は、各々、前記テーブルを検索するためのインデックスの格納領域を有しており、
前記インデックスは、根ノードと葉ノードを含む複数のノードからなる階層構造のインデックスであり、
設定された条件の範囲で各階層の充填率を小さくしながら、新たに生成する前記インデックスの階層ごとに前記充填率を計算し、
新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較し、
比較の結果、前記バッファメモリ容量の容量が不足する場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【請求項１１】
請求項１０において、
新たに生成する前記インデックスの階層数が元のインデックスの階層数に対して減少している場合には、前記葉ノードの充填率を低くし前記階層ごとに前記充填率を再設定することにより前記階層数が変化しないようにした新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【請求項１２】
請求項１１において、
前記インデックスは、データを格納するページと、前記テーブルのページが保持するキー値と、前記各ページへのポインタを含み、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層の前記ページを前記バッファメモリに配置可能か否かを判定し、
前記インデックスの前記ページの全てを格納しても前記バッファメモリに空き容量がある場合には、前記各階層のノードの充填率を小さくして新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【請求項１３】
請求項１２において、
新たに生成する前記インデックスの階層数が元のインデックスの階層数に対して減少している場合には、前記葉ノードの充填率を低くし前記階層ごとに前記充填率を再設定することにより前記階層数が変化しないようにした新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【請求項１４】
請求項１２において、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層のページを前記バッファメモリに配置可能か否かを判定し、
前記インデックスの前記ページの全てを格納しても前記バッファメモリに空き容量がある場合には、前記各階層のノードの充填率を小さくして新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【請求項１５】
請求項１３において、
前記インデックスは、前記根ノードと前記葉ノードの間に少なくとも２階層の内部ノードを有し、
前記インデックスの容量と前記格納領域の容量との比較において、前記インデックスの全階層のページを前記バッファメモリに配置可能か否かを判定し、
前記インデックスの前記ページの全てを格納できない場合には、前記内部ノードの充填率が、前記葉ノードに近い前記内部ノードの充填率ほど高く、前記根ノードに近い前記内部ノードの充填率ほど低くなるように再設定して新たな前記インデックスを生成する
ことを特徴とするインデックスの生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、インデックスを生成する方法及び計算機システムに係り、特に、大規模なデータを処理して情報検索を行う計算機システムにおいて、計算機システムが保持するバッファメモリの容量に最適な木構造のインデックスを生成する方法及び装置に関する。
【背景技術】
【０００２】
従来から、データベースやファイルシステムなどで検索を行う際に、情報が格納されたテーブルを高速に検索するために、インデックスと呼ばれるデータ構造が用いられている。また、インデックスは、レコードの追加、削除、更新などにも使用され、一般的にレコードの操作を補助する役割を持つ。
【０００３】
インデックスのデータ構造として、木構造のインデックスであるＢａｌａｎｃｅｄ  Ｔｒｅｅ（Ｂ木）がよく知られており、データベースやファイルシステムなどに用いられている。木構造は、接点（ノード：ｎｏｄｅ）と辺（エッジ：ｅｄｇｅ）で構成されている。一般的には、各ノードは１つ以上のエッジを格納するページと呼ばれるデータ構造を持ち、エッジはキー値とポインタで構成されている。インデックスは、テーブルの特定列の値を高速に検索するために、特定列の値をもとに生成されている。キー値とは、インデックスを生成する特定列の値である。ポインタは、インデックスのページを示す情報である。また、木構造の最上位層のノードを根ノード（ｒｏｏｔ  ｎｏｄｅ）、中間層のノードを内部ノード（ｉｎｔｅｒｎａｌ  ｎｏｄｅ）、最下位層のノードを葉ノード（ｌｅａｆ  ｎｏｄｅ）と呼び、これらが相互にリンクしている。非特許文献１によれば、Ｂ木アルゴリズムは、根ノードから全ての葉ノードまでの階層数を全て同じにする木構造を有していることが特徴である。
【０００４】
Ｂ木インデックスにレコードを追加するとき、レコードのエッジは葉ノードのページに空きがあれば、エッジを追加することができる。しかし、ページにエッジを格納する空きが無ければ、エッジ数が半分となるようにページを２つに分割し、上位層の内部ノードのページに分割したページに対するエッジを追加する必要がある。また、内部ノードのページにもエッジを格納する空きが無ければ、同様の処理がより上位層のノードにも伝播する。このページ分割が根ノードに達し、根ノードのページにもエッジを格納する空きが無ければ、Ｂ木インデックスの階層数は１つ増える。
【０００５】
このように、Ｂ木インデックスのレコード追加で発生するページ分割は、処理負荷が大きく、インデックスの階層が増える場合には検索速度の低下を招く。
【０００６】
レコード追加時のページ分割回数を削減する手法として、特許文献１に開示の技術がある。特許文献１では、時間経過に伴ってインデックスに追加するレコードのキー値の単調増加、単調減少、ゆらぎ（キー傾向）を判定する。このキー傾向の判定結果に基づいてレコード追加時に発生するページ分割で、２つのページが持つエッジの分割割合（充填率）を変更する手法が開示されている。この手法によって、ページの分割回数削減によるレコードの追加処理負荷軽減とページの充填率変更によるインデックス容量の削減が実現されている。
【０００７】
また、処理速度を向上させる手法としては、非特許文献１に開示の技術がある。非特許文献１では、計算機システムのメモリに従来よりも多くのインデックスを格納するために、インデックスのページを圧縮することやメモリとストレージでページの構造を変える手法が開示されている。非特許文献１に開示の技術を用いることによって、レスポンス時間の大きいストレージアクセス回数の削減、処理速度の向上を実現できる。
【０００８】
Ｂ木インデックスでは、上述したレコードの追加やインデックスの作成以外にも、レコードの追加や削除によって生じる各ページに格納するエッジの充填率の偏りやインデックスの階層数の増加に対処するために、Ｂ木インデックスの再構成を行う。Ｂ木インデックスの再構成のタイミングやページの充填率を求める手法としては、特許文献２に開示の技術がある。特許文献２によれば、Ｂ木インデックスの作成後に追加されたページ数や削除されたページ数などによって再構成が必要か判断する。再構成が必要と判断した場合、ページの充填率を計算し、Ｂ木インデックスの再構成を行う手法が開示されている。  
また、特許文献２には、Ｂ木インデックスを作成する際に、レコードの追加を想定して予めページの充填率を低くする手法についても開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００８−１２３４２６号公報
【特許文献２】米国特許第５、４４６、８８７号公報
【非特許文献】
【００１０】
【非特許文献１】Ｇｏｅｔｚ  Ｇｒａｅｆｅ、Ｍｏｄｅｒｎ  Ｂ−Ｔｒｅｅ  Ｔｅｃｈｎｉｑｕｅｓ、Ｉｎ  ｐｒｏｃ．ｏｆ  ｔｈｅ  Ｆｏｕｎｄａｔｉｏｎｓ  ａｎｄ  Ｔｒｅｎｄｓ（登録商標）  ｉｎ  Ｄａｔａｂａｓｅｓ、Ｖｏｌ．３、Ｎｏ．４、ｐｐ  ２０３−４０２、Ａｐｒｉｌ、  ２０１１
【発明の概要】
【発明が解決しようとする課題】
【００１１】
近年、大容量・高速なストレージ技術の進歩によって、従来では管理・活用しきれなかった膨大なデータを、計算機システムのデータベースやファイルシステム（以下、データベース）で記録・保管し短時間で検索することでビジネス上有利な情報の抽出や新たなサービスの創出が期待されている。
【００１２】
データベースを用いた大規模な検索を行うとき、必要なデータを高速に取得するためにインデックスを使用する。一般的に、データベースで扱うデータはストレージに格納されており、データを取得する際に複数回のストレージアクセスが必要となる。
【００１３】
従来、データを高速に取得するために、一部又は全てのインデックスをサーバのメモリに格納しストレージへのアクセス回数（平均Ｉ／Ｏ数）を削減してきた。しかし、データベースに記録・保管するデータ量の増加に伴いインデックス容量が増加し、メモリに格納できるインデックス容量の比率が減少することによって、レスポンス時間の大きいストレージアクセス回数が増加しデータベースの処理速度が低下する問題が発生している。
【００１４】
例えば、ビックデータの活用を図るデータ処理システムでは、データベースに格納するレコード数が大幅に増加している。これに起因して、インデックスのデータも大規模化し、上下の階層数も大きくなっている。そのため、従来は、インデックスの殆どをサーバのバッファメモリにキャッシュできていたものが、インデックスの一部しかバッファメモリにキャッシュできない状況が発生している。このような状況下では、下位の階層の殆どのインデックスがストレージに格納されることにより、サーバのＩ／Ｏ発行回数が増加し、クリエの実行時間が長くなるという問題が発生している。
【００１５】
一方、ストレージへのアクセス回数を削減するためにインデックスの階層数を減らす変更を行うと、その変更に伴う追加処理（インデックスの再構成の処理等）に時間を要し、コストアップの要因となる。
【００１６】
非特許文献１に開示された技術では、データベースのインデックスの更新のコストが低減される。しかし、非特許文献１では、更新のための空き容量を確保するのにインデックスのページの圧縮やメモリとストレージでページの構造を変える方式を採用しているため、データ量が大幅に増加したことに伴うインデックスデータの大規模化に伴い、インデックスを再構成する処理のコストが大幅に増加すると考えられる。
【００１７】
上記特許文献１に開示された技術では、インデックス毎にキー系列の傾向をモニタリングし、この傾向に応じてインデックス毎の充填率を変更している。しかし特許文献１では、インデックスデータの大規模化に伴う上記課題、すなわち階層数の増加に伴うサーバのＩ／Ｏ発行回数の増加については配慮されていない。
【００１８】
上記特許文献２に開示された技術では、Ｂ木インデックスの再構成を行う際の最適化方法として、全てのページで最も高くなる平均充填率を計算し、この平均充填率を全てのページに割り当てている。しかし、特許文献２では、インデックスデータの大規模化に伴う上記課題、すなわち階層数の増加に伴うサーバのＩ／Ｏ発行回数の増加については配慮されていない。また、追加処理に伴う性能の維持についても配慮されていない。
【００１９】
本発明の主たる解決課題は、サーバ等の計算機システムのバッファメモリに格納できるインデックス容量が制限された状況下において、データベースを参照する際の参照コストの増加を抑制したインデックスを生成することのできる、インデックス生成方法及び計算機システムを提供することにある。
【課題を解決するための手段】
【００２０】
本発明の代表的なものを示すと、次のとおりである。プロセッサとバッファメモリと記憶装置とを備えた計算機システムであって、前記記憶装置は、情報が格納されたテーブルを有し、前記バッファメモリ及び前記記憶装置は、各々、前記テーブルを検索するためのインデックスの格納領域を有しており、前記インデックスは、根ノードと葉ノードを含む複数のノードからなる階層構造のインデックスであり、前記計算機システムは、新たに生成する前記インデックスの容量と前記バッファメモリ容量とを比較して前記インデックスの階層ごとに充填率を計算する機能と、設定された条件の範囲で各階層の前記充填率を小さくする機能と、新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較する機能と、比較の結果、前記バッファメモリ容量の容量が不足する場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する機能とを有することを特徴とする。
【発明の効果】
【００２１】
本発明により、大規模なデータを処理する計算機システムにおいて、ストレージのアクセス回数を削減することができ、計算機システムの処理時間を短くする、ひいては参照コストを低減することができる。
【図面の簡単な説明】
【００２２】
【図１】本発明の一実施形態に係る計算機システムの構成を示す機能ブロック図である。
【図２Ａ】図１のユーザ設定情報の一例を示す図である。
【図２Ｂ】図１のテーブル管理情報の一例を示す図である。
【図３】図１のインデックス管理情報の一例を示す図である。
【図４】図１のテーブルの一例を示す図である。
【図５】図１のインデックスの一例を示す図である。
【図６】本発明の一実施形態に係る計算機システムのハードウェア及びソフトウェアの構成例を示す図である。
【図７】本発明の一実施形態の動作を示すブロック図である。
【図８】本発明の一実施形態の動作を示すブロック図である。
【図９】図１に示すパラメータ生成部の動作を示すフローチャート図である。
【図１０】図９に示す動作におけるインデックスの計算の処理の詳細を示すフローチャート図である。
【図１１】図９に示す動作におけるステップＳ８１０の処理の詳細を示すフローチャート図である。
【図１２】最適化処理前のインデックス管理情報と最適化処理後のインデックス管理情報の例を示す図である。
【図１３】初期状態のインデックスの階層構造の例を示す図である。
【図１４】最適化処理後のインデックスの階層構造の例を示す図である。
【発明を実施するための形態】
【００２３】
本発明は、サーバのメモリに格納できるインデックス容量が制限された状況下において、メモリに格納できるインデックス容量に応じてインデックスの階層ごとにページの充填率を変更することによって、ストレージアクセス回数を削減するインデックスを生成する方法及び計算機システムである。
【００２４】
本発明の１つの実施形態によれば、計算機システムは、ユーザや他の計算機システムからの処理要求を実行するＳＱＬ処理部、処理結果の情報を管理するパラメータ管理部、バッファメモリ、バッファメモリの使用用途や容量を管理するバッファメモリ管理部、インデックスを生成するためのパラメータを生成するパラメータ生成部、インデックスを生成するインデックス生成部からなり、パラメータ生成部はパラメータ管理部から生成するインデックスの基本情報、テーブル情報、バッファメモリ容量を取得し、バッファメモリ容量と生成するインデックスの容量を比較してインデックスの階層ごとに充填率を計算する手段と、新たに生成する前記インデックスの容量と前記バッファメモリの前記格納領域の容量とを比較する手段と、比較の結果、前記バッファメモリ容量の容量が不足する場合には、該インデックスの前記葉ノードの充填率を高くして前記階層ごとに前記充填率を再設定した新たな前記インデックスを生成する手段とを持つ。
【００２５】
なお、以下の実施例では、木構造のインデックスとしてＢ木を例に説明するが、本発明はこれに限定されるものではなく、Ｂ＊木や、Ｂ＋木にも適用可能である。
【実施例１】
【００２６】
以下、本発明のインデックスを生成する方法およびインデックスを生成するための計算機システムの一実施例を説明する。
【００２７】
図１は本発明における、ストレージのアクセス回数を削減するために、インデックスの階層ごとに異なる充填率を指定してインデックスを生成するシステム構成を示すブロック図である。
【００２８】
計算機システム１１０は、ＳＱＬ(Structured Query Language）処理部１１１、パラメータ管理部１１２、パラメータ生成部１１３、バッファメモリ管理部１１４、バッファメモリ１１５、インデックス生成部１１６、及び、データ部１２０を備えている。
【００２９】
ユーザ１００は、計算機システム１１０へ処理命令、パラメータの設定値、テーブルのレコード情報を、入力データ１３０として送信する。計算機システム１１０は、この入力データ１３０の処理命令等に基づいて処理を実行し出力データ１４０としてのインデックスを生成し、この出力データ１４０をユーザ１０１へ送信する。
【００３０】
計算機システム１１０のデータ部（記憶装置）１２０は、１以上のユーザ設定情報２００、１以上のテーブル管理情報３００、１以上のインデックス管理情報４００、１以上のテーブル５００、１以上のインデックス６００を含む。バッファメモリ１１５は、記憶装置１２０が保持する上記情報やテーブル（２００、３００、４００、５００、６００）のデータの一部又は全てを一時的に保持する。
【００３１】
パラメータ生成部１１３は、テーブル５００に対するパラメータの階層構造を最適化する機能、インデックス生成部１１６は、テーブル５００に対するインデックスの階層構造を最適化する機能を備えている。
【００３２】
図２Ａは、ユーザ設定情報２００の構成例である。ユーザ設定情報２００は、各インデックス名に対応して複数（２００Ａ〜２００Ｎ）存在する。ユーザ設定情報２００には、テーブル５００やインデックス６００を生成するための情報２０１〜２０６が含まれており、これらの情報はテーブルやインデックスごとに指定することもできる。
【００３３】
パラメータ名２０１は、インデックス名２０２、レコードのキー値及びページのポインタからなるエッジやレコードを格納するページサイズ２０３、ページに格納するエッジやレコードの最大充填率２０４、ページに格納するエッジやレコードの最小充填率２０５、テーブルやインデックスが利用可能なバッファメモリ容量２０６を持つ。設定値２１０には、パラメータ名２０１に対応する数値データが格納される。
【００３４】
図２Ａのユーザ設定情報２００Ａは、各パラメータの設定値２１０として、インデックス名２０２を社員番号、ページサイズ２０３を４ＫＢ、最大充填率２０４を９０％、最小充填率２０５を６０％、バッファメモリ容量２０６を１ＧＢとした例である。最大充填率２０４は，ページサイズ２０３の９０％まで使用できることを示しており，残りの１０％を追加処理で使用する領域である。最小充填率２０５は、少なくとも６０％以上の領域を使用することを示している。ここでは、計算機システムのバッファメモリに格納できるインデックス容量が１０ＧＢに制限されたとすると、この中で社員番号に関して１ＧＢが割り当てられているものとする。
【００３５】
なお、ユーザ設定情報２００を記憶装置１２０に保持せず、ユーザ１００がユーザ設定情報を入力データ１３０に含めて計算機システム１１０に通知してもよい。
【００３６】
図２Ｂは、テーブル管理情報３００の構成例である。テーブル管理情報３００は、テーブルごとに生成され、パラメータ名３０１とパラメータ名３０１に対応する数値３１０を保持する。パラメータ名３０１は、インデックス名３０２、テーブルのレコード数３０３、テーブルのレコードの列のキー長３０４を持つ。
【００３７】
図２Ｂのテーブル管理情報３００は各パラメータの数値３１０として、インデックス名３０２を社員番号、レコード数３０３を１００００００００、キー長３０４を１２Ｂとした例である。
【００３８】
図３は、インデックス管理情報４００の構成例である。インデックス管理情報４００は、インデックスごとに生成され、パラメータ名４０１とパラメータ名４０１に対応する数値４１０を保持する。パラメータ名４０１は、インデックス名４０２、インデックスの階層数４０３、葉ノードの最大エッジ格納数４０４、内部ノードの最大エッジ格納数４０５、根ノードの最大エッジ格納数４０６、インデックスの各階層のページ数４２０〜４２３、インデックスの各階層の充填率４３０〜４３３、インデックスの各階層のページの総容量４４０〜４４３を保持する。図３の４２０〜４２３、４３０〜４３３、４４０〜４４３で示すインデックスの階層は、４２０、４３０、４４０が葉ノード、４２１、４２２、４３１、４３２、４４１、４４２が内部ノード、４２３、４３３、４４３が根ノードを示す。
【００３９】
図３は、各パラメータの数値４１０として、階層数（ｎ）４０３を４、葉ノードの最大エッジ格納数４０４を２００、内部ノードの最大エッジ格納数４０５を２００、根ノードの最大エッジ格納数４０６を２００、１階層のページ数４２０を６２５０００、２階層のページ数４２１を３１２５、ｎ−１階層のページ数４２２を１６、ｎ階層のページ数４２３を１、１階層の充填率４３０を８０％、２階層の充填率４３１を１００％、ｎ−１階層の充填率４３２を１００％、ｎ階層の充填率４３３を８％、１階層の容量４４０を２５００ＭＢ、２階層の容量４４１を１２５００ＫＢ、ｎ−１階層の容量４４２を６４ＫＢ、ｎ階層の容量４４３を４ＫＢとした例である。
【００４０】
インデックスの各階層のページ数４２０〜４２３は、インデックスの各ノードの最大エッジ格納数４０４〜４０６、インデックスの各階層の充填率４３０〜４３３、テーブルのレコード数３０３によって求まる。例えば、インデックスのページ数である４２０をｐ１、４２１をｐ２、４２２をｐ３、４２３をｐ４とし、インデックスの最大エッジ格納数である４０４をｅ１、４０５をｅ２、４０６をｅ３とし、インデックスの充填率である４３０をｆ１、４３１をｆ２、４３２をｆ３、４３３をｆ４とし、テーブルのレコード数をｒとするとき、ｐ１〜４は式（１〜４）となる。このとき、ｐ１〜４は小数点以下切り上げの整数値とする。  
ｐ１＝ｒ／（ｅ１×ｆ１）・・・（１）
ｐ２＝ｐ１／（ｅ２×ｆ２）・・（２）
ｐ３＝ｐ２／（ｅ２×ｆ３）・・（３）
ｐ４＝ｐ３／（ｅ３×ｆ４）・・（４）
このとき、インデックスの各階層のページの総容量４４０〜４４３は、それぞれインデックスの各階層のページ数４２０〜４２３とインデックスのページサイズ２０３を乗算することによって求めることができる。例えば、インデックスの各階層のページの総容量である４４０をｓｉｚｅｐ１とし、インデックスのページサイズである２０３をｐａｇｅｓｉｚｅとしたとき、ｓｉｚｅｐ１は式（５）とする。
【００４１】
ｓｉｚｅｐ１＝ｐ１×ｐａｇｅｓｉｚｅ・・・（５）
図４は、テーブル５００の一例を示すものである。本実施例では、テーブルとして従業員テーブルを用いて説明する。テーブル５００は、「社員番号」、「名前」、「部署」、「年齢」等のインデックスがあり、何れかのインデックスをキーにして従業員に関する情報の検索・利用ができる。
【００４２】
図５は、インデックス６００の構造例としてＢ木インデックスの構造を示す。インデックス６００の最上位層を根ノード６０１、中間位層を内部ノード６０３、最下位層を葉ノード６０４と呼び、インデックス６００の上下の階層は１つ以上のエッジ６０２によって関連付けられている。テーブル５００、本実施例では従業員テーブルが、１以上のページ５０１〜５０３を含む。エッジ６０２は、キー値６１１とインデックスのページ６１０又はテーブルのページ５０１〜５０３へのポインタ６１２によって構成されており、インデックスのページ６１０に１以上格納されている。
【００４３】
ページ６１０が保持可能なエッジ６０２の最大格納数４０４〜４０６は、インデックスのページサイズ２０３、キー値６１１のキー長３０４、ページのポインタ６１２のサイズ、ページの構成内容によって定まる。ページの構成内容は、データベースやファイルシステムによって異なる。本発明の一実施形態では、式（６）を用いてエッジの最大格納数４０４〜４０６を設定する。例えば、インデックスのエッジの最大格納数である４０４をｅ１とし、インデックスのページサイズである２０３をｐａｇｅｓｉｚｅとし、キー長である３０４をｋとし、インデックスのページのポインタ６１２のサイズをｐｏｉｎｔｅｒｓｉｚｅとし、ページサイズ２０３のうちエッジ６０２を格納することができない領域をｎｓｉｚｅとするとき、ｅ１は式（６）とする。
【００４４】
ｅ１＝（ｐａｇｅｓｉｚｅ−ｎｓｉｚｅ）／（ｋ＋ｐｏｉｎｔｅｒｓｉｚｅ）・・・（６）
図５の例では、インデックス６００の階層数が３であり、１階層の葉ノード６０４には６０個余のエッジ６０２があり、テーブルのページ５０１〜５０３に対するエッジ（ポインタ６１２）が６枚のページ６１０に均等に格納され、エッジのキー値６１１として１、６、−、−、５９が設定されている。２階層の内部ノード６０３には２枚のページに均等にエッジが格納され、キー値６１１として１０、２１、４２、５３が設定され、これに基づいて上下の階層である内部ノード６０３と葉ノード６０４は、６つのエッジ（ポインタ６１２）によって関連付けられている。同様に、３階層の根ノード６０１には１枚のページ６１０に全エッジが格納されており、キー値６１１として、３０が設定され、これに基づいて上下の階層が２つのエッジ（ポインタ）によって関連付けられている。
【００４５】
図６は、コンピュータすなわち汎用のサーバ、ストレージ、サーバ上で動作するアプリケーションを用いて本発明のインデックス生成装置を実現するときのハードウェア構成例である。計算機システム７００は、ネットワーク７１０と通信するための入出力装置７０１、データや命令を転送するためのバス７０２、命令を実行するためのプロセッサ７０３、メモリ７０５にデータや命令を格納するメモリコントローラ７０４を含む。ネットワーク７１０は、１つ以上の計算機システム７００、７２０、１つ以上の外部記憶装置（ストレージ）７３０を繋ぐ。計算機システム７００、７２０は、ユーザ１００、１０１によって処理命令を指定することが可能である。計算機システム７００、７２０が使用するデータは、外部記憶装置７３０と計算機システム７００、７２０が保持するメモリ７０５に格納される。
【００４６】
例えば、図１のＳＱＬ処理部１１１、パラメータ管理部１１２、パラメータ生成部１１３、バッファメモリ管理部１１４、インデックス生成部１１６を、図６のプロセッサ７０３で動作するプログラムにより実現し、メモリ７０５の一部をバッファメモリ１１５とし、外部記憶装置（ストレージ）７３０をデータ部１２０として実装することができる。また、バッファメモリ管理部１１４は、メモリコントローラ７０４にハードウェア又はソフトウェアで実装することもできる。
【００４７】
図７は、本発明における、テーブル管理情報３００やテーブル５００の作成及び更新処理、ユーザ設定情報２００の作成及び更新処理の流れを示すブロック図である。  
計算機システム１１０は、ＳＱＬ処理部１１１にユーザ１００から処理命令１３２、設定値１３３、レコード１３４の少なくとも１つを入力データ１３１として通信１５０を通して受信する。
【００４８】
ＳＱＬ処理部１１１は、処理命令１３２が「テーブルの作成」を指示する場合、テーブル５００の作成を行うためにバッファメモリ１１５が必要になるならば、通信１５１を通してバッファメモリ管理部１１４へバッファメモリ１１５の確保を命令する。
【００４９】
バッファメモリ管理部１１４は、バッファメモリ１１５を監視しておりＳＱＬ処理部１１１の命令に基づいてバッファメモリ１１５を確保し、ＳＱＬ処理部１１１へ通信１５１を通じてバッファメモリ１１５の確保完了通知を送信する。  
ＳＱＬ処理部１１１は、バッファメモリ１１５の確保が完了すると、通信１５３を通じてデータ部１２０にテーブル５００を作成しレコード１３４を追加する。このとき、ＳＱＬ処理部１１１は、作成するテーブル５００のテーブル名（インデックス名）３０２、レコード数３０３、レコード１３４のキー長３０４をパラメータ管理部１１２へ通信１５４を通じて送信する。
【００５０】
パラメータ管理部１１２は、ＳＱＬ処理部１１１から受信したデータに基づき、通信１５５を通じてデータ部１２０にテーブル管理情報３００を作成し、インデックス名３０２、レコード数３０３、キー長３０４を更新する。このとき、パラメータ管理部１１２がバッファメモリ１１５を必要とするならば、通信１５６を通じてＳＱＬ処理部１１１と同様の命令をバッファメモリ管理部１１４へ送信し、バッファメモリ１１５を確保する。パラメータ管理部１１２は、ＳＱＬ処理部１１１からのデータを全てテーブル管理情報３００に更新すると、通信１５４を通じてＳＱＬ処理部１１１へ完了通知を送信する。
【００５１】
ＳＱＬ処理部１１１は、パラメータ管理部１１２からの完了通知を受け取ると、通信１５７を通じてユーザ１０１へ処理命令１３２の完了通知を出力データ１４１として送信する。  
ＳＱＬ処理部１１１は、処理命令１３２が「レコード１３４の更新又は追加又は削除」を指示する場合、処理命令１３２の実行にバッファメモリ１１５が必要になるならば、前記と同様にバッファメモリ１１５を確保する。ＳＱＬ処理部１１１は、バッファメモリ１１５の確保が完了すると、通信１５３を通じてデータ部１２０に対して「レコード１３４の更新又は追加又は削除」を、バッファメモリ１１５を使用して行う。このとき、ＳＱＬ処理部１１１は、テーブル５００のテーブル名、レコード１３４のキー長、レコード数を、パラメータ管理部１１２へ通信１５４を通じて送信する。
【００５２】
パラメータ管理部１１２は、前記と同様にテーブル管理情報３００を更新する。パラメータ管理部１１２は、ＳＱＬ処理部１１１からのデータを全てテーブル管理情報３００に更新すると、通信１５４を通じてＳＱＬ処理部１１１へ完了通知を送信する。ＳＱＬ処理部１１１は、パラメータ管理部１１２からの完了通知を受け取ると、通信１５７を通じてユーザ１０１へ処理命令１３２の完了通知を出力データ１４１として送信する。
【００５３】
ＳＱＬ処理部１１１は、処理命令１３２が「ユーザ設定情報２００に設定値１３３を更新又は追加」である場合、通信１５４を通じて設定値１３３と設定値１３３を反映するユーザ設定情報２００の識別子をパラメータ管理部１１２へ送信する。パラメータ管理部１１２がバッファメモリ１１５を必要とするならば、通信１５６を通じて前記と同様の命令をバッファメモリ管理部１１４へ送信し、バッファメモリ１１５を確保する。パラメータ管理部１１２は、ＳＱＬ処理部１１１からのデータをユーザ設定情報２００に反映すると、通信１５４を通じてＳＱＬ処理部１１１へ完了通知を送信する。ＳＱＬ処理部１１１は、パラメータ管理部１１２からの完了通知を受け取ると、通信１５７を通じてユーザ１０１へ処理命令１３２の完了通知を出力データ１４１として送信する。
【００５４】
図８は、本発明の実施例における、インデックス管理情報４００やインデックス６００の作成処理の流れを示すブロック図である。  
計算機システム１１０は、インデックス生成部１１６にユーザ１００から処理命令１３６、設定値１３７の少なくとも１つを入力データ１３５として通信１６０を通して受信する。
【００５５】
インデックス生成部１１６は、処理命令１３６からテーブル５００のテーブル管理情報３００に記載されているキー長３０４に対する「インデックス６００の生成命令」を受信すると、インデックス管理情報４００を作成するために通信１６１を通じてパラメータ生成部１１３へ入力データ１３５を送信する。
【００５６】
パラメータ生成部１１３は、入力データ１３５に基づいて、ユーザ設定情報２００、テーブル管理情報３００、テーブル５００の情報を、通信１６２を通じてパラメータ管理部１１２から受信する。
【００５７】
パラメータ管理部１１２は、通信１６４を通じてバッファメモリ管理部からバッファメモリ１１５の監視情報を取得し、通信１６３を通じてデータ部１２０からユーザ設定情報２００、テーブル管理情報３００、テーブル５００を取得する。
【００５８】
パラメータ生成部１１３は、入力データ１３５、ユーザ設定情報２００、テーブル管理情報３００、テーブル５００に基づいて、パラメータの階層構造の最適化機能により最適化された「インデックス管理情報」４００を作成する。パラメータ生成部１１３は、生成したインデックス管理情報４００を、通信１６２を通じてパラメータ管理部１１２へ送信する。また、パラメータ生成部１１３は、通信１６１を通じてインデックス生成部１１６にインデックス管理情報の生成完了通知を送信する。
【００５９】
パラメータ管理部１１２は、受信したインデックス管理情報４００を、通信１６３を通じてデータ部１２０に送信する。
【００６０】
インデックス生成部１１６は、インデックス管理情報４００の生成完了通知を受信すると、パラメータ管理部１１２からインデックス管理情報４００の取得を、通信１６６を通じて要求する。インデックス生成部１１６は、取得したインデックス管理情報４００と入力データ１３５に基づいて、インデックスの階層構造の最適化機能により最適化された「インデックス」６００を生成する。インデックス６００は、インデックスの階層によって充填率を指定するが、充填率が均一な一般的なインデックスの生成方法をもとにして生成することができる。インデックス生成部１１６は、生成したインデックス６００を、配線１６７を通じてデータ部１２０に格納する。このとき、インデックス生成部１１６は、インデックス６００の根ノードのページから順に配線１６８、１６５を通じてバッファメモリ１１５に格納してもよい。
【００６１】
インデックス生成部１１３は、インデックス６００を指定した場所に格納したあと、配線１６９を通じてインデックスの完了通知を出力データ１４２としてユーザ１０１に送信する。
【００６２】
次に、パラメータ生成部１１３によるパラメータの階層構造の最適化処理、及び、インデックス生成部１１６によるインデックスの階層構造の最適化処理に関して、図９〜図１４を参照しながら説明する。
【００６３】
図９は、パラメータ生成部１１３における、インデックスの各階層のページ数４２０〜４２３、インデックスの各階層の充填率４３０〜４３３、インデックスの各階層のページの総容量４４０〜４４３を計算する処理を実行するフローチャート８００である。
【００６４】
フローチャート８００は、「インデックスの生成命令」によって処理が開始される。ステップＳ８０１ではバッファメモリの容量に関する情報を取得する。ステップＳ８０２ではテーブル５００の１つのインデックス名を取得し、このインデックス名に関して、ステップＳ８０３はユーザ設定情報２００、ステップＳ８０４はテーブル管理情報３００、ステップＳ８０５はインデックス管理情報４００を参照し、各々、最適なインデックス６００を生成するために必要なパラメータを取得する。
【００６５】
ここでは、処理の対象となるテーブルのインデックス名を「社員番号」とし、サーバのバッファメモリに格納できるインデックス容量が制限された状況下において、ユーザにより「社員番号」のバッファメモリ容量が１ＧＢに設定されており、バッファメモリ格納領域が４ページ（ノード）のデータをキャッシュすることができるものとする。
【００６６】
図１２に、最適化処理前のインデックス管理情報４００Ａと最適化処理後のインデックス管理情報４００Ｂの例を示す。最適化処理前の各パラメータの数値は、インデックスの階層数が３であり、葉ノード、内部ノード及び根ノードの各最大エッジ格納数が５、３、３であり、１階層、２階層及び３階層の各ページ数が９、３、１であり、１階層、２階層及び３階層の各充填率が６０％、１００％、１００％となっている。
【００６７】
図１３に、初期状態のインデックス６００の階層構造を示す。この例では、下層のテーブル５００のページ５０１〜５０３に対応する、１階層の９ページの葉ノード６０４がストレージ格納領域に存在し、葉ノードの各ページに均等に３個ずつエッジ６０２が格納されている。バッファメモリ格納領域６２０に存在する２階層の内部ノード６０３には、３枚のページに均等にエッジが格納され、キー値６１１として４、７、１３、１６、２２、２５が設定され、これに基づいて内部ノード６０３と葉ノード６０４は、９つのエッジ（ポインタ６１２）によって関連付けられている。同様に、バッファメモリ格納領域６２０に存在する３階層の根ノード６０１には、１枚のページ６１０に全エッジが格納され、キー値６１１として１０、１９が設定され、これに基づいて根ノード６０１と内部ノード６０３とが３つのエッジ（ポインタ６１２）によって関連付けられている。
【００６８】
図９に戻って、ステップＳ８０６では、各ノードの最大エッジ格納数４０４〜４０６を式（６）に基づいて計算する。  
すなわち、ステップＳ８０６では、インデックスの階層数４０３、インデックスの各階層の充填率４３０〜４３３、インデックスの各階層のページ数４２０〜４２３をテーブルのレコード数３０４、各ノードの最大エッジ格納数４０４〜４０６、インデックスの最大充填率２０５、インデックスの最小充填率２０６から、「最大エッジ格納数」を計算する。
【００６９】
図１３の例では、インデックスの階層数が３、インデックスの１〜３階層の充填率が６０%、１００%、１００%であり、各ノードの「最大エッジ格納数」は、各々、５、３、３であり、各ノードのページ数は、各々、９、３、１である。
【００７０】
ステップＳ８０７では、インデックスの各階層のページの総容量４４０〜４４３を式（５）に基づいて、最適なインデックスを計算する。ステップＳ８０７の「インデックスの計算」の処理内容は、図１０のフローチャート９００に記載する。
【００７１】
ステップＳ８０８では、バッファメモリの容量と計算によって求められたインデックスの容量とを比較し、インデックスの全階層のページをバッファメモリに配置可能か否かを判定する。ステップＳ８０８の判定でＮｏの場合は、１階層すなわち葉ノードの充填率を高くして、再計算を行う（Ｓ８１０）。図１３に示した例では、バッファメモリ格納領域が４ページであり、インデックス「社員番号」の全階層のページをバッファメモリに格納できないので、ステップＳ８０８の判定がＮｏとなり、ステップＳ８１０の処理が必要になる。このステップＳ８１０の処理内容は、図１１のフローチャート１０００に記載する。
【００７２】
一方、ステップＳ８０８の判定でＹｅｓの場合、インデックスの全てのページを格納してもバッファメモリに空き容量があると判断できる。
【００７３】
そこで、各ノードの充填率を小さくして、再計算を行う（Ｓ８０９）。すなわち、バッファメモリからインデックスの全てのページが溢れないように、インデックスの各階層の充填率４３０〜４３３を最大充填率２０５と最小充填率２０６の範囲内で小さくする最適化処理を行う。もし、最大充填率２０５及び最小充填率２０６の設定がなければ、インデックスの各階層の充填率４３０〜４３３を可能な限り小さくする。
【００７４】
このように、パラメータ生成部１１３は、パラメータの階層構造の最適化機能により各ページが持つエッジのポインタの充填率を最適値に管理する、すなわち、各階層の充填率を設定された条件の範囲で小さくすることによって、計算機システムのデータ解析の処理速度を維持しつつ、レコード追加時のページ分割の回数を削減することができる。
【００７５】
上記の各処理を、テーブル５００の全てのインデックス名に対して行い（Ｓ８１１）、終了する（Ｓ８１２）。
【００７６】
図１０は、インデックスの計算（Ｓ８０７）のフローチャート９００である。  
ステップＳ９０２では、インデックスの各階層の充填率４３０〜４３３を最大充填率２０５か最小充填率２０６のうち大きい値とする。もし、最大充填率２０５と最小充填率２０６の指定が無ければ、インデックスの各階層の充填率４３０〜４３３に一時的に適当な値を指定する。例えば、作成するインデックスが参照のみの処理命令を実行する場合、インデックスの各階層の充填率４３０〜４３３を１００％とする。  
ステップＳ９０３では、葉ノードのページ数４２０を式（１）に基づいて計算する。  
ステップＳ９０４では、次に計算するインデックスの階層が根ノードであるか判定する。判定方法として、葉ノードのページ数４２０が根ノードの最大エッジ格納数４０６より小さいか判断する。
【００７７】
ステップＳ９０４の判定でＮｏの場合、ステップＳ９０５で内部ノードのページ数を式（２、３）に基づいて計算する。ここで、ステップＳ９０４の判定でＹｅｓになるまで、繰り返しインデックスの各階層の内部ノード４２１、４２２を式（２、３）に基づいて計算する。
【００７８】
ステップＳ９０４の判定でＹｅｓの場合、ステップＳ９０６で根ノードのページ数４２３を式（４）に基づいて計算する。このとき、ページ数を求めた回数を０からカウントし、カウントした値がインデックスの階層数４０３となる。このようにして、インデックスの階層構造の最適化処理機能により、ユーザ設定情報やバッファメモリの容量などに応じた、最適のインデックスの階層構造が生成される。
【００７９】
図１１は、図９のステップ８１０の葉ノードの充填率の処理、すなわち、インデックスのバッファメモリ容量２０７にインデックスの全てのページが格納できない場合に、インデックスの各階層の充填率４３０〜４３３を算出するフローチャート１０００である。
【００８０】
ステップＳ１００２では、葉ノードの充填率４３０を求め、余裕があるかを判定する。ステップＳ１００２で余裕がなければ、そのままステップＳ１００４に進む。余裕があれば、ステップＳ１００３で葉ノードの充填率を最大充填率２０５以下の範囲で大きく設定してから、ステップＳ１００４に進む。ステップＳ１００３において、もし、最大充填率２０５の設定があれば、葉ノードの充填率４３０を最大充填率２０５まで引き上げる。次に、最大充填率２０５の設定が無く最小充填率２０６の設定があれば、葉ノードの充填率４３０を最小充填率２０６とする。もし、最大充填率２０５及び最小充填率２０６の設定が無ければ、葉ノードの充填率４３０に一時的に適当な値を指定する。例えば、作成するインデックスが参照のみの処理命令を実行する場合、葉ノードの充填率４３０を１００％とする。
【００８１】
図１３の例では、葉ノードの充填率が６０%になっているので、この充填率をここでは１００%と高く設定し、インデックス管理情報４００Ｂ（図１２）の数値を更新する。なお、ここでは説明を簡単にするために葉ノードの充填率を便宜上１００%として説明するが、実際の葉ノードの充填率は図２Ａの最大充填率（９０%）もしくはそれ以下に設定する。これは、高コストなページ分割を避け、追加処理を容易にするためである。
【００８２】
ステップＳ１００４では、新たな設定に基づき、葉ノードの各エッジの充填率を再計算する。図１３の例では、「最大エッジ格納数」が５なので、２７個のエッジを、各ページに最大５個ずつ（１００%）格納することができる。
【００８３】
ステップＳ１００５では、葉ノードのページ数４２０を式（１）に基づいて計算する。図１３の例では、１階層のページ数が６となり、この値がインデックス管理情報４００Ｂに反映される。  
ステップＳ１００６は、内部ノードの充填率とページ数を、葉ノードのページ数４２０、最小充填率２０６から算出する。このとき、葉ノードに近い内部ノードから順番に充填率を算出する。また、内部ノードの充填率は、最小充填率２０６以上であり、葉ノードに近い内部ノードの充填率４３１ほど高く設定し、根ノードに近い内部ノードの充填率４３２ほど低くなるように設定する。葉ノードに近い内部ノードの充填率から順に、充填率を可能な限り大きくしてまで計算する。もし、ある階層のページ数４２２が根ノードの充填率４３３と最大エッジ格納数４０６の積より小さい場合、根ノードの充填率４３３はページ数４２２を最大エッジ格納数４０６で割った値とする。このとき、ページ数を求めた回数を０からカウントし、カウントした値がインデックスの階層数となる。これらの計算結果に基づき、インデックス管理情報４００Ｂ（図１２）の数値が更新される。この例では、インデックスの階層数は３のままである。
【００８４】
次にステップＳ１００７では、ステップＳ８０７で計算したインデックスの階層数４０３とステップＳ１００６で計算したインデックスの階層数を比較する。
【００８５】
ステップＳ１００６で求めた階層数がステップＳ８０７で求めた階層数より大きい場合、ステップＳ１００８で葉ノードの充填率４３０をユーザ設定の範囲で低くした再設定を行い、ステップＳ１００５の処理に戻る。
【００８６】
以下、ステップＳ１００７の判定でＹｅｓになるまで、繰り返しインデックスの葉ノードの充填率４３０を変更し、階層数に変更が無い範囲で、葉ノードの充填率を最適化し、これに応じて内部ノードと根ノードのページ数や充填率を再設定する（ステップＳ１００５〜Ｓ１００７）。例えば、あるインデックスの初期状態の階層数が４で、かつ、葉ノードの充填率が６０%であった状態から、葉ノードの充填率を９０%に上げた結果、インデックスの階層数が３に減少し上記判定がＮｏになったと仮定する。この場合には、葉ノードの充填率を下げて各ノードのページ数や充填率を再設定してステップＳ１００５〜ステップＳ１００６を実行し、その結果、例えば充填率８０%でインデックスの階層数が４となった場合には、葉ノードの充填率を８０%に決定する。
【００８７】
ステップＳ１００６で求めた階層数がステップＳ８０６で求めた階層数以下の場合、インデックスの階層数４０３をステップＳ１００６で求めた階層数に更新し、フローチャート１０００の処理を終了し、フローチャート８００の処理に戻る。フローチャート８００に戻ってきた処理は、ステップＳ８１１に移り処理を継続、若しくは終了する。
【００８８】
図１４に、インデックス管理情報４００Ｂに対応する最適化処理後のインデックス６００の階層構造の例を示す。この例では、ステップＳ１００６で求められる階層数が３で変更がなく、１階層の葉ノードの２７個のエッジが５枚のページに５個ずつ（１００%）格納され、残りの２個のエッジが１枚のページに格納されている。２階層の内部ノード６０３には２枚のページに均等に全エッジが格納され、キー値として６、１１、２１、２６が設定され、これに基づいて内部ノードと葉ノードは、６つのエッジ（ポインタ）によって関連付けられている。同様に、３階層の根ノード６０１には１枚のページに全エッジが格納されており、キー値として、１６が設定され、これに基づいて根ノードと内部ノードとが２つのエッジ（ポインタ）によって関連付けられている。
【００８９】
図１４の最適化処理後のインデックス６００の階層構造を、図１３の階層構造と比べると、インデックスの階層数に変化はない。一方、最適化処理前には、葉ノードの全てのエッジがストレージ格納領域に存在していたのに対し、最適化処理後には、１階層の葉ノードの５個のエッジを格納した１枚のページが、バッファメモリ領域６２０に存在している。これにより、テーブルに対する平均Ｉ／Ｏ数(ストレージへのアクセス回数)を削減できる。
【００９０】
すなわち、最適化処理前のインデックス階層構造によれば、バッファメモリ格納領域には内部ノード６０３までしかキャッシュすることができない。一方、最適化処理後のインデックス階層構造では、葉ノードの充填率を上げることで、内部ノードのみならず葉ノード６０４の一部（エッジ１〜５）までバッファメモリ格納領域６３０にキャッシュすることができ、根ノードから葉ノードを介してテーブル５００のデータに直接アクセスできる。このように、従来であればＩ／Ｏの発行が必要であったインデックスの一部の領域をバッファメモリ格納領域６３０に変更して格納することができ、その結果、テーブル５００のデータを取得するための平均Ｉ／Ｏ数を削減することが可能になっている。
【００９１】
Ｂ木インデックスの作成後に追加されたページ数や削除されたページ数などによって再構成が必要か判断され、再構成が必要と判断した場合、上記最適化処理が実行される。
【００９２】
本実施例によれば、サーバのバッファメモリ容量に応じてインデックス階層構造を変更することにより、サーバのストレージアクセス回数を削減することができる。すなわち、本実施例では、インデックス階層構造の階層毎に、各ページが持つエッジのポインタの充填率を最適値に管理することによって、バッファメモリにより多くのインデックスを格納することが可能となり、これにより、ストレージへのアクセス回数を削減し、かつ、追加処理コストの削減も図ることができる。
【符号の説明】
【００９３】
１００…ユーザ、１０１…ユーザ、１１０…計算機システム、１１１…ＳＱＬ処理部、１１２…パラメータ管理部、１１３…パラメータ生成部、１１４…バッファメモリ管理部、１１５…バッファメモリ、１１６…インデックス生成部、１２０…データ部（記憶装置）、１３０…入力データ、１４０…出力データ、ユーザ設定情報…ユーザ設定情報、３００…テーブル管理情報、４００…インデックス管理情報、５００…テーブル、６００…インデックス。
【図１】
2014130492.tif 000003
【図２Ａ】
2014130492.tif 000004
【図２Ｂ】
2014130492.tif 000005
【図３】
2014130492.tif 000006
【図４】
2014130492.tif 000007
【図５】
2014130492.tif 000008
【図６】
2014130492.tif 000009
【図７】
2014130492.tif 000010
【図８】
2014130492.tif 000011
【図９】
2014130492.tif 000012
【図１０】
2014130492.tif 000013
【図１１】
2014130492.tif 000014
【図１２】
2014130492.tif 000015
【図１３】
2014130492.tif 000016
【図１４】
2014130492.tif 000017