(58)【調査した分野】(Int.Cl.,DB名)
前記拡張ブロック操作手段は、前記挿入対象のリーフブロックにおける前記ライトカウンタと前記リードカウンタとの比較結果に基づいて、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定することを特徴とする請求項1に記載のデータベース管理装置。
前記拡張ブロック操作手段は、前記リードカウンタ及び前記ライトカウンタに基づいて、前記挿入対象のリーフブロックにおける全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かを判定し、前記ライトアクセスの比率が所定閾値を超える場合に、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得する、
ことを特徴とする請求項1又は2に記載のデータベース管理装置。
前記拡張ブロック操作手段は、前記リードカウンタ及び前記ライトカウンタに基づいて、前記挿入対象のリーフブロックにおける全アクセスに対するリードアクセスの比率が所定閾値を超えるか否かを判定し、前記リードアクセスの比率が所定閾値を超える場合に、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定する、
ことを特徴とする請求項2又は3に記載のデータベース管理装置。
前記アクセス管理手段は、前記拡張ブロックに格納されたインデックスエントリに対してアクセスされた場合には、当該拡張ブロックを特定するための特定情報が設定されたリーフブロックのアクセスカウンタを更新する、
ことを特徴とする請求項1から4のいずれか1項に記載のデータベース管理装置。
前記拡張ブロック操作手段は、前記挿入対象のリーフブロックにおける前記ライトカウンタと前記リードカウンタとの比較結果に基づいて、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定することを特徴とする請求項6に記載のプログラム。
【発明を実施するための形態】
【0024】
以下、本発明の実施の形態としてのデータベースシステム(以降、DBシステムと表記する)について説明する。なお、以下に挙げる各実施形態はそれぞれ例示であり、本発明は以下の各実施形態の構成に限定されない。
【0025】
[第1実施形態]
〔システム構成〕
図1は、第1実施形態におけるDBシステム10の構成例を示す概念図である。DBシステム10は、
図1に示すように、ハードウェア構成として、CPU1、メモリ2(RAM(Random Access Memory)、ROM(Read Only Memory)、ハードディスク(HDD)等)、入出力インタフェース3等を有する。これら各ハードウェア要素は例えばバス5により接続される。入出力インタフェース(入出力I/F)3は、外部のコンピュータ等と通信を行うためのネットワークインタフェースやユーザインタフェース等を含む。
【0026】
DBシステム10は、例えば、メモリ2に格納されるプログラムがCPU1により読み出され実行されることにより、以下のような各処理部を実現する。DBシステム10は、データベース管理部(以降、DB管理部と表記する)100、データベース(以降、DBと表記する)部200等を有する。
【0027】
なお、
図1の例では、DBシステム10が1台のコンピュータとして実現される例を示すが、複数のコンピュータで実現されてもよい。また、
図1の例では、1つのCPU1のみが示されるが、複数のプロセッサ(例えば、CPU、DSP(Digital Signal Processor)等)を有していてもよい。例えば、DB管理部100とDB部200とが異なるコンピュータ又はCPU上で実現されてもよい。本実施形態は、DBシステム10のハードウェア構成を限定しない。
【0028】
DB部200は、メモリ2上に実現され、複数のブロック210(
図1では210(#1)、210(#2)、210(#n)として表記)を含む。各ブロック210は、例えば、所定容量(例えば、4キロバイト(KB))の連続した記憶領域として確保される。ブロック210間は、連続領域として確保されてもよいし、非連続な各領域として確保されてもよい。本実施形態は、ブロック210の領域サイズを限定しない。
【0029】
各ブロック210は、インデックスを格納するブロック(以降、インデックスブロックとも表記される)と、データを格納するブロック(以降、データブロックとも表記される)240とに大別される。データブロック240は、任意の表(テーブル)を格納する。
【0030】
インデックスブロックは、ツリー構造(例えば、Bツリー(Balanced Tree)構造)を持ち、更に、ブランチブロック220と、リーフブロック230とに大別される。ブランチブロック220及びリーフブロック230の各々は、インデックスとなる少なくとも1つのエントリを格納する。各インデックスブロックに格納されるエントリは、インデックスエントリと呼ぶこともできる。インデックスエントリは、検索対象となるキー値と識別子(ID)とを含む。
【0031】
リーフブロック230は、インデックスブロックの中の最下層のブロックである。リーフブロックのエントリに含まれる識別子は、データブロックのいずれか1つの行データを特定するためのデータである。その識別子は、例えば、特定すべき行データの先頭を指すポインタとその行データのサイズとから構成される。
【0032】
ブランチブロック220は、リーフブロック230又は他のブランチブロック220へのリンクを持つブロックである。このリンクは、インデックスエントリの識別子によって実現される。即ち、ブランチブロック220のエントリに含まれる識別子は、いずれか1つのブランチブロック220又はいずれか1つのリーフブロック230を特定するポインタである。以降、最上位のブランチブロック220をルートブロックと表記する場合もある。ここで、最上位とは、検索時に最初に検索されることを意味する。
【0033】
以降、インデックスエントリの識別子によりリンクされた各インデックスブロックにおいて、そのインデックスエントリを含むブランチブロック220を親ブロックと表記し、そのインデックスエントリの識別子で特定されるリーフブロック230又は他のブランチブロック220を子ブロックと表記する場合もある。
【0034】
図2は、ブランチブロック220の構成例を概念的に示す図である。
図2に示すように、ブランチブロック220は、ブロックヘッダと少なくとも1つのインデックスエントリとをそれぞれ含む。インデックスエントリは、上述したように、キー値(
図2の「key」)と識別子(
図2の「id」)とを含む。ブロックヘッダには、ブロック種、アクセスカウンタ等が設定される。
【0035】
ブロック種は、リーフブロック、ブランチブロック等を識別するための情報である。アクセスカウンタは、リードカウンタ及びライトカウンタを含み、インデックスブロックへのアクセスの数をカウントする。具体的には、ブランチブロック220へのリードアクセスに応じてリードカウンタが更新され、ブランチブロック220への更新アクセス(エントリ追加及びエントリ削除)に応じてライトカウンタが更新される。
【0036】
図3は、リーフブロック230の構成例を概念的に示す図である。
図3に示すように、リーフブロック230は、そのブロックヘッダに拡張ポインタを有する点において、ブランチブロック220と異なる。リーフブロック230のその他の構成については、ブランチブロック220と同様である。拡張ポインタは、リーフブロック230の容量を拡張するために追加される拡張ブロックを特定するための情報である。例えば、拡張ポインタには、拡張ブロックのアドレスが設定される。なお、拡張ブロックを持たないリーフブロック230の拡張ポインタには、無効値(例えば、NULL)が設定される。以降、リーフブロック230を拡張するとの表記は、そのリーフブロック230に拡張ブロックを付加することを意味する。
【0037】
拡張ブロックは、メモリ2上に実現される、上述のブロック210のうちの一つである。拡張ブロックには、リーフブロック230と同様に、データブロックのいずれか1つの行データを特定する識別子を含むインデックスエントリが格納される。拡張ブロックは、他のインデックスブロック(ブランチブロック220)のインデックスエントリにより特定されない点において、インデックスブロックとは異なる。1つのリーフブロック230に対して複数の拡張ブロックが追加された場合には、拡張ブロックには、他の拡張ブロックを特定するための拡張ポインタが設定される。
【0038】
上述のように、
図2及び
図3では、インデックスブロック内の連続領域に、ブロックヘッダ内の各値及び各エントリが格納される例を示したが、ブロックヘッダ内の各値と各エントリとは、相互に関連付けられていれば、必ずしも連続した領域に格納されなくともよい。
【0039】
以降、ブランチブロック220、リーフブロック230、データブロック240、及び拡張ブロックを単にブロックと表記する場合もある。また、インデックスエントリを単にエントリと表記する場合もある。
【0040】
DB管理部100は、アクセス管理部110、検索部120、データ挿入部130、データ削除部140、拡張ブロック操作部150等を含む。DB管理部100に含まれるこれら各処理部も、メモリ2に格納されるプログラムがCPU1により読み出され実行されることにより、ソフトウェア要素として実現される。
【0041】
検索部120は、検索キーを取得し、この検索キーに対応する列(フィールド)のデータを含む行をデータブロック240から抽出する。検索キーは、他の装置から通信を介して取得されてもよいし、CPU1により実行されているプロセス等のような他の処理部から取得されてもよいし、ユーザインタフェースを介してユーザにより入力されてもよい。
【0042】
検索部120は、データブロック240における抽出すべき行を特定するために、インデックス検索を行う。このインデックス検索において、検索部120は、まず、ルートブロックにアクセスする。検索部120は、ルートブロックに含まれるエントリのうち、検索キー以下の最大のキー値を持つエントリ、又は、検索キー以上の最小のキー値を持つエントリを検索する。
【0043】
検索部120は、抽出されたエントリの識別子により特定される他のブランチブロック220又はリーフブロック230を読み出す。検索部120は、他のブランチブロック220が読み出された場合には、上記のルートブロックに対する検索と同様に特定のエントリを抽出する。一方、検索部120は、リーフブロック230が読み出された場合には、検索キーの条件を満たすエントリを抽出し、そのエントリの識別子で特定される行データをデータブロック240から抽出する。
【0044】
検索部120は、リーフブロック230が読み出された場合で、かつ、そのリーフブロック230の拡張ポインタに有効値が設定されている(そのリーフブロック230が拡張されている)場合には、リーフブロック230に含まれるエントリと、その拡張ポインタで特定される拡張ブロックに含まれるエントリとを対象に、検索キーの条件を満たすエントリを抽出する。言い換えれば、検索部120は、拡張ブロックをリーフブロック230のインデックスエントリを格納する領域の一部として扱う。
【0045】
データ挿入部130は、挿入する行データを受け取り、データブロック240にその行データを書き込む。このとき、データ挿入部130は、その挿入された行データに基づいて、インデックスブロック内のインデックスを更新する。データブロック240への書き込みは、例えば、挿入すべき行データよりも大きな空き領域を持つブロックのいずれか1つに書き込まれる。
【0046】
データ挿入部130は、インデックスの更新において、対応するリーフブロック230に、その挿入された行データに対応する新たなインデックスエントリを追加する。この新たなインデックスエントリは、キーが設定される列であって挿入された行に含まれる列のデータをキー値として含み、更に、その行を特定するための識別子を含む。
【0047】
データ挿入部130は、更新対象のリーフブロック230が拡張されている場合には、そのリーフブロック230の拡張ブロックに新たなインデックスエントリを追加する。リーフブロック230が拡張されているか否かは、後述する拡張ブロック操作部150から送られるデータに基づいて判断される。なお、データ挿入部130も、拡張ブロックをリーフブロック230のインデックスエントリを格納する領域の一部として扱う。
【0048】
インデックスの更新では、リーフブロック230へのエントリの追加に加えて、ブランチブロック220にも新たなインデックスエントリを追加することが要求される場合がある。それは、挿入対象のリーフブロック230に、新たなインデックスエントリを追加するための十分な空き領域がない場合(オーバーフローが起きる場合)である。
【0049】
このようにオーバーフローが起きる場合には、データ挿入部130は、ブロック分割を行うことによって空き領域を作る。ブロック分割では、データ挿入部130は、所定容量の空き領域がなくなったリーフブロック230のデータの一部を新たに確保したリーフブロック230に移すことで空き領域を作り出す。ブロック分割は、リーフブロック230のみでなくブランチブロック220においても同様に処理される。ブロック分割の詳細については動作例の項で詳述する。
【0050】
データ削除部140は、削除する行データを特定するための値を受け取り、データブロック240から行データを削除し、削除された行データに対応するインデックスエントリをリーフブロック230から削除する。例えば、削除する行データを特定するための値は、検索部120の検索処理の結果として取得される。ここで、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、削除対象のインデックスエントリが実際には拡張ブロックに格納されている場合であっても、データ削除部140は、特定されたエントリを通常の処理と同様に削除する。
【0051】
インデックスエントリをリーフブロック230又はその拡張ブロックから削除することにより、リーフブロック230又はその拡張ブロックの空き領域が所定サイズ以上となる場合(アンダーフローが起きる場合)、データ削除部140は、そのリーフブロック230が拡張されているか否かに応じて、以下のような処理を実行する。
【0052】
データ削除部140は、そのリーフブロック230が拡張されていない場合には、このリーフブロック230を空きブロックにし、かつ、必要に応じて、ブロック統合処理を実行する。このブロック統合処理については動作例の項において詳述する。
【0053】
一方、データ削除部140は、そのリーフブロック230が拡張されている場合には、拡張ブロックの統合処理を実行する。具体的には、データ削除部140は、そのリーフブロック230が拡張されている場合で、かつ、リーフブロック230自体にアンダーフローが起きると判定した場合には、拡張ブロック内のインデックスエントリをそのリーフブロック230に移動させる。データ削除部140は、そのリーフブロック230が拡張されている場合で、かつ、拡張ブロックにアンダーフローが起きると判定した場合には、同一リーフブロック230のための他の拡張ブロックに、その拡張ブロックのインデックスエントリを移動させる。
【0054】
拡張ブロック操作部150は、データ挿入部130がブロック分割を行う前に、リーフブロック230のブロック分割を行うか、拡張ブロックを用いたリーフブロック230の容量の拡張を行うかのいずれか一方を選択する。この選択のために、拡張ブロック操作部150は、新たなインデックスエントリが追加されるリーフブロック230における全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かを判定する。具体的には、拡張ブロック操作部150は、ライトカウンタの値(W)を、リードカウンタの値とライトカウンタの値との合計(W+R)で除算することにより、当該ライトアクセスの比率(W/(W+R))を算出する。
【0055】
拡張ブロック操作部150は、当該ライトアクセスの比率が所定閾値を超える場合に、拡張ブロックを用いたリーフブロック230の容量の拡張を選択し、新たな拡張ブロックを取得する。拡張ブロック操作部150は、拡張ブロックを取得すると、その拡張ブロックへのポインタをリーフブロック230の拡張ポインタに設定する。一方、拡張ブロック操作部150は、当該ライトアクセスの比率が所定閾値以下である場合には、データ挿入部130にリーフブロック230のブロック分割を実行させる。
【0056】
上記所定閾値は、例えば、予め調整可能にメモリ2に格納される。当該所定閾値には、例えば、全インデックスブロックにおけるライトアクセスの全アクセスに対する比率のxパーセンタイル(xは例えば10)等が用いられる。
【0057】
拡張ブロック操作部150は、検索部120においてリーフブロック230が読み出された場合に、そのリーフブロック230の拡張ポインタ及び拡張ブロックの拡張ポインタを参照することにより、そのリーフブロック230のための全ての拡張ブロックを特定する。拡張ブロック操作部150は、それら拡張ブロックに含まれるエントリを検索対象とするように検索部120に指示する。
【0058】
拡張ブロック操作部150は、データ削除部140により、リーフブロック230と拡張ブロックとの間、又は、拡張ブロック間におけるインデックスエントリの移動が実行される場合に、移動対象とする拡張ブロック及び移動対象とするインデックスエントリを特定する。リーフブロック230と拡張ブロックとの間、及び、拡張ブロック間におけるインデックスエントリの移動は、拡張ブロックを空ブロックとするように実行されることが好ましい。また、拡張ブロック操作部150は、インデックスエントリの移動により、リーフブロック230がオーバーフローしないように、移動させるインデックスエントリの数を決める。
【0059】
アクセス管理部110は、データブロック240に対するデータ操作に応じてツリー構造に沿ってアクセスされた各インデックスブロックに関し、アクセスカウンタをそれぞれ更新する。具体的には、アクセス管理部110は、検索部120、データ挿入部130及びデータ削除部140によるインデックスブロックへのアクセス内容に基づいて、リードアクセス時にはそのインデックスブロックのリードカウンタを更新し、更新アクセス時にはそのインデックスブロックのライトカウンタを更新する。更新アクセスには、エントリの挿入操作及びエントリの削除操作が含まれる。なお、エントリの移動操作は、エントリの挿入操作とエントリの削除操作との組み合わせで実現される。
【0060】
アクセス管理部110は、検索部120がインデックス検索を行うことによりインデックスエントリの識別子により特定されるブランチブロック220又はリーフブロック230を読み出す際に、その読み出されたインデックスブロックのブロックヘッダのアクセスカウンタを増加させる。但し、ルートブロックは最初に参照されるブロックであるため、検索部120は、アクセスした際に、ルートブロックのブロックヘッダのアクセスカウンタを増加させる。
【0061】
アクセス管理部110は、検索部120がルートブロックのいずれかのエントリの識別子が示すブランチブロック220を読む際に、そのブランチブロック220のアクセスカウンタを1増加させる。更に、アクセス管理部110は、検索部120がこのブランチブロック220からたどるリーフブロック230にアクセスするときに、リーフブロック230のアクセスカウンタを1増加させる。
【0062】
アクセス管理部110は、行データ挿入時においてデータ挿入部130により新たなインデックスエントリが追加されると、そのインデックスエントリが追加されたインデックスブロックのライトカウンタを1増加させる。このとき、アクセス管理部110は、そのインデックスエントリが追加されたインデックスブロックを検索するまでにアクセスされた各インデックスブロックのリードカウンタをそれぞれ1増加させる。
【0063】
同様に、行データ挿入時においてブロック分割が行われる場合には、アクセス管理部110は、そのブロック分割処理においてアクセスされたインデックスブロックのリードカウンタを増加させ、かつ、ブロック分割処理でエントリが移動させられる度に移動先のインデックスブロックのライトカウンタを1増加させる。
【0064】
また、アクセス管理部110は、データ削除部140がインデックスブロックからエントリを削除した場合には、そのインデックスブロックのライトカウンタを増加させる。更に、アクセス管理部110は、データ削除部140がインデックスブロックを空きブロックにする場合には、そのインデックスブロックを空きブロックにするために移動されたエントリの移動先となる他のインデックスブロックのライトカウンタを増加させる。
【0065】
ここで、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、実際には拡張ブロック内のエントリが操作された場合であっても、その拡張ブロックを持つリーフブロック230のアクセスカウンタが更新される。具体的には、検索部120により拡張ブロック内のエントリが抽出された場合であっても、その拡張ブロックに対応するリーフブロック230のリードカウンタが更新される。同様に、データ挿入部130により拡張ブロックに新たなエントリが追加された場合、及び、データ削除部140により拡張ブロックのエントリが削除された場合であっても、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。また、データ削除部140により拡張ブロックの統合処理が実行される場合には、拡張ブロック内のエントリを移動させる度に、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。
【0066】
〔動作例〕
以下、第1実施形態におけるDBシステム10の動作例について
図4から
図7を用いて説明する。
図4は、第1実施形態におけるDBシステム10のデータ検索時の動作例を示すフローチャートである。
図4の例では、完全一致検索を行う場合の動作が示される。
図5は、ブランチブロック220、リーフブロック230及びデータブロック240の関係の例を概念的に示す図である。ここでは、
図5の例において、文字列の大小を辞書順に従って比較することを想定し、検索部120が、検索キー「go」を列データに含む行を検索する場合を例に挙げて、当該動作例を説明する。
【0067】
検索部120は、検索キーを取得すると、まず、ルートブロックを読み出す(S10)。
図5の例では、検索部120は、検索キー「go」を取得すると、キー値「e」、「m」、「t」を含む各インデックスエントリを持つルートブロックを読み出す。
【0068】
アクセス管理部110は、検索部120がルートブロックにアクセスした場合に、そのルートブロックのリードカウンタを1増加させる(S11)。
【0069】
検索部120は、ルートブロック内のインデックスエントリのうち、当該検索キー以下の最大のキー値を持つエントリ、又は、当該検索キー以上の最小のキー値を持つエントリを特定する。いずれの特定方法を取っても一般性を失わないので、ここでは、検索部120は、当該検索キー以下の最大のキー値を持つエントリを特定するものとする(S12)。このエントリの特定は、ブロック中の全てのエントリを比較することにより実現されてもよいし、ブロック中のエントリをキー値でソートした上で一部のエントリを比較することにより実現されてもよい。
【0070】
図5の例では、簡略化されているが、キー値「e」については、例えば、キー値「e」を持つエントリと「e」より小さい値を示すキー値(例えば、NULL)を持つエントリとが含まれる。ここで、検索キー「go」以下の最大のキー値は「e」であり、検索キー「go」は、キー値「e」より大きくキー値「m」よりも小さいので、左から2番目のブランチブロックを特定する識別子を含むエントリが特定される。
【0071】
続いて、検索部120は、そのように特定されたエントリの識別子によって特定されるインデックスブロックを読み出す(S13)。
【0072】
アクセス管理部110は、検索部120がインデックスブロックを読み出すと、そのインデックスブロックのリードカウンタを1増加させる(S14)。
【0073】
検索部120は、ブロックヘッダに設定されるブロック種により、その読み出されたインデックスブロックがリーフブロック230かブランチブロック220かを判定する(S15)。検索部120及びアクセス管理部110は、その読み出されたインデックスブロックがブランチブロック220である場合には(S15;NO)、その読み出されたブランチブロック220に関し上記(S12)、(S13)及び(S14)の処理を実行する。
【0074】
検索部120は、その読み出されたインデックスブロックがリーフブロック230である場合には(S15;YES)、その読み出されたリーフブロック230内のエントリを取得する(S16)。
図5の例では、リーフブロック230内のエントリ(キー値「game」を含むエントリからキー値「gift」を含むエントリまで)が取得される。
【0075】
続いて、拡張ブロック操作部150が、その読み出されたリーフブロック230の拡張ポインタが無効か否かを判定する(S17)。この判定は、拡張ポインタに有効値が設定されているか否かにより行われる。拡張ブロック操作部150は、拡張ポインタが有効であると判定すると(S17;NO)、その拡張ポインタにより特定される拡張ブロック内のエントリを取得する(S18)。
図5の例では、リーフブロック230の拡張ブロック内のエントリ(キー値「give」を含むエントリからキー値「hear」を含むエントリまで)が取得される。
【0076】
拡張ブロック操作部150は、その拡張ブロック内の拡張ポインタに有効値が設定されている場合には、更に、その拡張ポインタで特定される他の拡張ブロック内のエントリも取得する。このようにして、拡張ブロック操作部150は、その読み出されたリーフブロック230のための各拡張ブロック内のエントリをそれぞれ取得する(S18)。なお、リーフブロック230の拡張ポインタが無効であると判定すると(S17;YES)、検索部120は、処理(S20)を実行する。
【0077】
検索部120は、処理(S16)で取得されたリーフブロック230内のエントリ、及び、処理(S18)で取得された拡張ブロック内のエントリの中から、検索キーを含む検索条件に一致するエントリを特定する(S20)。ここでは、その検索条件は、検索キーを列データに含む行(完全一致)の検索を示す。
図5の例では、キー値「go」を含むインデックスエントリが特定される。
【0078】
このインデックスエントリの特定は、リーフブロック230及びそのリーフブロック230が持つ拡張ブロック内の全てのエントリを比較することにより実現されてもよいし、それらエントリをキー値でソートした上で一部のエントリを比較することにより実現されてもよい。
【0079】
検索部120は、特定されたインデックスエントリに含まれる識別子で特定される行データを抽出する(S21)。
図5の例では、キー値「go」を含むインデックスエントリの識別子により特定されるデータブロック240の行が抽出される。例えば、その識別子に含まれるポインタで、行データの先頭が特定され、その先頭アドレスから行の大きさ(バイト数)分のデータが読み出される。
【0080】
図6は、第1実施形態におけるDBシステム10のデータ挿入時の動作例を示すフローチャートである。
【0081】
データ挿入部130は、挿入すべき行データを取得すると、この行データを空き領域のある任意のデータブロック240に書き込む(S31)。
【0082】
データ挿入部130は、挿入された行データに対応するインデックスエントリを挿入すべきリーフブロック230を特定する(S32)。このリーフブロック230の特定は、挿入された行データにおけるキーが設定された列の値を検索キーとしたインデックス検索によりリーフブロック230を特定する場合と同様の手法で実現される。
図4の動作例によれば、(S10)、(S11)、(S12)、(S13)、(S14)及び(S15)の処理が実行されることにより、挿入すべきリーフブロック230が特定される。
【0083】
このとき、挿入された行データに対応するリーフブロック230を特定するために読み出されたインデックスブロックのリードカウンタは、アクセス管理部110によりカウントアップされる。
【0084】
続いて、データ挿入部130は、特定されたリーフブロック230に挿入すべき新たなインデックスエントリを生成する(S33)。新たなインデックスエントリは、挿入された行データにおけるキーが設定された列の値をキー値として含み、挿入された行データを特定するための識別子を含む。
【0085】
データ挿入部130は、特定されたリーフブロック230が新たなインデックスエントリの追加によりオーバーフローするか否かを判定する(S34)。ここで、オーバーフローとは、新たなインデックスエントリを追加するとブロックの空き領域が所定の比率を下回ることである。
【0086】
データ挿入部130は、オーバーフローしないと判定すると(S34;NO)、その特定されたリーフブロック230にその新たに生成されたインデックスエントリを書き込む(S35)。このとき、アクセス管理部110は、書き込まれたリーフブロック230のライトカウンタを1増加させる(S36)。
【0087】
続いて、データ挿入部130は、ブロック分割がなされたか否かを判定する(S37)。データ挿入部130は、ブロック分割がされていない場合には(S37;NO)、処理を終了し、ブロック分割がなされている場合には(S37;YES)、ブロック分割がなされたブロックの上位のブランチブロックを特定する(S38)。この上位ブランチブロックの特定は、再帰関数的な処理を施すことにより実現してもよいし、ブロックヘッダに上位ブロックの識別子を格納することで実現してもよい。
【0088】
以降、データ挿入部130は、その特定された上位ブランチブロックを対象ブロックとして処理(S33)に戻って各処理を実行する。
【0089】
一方、データ挿入部130は、オーバーフローすると判定した場合には(S34;YES)、そのオーバーフローすると判定されたインデックスブロックがリーフブロック230であるか否かを判定する(S40)。
【0090】
対象のインデックスブロックがリーフブロック230でない場合には(S40;NO)、データ挿入部130は、その対象のインデックスブロックに対してブロック分割処理を実行する。
【0091】
ブロック分割処理では、まず、データ挿入部130は、オーバーフローすると判定されたインデックスブロックがルートブロックか否かを判定する(S50)。データ挿入部130は、当該インデックスブロックがルートブロックである場合(S50;YES)、新たなルートブロックとするための新たな空きブロックを取得する(S51)。このとき、アクセス管理部110は、取得された空きブロックのリードカウンタを1増加させる(S52)。
【0092】
データ挿入部130は、オーバーフローすると判定された現在のルートブロック内の最小のキー値及び現在のルートブロックを特定するための識別子を含むインデックスエントリを生成する(S53)。データ挿入部130は、このように生成されたインデックスエントリを、新たなルートブロックとするために取得された空きブロックに書き込む(S54)。言い換えれば、生成されたインデックスエントリは、新たなルートブロックから元のルートブロック(その後のブランチブロック)へリンクするためのデータとなる。
【0093】
このとき、アクセス管理部110は、そのインデックスエントリが書き込まれたインデックスブロックのライトカウンタを1増加させる(S55)。
【0094】
続いて、データ挿入部130は、ルートブロックを変更する(S56)。具体的には、データ挿入部130は、オーバーフローすると判定された元のルートブロックから新たに取得されたブロックに、ルートブロックを変更する。例えば、この変更は、ブロックヘッダのブロック種の変更により実現される。
【0095】
次に、データ挿入部130は、空きブロックを更に取得する(S57)。データ挿入部130は、そのオーバーフローすると判定されたインデックスブロック内の移動させるべきエントリを決定し、決定された各エントリを上記取得された空きブロックに順次移動させる(S58)。例えば、データ挿入部130は、予め閾値を保持しており、オーバーフローすると判定されたインデックスブロックのエントリのうち、当該閾値以上のキー値を持つエントリを移動エントリに決定する。その閾値には、中央値などのような、1つ以上のエントリのキー値よりも小さい値を用いる。
【0096】
このとき、アクセス管理部110は、エントリを空きブロックに移すたびに、空きブロックのライトカウンタを1増加させる(S59)。
【0097】
その後、データ挿入部130は、エントリの移動によりできた空き領域に処理(S33)で生成されたインデックスエントリを書き込む(S35)。以降、データ挿入部130及びアクセス管理部110は、上述した処理(S36)以降の各処理を実行する。
【0098】
一方、データ挿入部130は、オーバーフローすると判定されたインデックスブロックがリーフブロック230である場合には(S40;YES)、更に、そのリーフブロック230が拡張されているか否かを確認する(S41)。具体的には、データ挿入部130は、そのリーフブロック230の拡張ポインタが有効であるか否かを拡張ブロック操作部150に判定させる(S41)。データ挿入部130は、そのリーフブロック230が拡張されている場合には(S41;YES)、更に、そのリーフブロック230が、処理(S33)で生成されたインデックスエントリを挿入したとしてもオーバーフローしない拡張ブロックを持つか否かを判定する(S42)。このとき、拡張ブロック操作部150は、そのリーフブロック230の拡張ポインタを参照することにより、リーフブロック230のための拡張ブロックを特定する。
【0099】
データ挿入部130は、そのリーフブロック230がオーバーフローしない拡張ブロックを持つ場合には(S42;YES)、その拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S43)。一方、拡張ブロック操作部150は、そのリーフブロック230が拡張されているがオーバーフローしない拡張ブロックを持たない場合(S42;NO)、新たな拡張ブロックを取得し、その取得された拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S45)。このとき、拡張ブロック操作部150は、その取得された拡張ブロックを特定するためのポインタを拡張ポインタとしてそのリーフブロック230又は既に存在する拡張ポインタに設定する(S45)。
【0100】
拡張ブロック操作部150は、そのリーフブロック230が拡張されていない場合(S41;NO)、そのリーフブロック230における全アクセスに対するライトアクセスの比率を算出する。拡張ブロック操作部150は、算出されたライトアクセスの比率が所定閾値を超えるか否かを判定する(S44)。
【0101】
拡張ブロック操作部150は、ライトアクセスの比率が所定閾値を超えない場合(S44;NO)、データ挿入部130に、そのリーフブロック230に対して上述したようなブロック分割処理を実行させる。これにより、データ挿入部130は、上述した処理(S57)、(S58)及び(S59)を実行する。
【0102】
一方、拡張ブロック操作部150は、ライトアクセスの比率が所定閾値を超える場合(S44;YES)、新たな拡張ブロックを取得し、その取得された拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S45)。このとき、拡張ブロック操作部150は、その取得された拡張ブロックを特定するためのポインタを拡張ポインタとしてそのリーフブロック230又は既に存在する拡張ポインタに設定する(S45)。
【0103】
その後、データ挿入部130は、上述の処理(S43)又は(S45)でインデックスエントリ挿入のための対象ブロックに設定された拡張ブロックに、処理(S33)で生成されたインデックスエントリを書き込む(S35)。以降、データ挿入部130及びアクセス管理部110は、上述した処理(S36)以降の各処理を実行する。なお、当該拡張ブロックに新たなインデックスエントリが書き込まれた場合においても、データ挿入部130は、その拡張ブロックに対応するリーフブロック230のライトブロックを更新する。
【0104】
図7は、第1実施形態におけるDBシステム10のデータ削除時の動作例を示すフローチャートである。
【0105】
データ削除部140は、削除する行データを特定するための値を受け取り、データブロック240から行データを削除する(S61)。行データの削除は、行のデータを消去することで実現してもよいし、その行データに無効を示す値を付加することで実現してもよい。
【0106】
データ削除部140は、削除された行データを特定するインデックスエントリを有するリーフブロック230を特定する(S62)。このリーフブロック230の特定は、削除された行データにおけるキーが設定された列の値を検索キーとしたインデックス検索によりリーフブロック230を特定する場合と同様の手法で実現される。
図4の動作例によれば、(S10)、(S11)、(S12)、(S13)、(S14)及び(S15)の各処理が実行されることにより、当該リーフブロック230が特定される。
【0107】
データ削除部140は、特定されたリーフブロック230における、削除された行データに対応するインデックスエントリを削除する(S63)。このとき、特定されたリーフブロック230が拡張されている場合には、データ検索時の処理と同様に、リーフブロック230及び拡張ブロック内の全エントリを対象にして、削除対象となるインデックスエントリが特定される。更に、このとき、アクセス管理部110は、そのインデックエントリが削除されたリーフブロック230のライトカウンタを増加させる(S64)。削除されたインデックスエントリが拡張ブロック内に存在していたとしても、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。
【0108】
データ削除部140は、エントリを削除したリーフブロック230又は拡張ブロックがアンダーフローするか否かを判定する(S65)。データ削除部140は、アンダーフローが起きていなければ(S65;NO)、処理を終了する。
【0109】
拡張ブロック操作部150は、データ削除部140により、アンダーフローすると判定された場合には(S65;YES)、削除対象として特定されたリーフブロック230の拡張ポインタに無効値が設定されているか否かを判定する(S66)。データ削除部140は、拡張ポインタに無効値が設定されている場合には(S66;YES)、リーフブロック230に残るエントリを、他のリーフブロック230に移動させ、そのリーフブロック230を空きブロックにする(S67)。このとき、アクセス管理部110は、エントリを移動させた先のリーフブロック230のライトカウンタを1増加させる(S68)。
【0110】
なお、移動先ブロックは、一つであってもよいし、複数あってもよく、任意の方法で選択すればよい。また、移動先のリーフブロック230が拡張されている場合には、その移動先のリーフブロック230のための拡張ブロックを移動先ブロックに選択してもよい。この場合においても、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、移動されたエントリの格納される領域が実際には拡張ブロック内であったとしても、そのエントリ移動処理は、通常のエントリ移動処理と同様の処理で実現可能である。
【0111】
データ削除部140は、空きブロックとなったリーフブロック230のアクセスカウンタ(リードカウンタ及びライトカウンタ)を0に設定する。空きブロックとすることで、このブロックはデータ挿入部130又は拡張ブロック操作部150によって再利用される。また、空きブロック化されたリーフブロック230のアクセスカウンタは、それぞれ移動先のブロックのアクセスカウンタに合算されてもよい。
【0112】
続いて、データ削除部140は、ブロック統合が可能か否か判定する(S69)。具体的には、データ削除部140は、空きブロック化されたリーフブロック230の親ブロック(ブランチブロック220)にぶら下がる全子ブロックの全エントリをその親ブロックに入れることができるか否かを判定する(S69)。
【0113】
データ削除部140は、ブロック統合が不可能と判定すると(S69;NO)、処理を終了する。一方、データ削除部140は、ブロック統合が可能と判定すると(S69;YES)、それらブロックを統合する(S70)。つまり、子ブロックの全エントリを親ブロックに移しつつ、親ブロックに存在したエントリは削除する。結果、その親ブロックにぶら下がる全ての子ブロックが空きブロックとされる。
【0114】
このとき、アクセス管理部110は、上位ブロックのライトカウンタを1増加させる(S71)。なお、統合される子ブロックのアクセスカウンタの値は、親ブロックのアクセスカウンタに合算されてもよい。
【0115】
一方で、削除対象として特定されたリーフブロック230の拡張ポインタに有効値が設定されている場合には(S66;NO)、拡張ブロック操作部150が、移動対象のエントリ及び移動先を特定し、データ削除部140が当該移動対象のエントリを当該移動先のブロックに順次移動させる(S72)。これにより、アンダーフローしているリーフブロック230に関し、拡張ブロック間、又は、拡張ブロックとそのリーフブロック230との間で、エントリの移動が実行される。
【0116】
このとき、拡張ブロック操作部150は、リーフブロック230自体がアンダーフローしている場合には、拡張ブロック内のインデックスエントリを移動対象に決定し、アンダーフローしているリーフブロック230を移動先に決定する。また、拡張ブロック操作部150は、拡張ブロックがアンダーフローしている場合には、その拡張ブロック内のエントリを移動対象に決定し、同一リーフブロック230のための他の拡張ブロックを移動先に決定する。
【0117】
アクセス管理部110は、エントリの移動が行われる度に、対応するリーフブロック230のライトカウンタを増加させる(S73)。
【0118】
〔第1実施形態の作用及び効果〕
このように第1実施形態では、各インデックスブロックには、リードカウンタとライトカウンタとがそれぞれ設けられ、データブロック240に対するデータ操作に応じて、検索部120、データ挿入部130及びデータ削除部140によりアクセスされたインデックスブロックのリードカウンタ及びライトカウンタがアクセス管理部110により更新される。このように、第1実施形態によれば、各インデックスブロックへのアクセス回数が、リードアクセスとライトアクセスとで区別されそれぞれ管理される。
【0119】
更に、第1実施形態では、データ挿入部130によりデータ挿入処理が実行される際に、拡張ブロック操作部150により、挿入対象のリーフブロック230における全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かが判定され、ライトアクセスの比率が所定閾値を超える場合に、そのリーフブロック230に拡張ブロックが追加される。この拡張ブロックは、インデックスブロックとは異なり、他のブロック内のインデックスエントリにより特定されず、リーフブロック230の拡張ポインタで特定される。
【0120】
この拡張ブロックは、検索部120、データ挿入部130及びデータ削除部140によるインデックスエントリの操作において、この拡張ブロックを特定するための拡張ポインタが設定されたリーフブロック230のインデックスエントリを格納する領域の一部として扱われる。また、リーフブロック230がアンダーフローする場合には、そのリーフブロック230と拡張ブロックとの間、又は、拡張ブロック間でブロック統合が実施される。
【0121】
このように、第1実施形態によれば、ライトアクセスの比率が大きいリーフブロック230がオーバーフローすると判定された場合には、そのリーフブロック230には、他のブロック内にそれを特定するためのインデックスエントリを設定しなくてもよい拡張ブロックが追加され、リーフブロック230のインデックスエントリを格納するための領域が拡張される。
【0122】
従って、第1実施形態によれば、他のブロックのエントリに影響を与えない拡張ブロックを用いることにより、データ挿入速度を向上させることができる。ところが、拡張ブロックを用いた場合、検索対象となるエントリが増加することになるため、拡張ブロックにより拡張されたリーフブロック230に対する検索速度は低下することになる。そこで、第1実施形態では、ライトアクセスが集中するブロックのみを対象に拡張ブロックを付加することにより、システム全体のパフォーマンスを最適化することができる。なお、上述したright−growing indexは、インデックスブロック間でライトアクセスの比率に差が生じる典型例である。
【0123】
[第2実施形態]
以下、第2実施形態におけるDBシステム10について説明する。第2実施形態は、上述の第1実施形態の構成に加えて、上記拡張ブロックを、リードアクセスの比率に応じて、リーフブロック230となるように設定する構成を更に有する。第2実施形態では、DBシステム10の構成は上述の第1実施形態と同様であるが、各処理部の処理が第1実施形態と異なる。以下、第2実施形態におけるDBシステム10について、第1実施形態と異なる内容を中心に説明し、第1実施形態と同一の内容についての説明は適宜省略する。
【0124】
拡張ブロック操作部150は、拡張ブロックを持つリーフブロック230に関し、全アクセスに対するリードアクセスの比率が所定閾値を超えるか否かを判定し、リードアクセスの比率が所定閾値を超える場合に、当該拡張ブロックをリーフブロック230となるように設定する。具体的には、拡張ブロック操作部150は、リードカウンタの値(R)を、リードカウンタの値とライトカウンタの値との合計(R+W)で除算することにより当該リードアクセスの比率(R/(R+W))を算出する。なお、拡張ブロックをリーフブロック230となるように設定する処理の詳細については、動作例の項において説明する。
【0125】
リードアクセスの比率と比較される所定閾値は、第1実施形態におけるライトアクセスの比率との比較で利用された所定閾値と共に、予め調整可能にメモリ2に格納される。リードアクセスの比率と比較される所定閾値についても、例えば、全インデックスブロックにおけるリードアクセスの全アクセスに対する比率のxパーセンタイル(xは例えば10)等が用いられる。なお、リードアクセスの比率と比較される所定閾値と、第1実施形態におけるライトアクセスの比率との比較で利用された所定閾値とは1つの値であってもよい。
【0126】
〔動作例〕
図8は、第2実施形態におけるDBシステム10の動作例を示すフローチャートである。
図8では、第1実施形態におけるDBシステム10のデータ検索時と同じ処理については
図4と同じ符号が付されている。
【0127】
第2実施形態におけるDBシステム10は、データ検索時において、第1実施形態と同様の処理(S10)から処理(S21)を実行する。インデックスエントリに含まれる識別子で特定される行データが検索部120により抽出されると(S21)、拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに有効値が設定されているか否か、かつ、リードアクセスの比率が所定閾値を超えているか否かを判定する(S81)。
【0128】
拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに無効値が設定されている、又は、リードアクセスの全アクセスに対する比率が所定閾値以下である場合には(S81;NO)、処理を終了する。一方、拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに有効値が設定されており、かつ、リードアクセスの比率が所定閾値を超えている場合には(S81;YES)、そのリーフブロック230が有する拡張ブロックをインデックスブロックとなるように設定する(S82)。
【0129】
処理(S82)において、拡張ブロック操作部150は、リーフブロック230内のその拡張ブロックを特定するための拡張ポインタに無効値を設定する。更に、拡張ブロック操作部150は、その拡張ブロックを
図3に示される形態に設定する。例えば、拡張ブロック操作部150は、ブロックヘッダを、ブロック種がリーフブロック230を示すように設定し、ブロックヘッダにリードカウンタ及びライトカウンタを設ける。なお、拡張ブロックにも、予め、リーフブロック230と同様のブロックヘッダが設けられていてもよい。この場合には、拡張ブロックのブロックヘッダは、拡張ポインタ以外利用されなければよい。
【0130】
拡張ブロック操作部150は、更に、リーフブロック230及びそのリーフブロック230の拡張に利用される拡張ブロックに格納される全エントリをキー値を用いてソートし、最も小さいキー値を持つエントリから所定数のエントリをリーフブロック230に格納し、それ以降のエントリを拡張ブロックに格納する。上記所定数は、例えば、全エントリの数を、リーフブロック230及び拡張ブロックの数で割った値に設定される。
【0131】
拡張ブロック操作部150は、上述のようなエントリのソートをした後、データ挿入部130に、その拡張ブロックを特定するための識別子を含むインデックスエントリをブランチブロック220に追加するように指示する。これにより、データ挿入部130は、その拡張ブロックを対象にして、ブロック分割により生じた新たなブロックを挿入する処理と同様の処理を実行する。具体的には、データ挿入部130は、
図6に示される処理(S38)以降の処理を実行する。
【0132】
リーフブロック230が複数の拡張ブロックにより拡張されている場合には、上述のような処理(S82)は、それら全ての拡張ブロックを対象に実行される。
【0133】
また、上述のような拡張ブロックをインデックスブロックとなるように設定する処理(S81)及び(S82)は、
図8のフローチャートで示される処理の順番に限定されない。例えば、検索部120により処理(S21)が実行されるのと並行して、処理(S81)及び(S82)が実行されてもよい。更に、当該処理(S81)及び(S82)は、データ検索処理とは無関係に、任意のタイミング(例えば、周期的)で、全リーフブロック230を対象に実行されてもよい。
【0134】
〔第2実施形態における作用及び効果〕
このように第2実施形態では、データ挿入速度を向上させるために追加された拡張ブロックが、リードアクセスの比率が所定閾値を超える場合に、リーフブロック230となるように設定される。即ち、第2実施形態では、ライトアクセスの比率が大きいリーフブロック230には拡張ブロックが付加され、そのリーフブロック230のリードアクセスの比率が大きくなると、その拡張ブロックがリーフブロック230となるように設定される。
【0135】
リーフブロック230及びブランチブロック220には近い値を持つキーが格納されるため、特定の範囲のキーが頻繁に挿入される場合、対応するブロックにはライトアクセスが集中する。一方、特定の範囲のキーが頻繁に検索されれば、対応するブロックにはリードアクセスが集中する。したがって、インデックスを張ることで検索速度を向上させるべきブロックとインデックスを張らずに挿入速度を向上させるべきブロックが存在し得る。
【0136】
第2実施形態によれば、アクセス比率に応じてインデックスを張るブロックとインデックスを張らないブロック(拡張ブロック)とを決めているため、ライトアクセスが多いブロックとリードアクセスが多いブロックが混在していても、効率的にデータを処理することができる。言い換えれば、キーの値の範囲によってリードとライトのアクセス比率が異なる場合でも、高い処理性能が実現され得る。更に、第2実施形態によれば、アクセス比率の変化に動的に追随できるために、ワークロードが変化しても十分な性能を達成することができる。
【0137】
上述のような第1実施形態及び第2実施形態における作用効果を具体例に基づいて以下に説明する。例えば、データブロック240が売上明細表を格納し、その売上明細表の中の商品番号がキー値に設定され、その売上明細表に対して、売上明細の挿入及び検索(集計)の各処理が発生する例を想定する。また、この例において、各リーフブロック230に5パーセント(%)から15%の比率でライトアクセスがそれぞれ発生し、リーフブロック230を拡張するか否かの判断に用いられる所定閾値が25%に設定されていると仮定する。
【0138】
この例において、商品番号「1300」の商品の特売がされた場合、この特売商品の売り上げが増加すれば、例えば、商品番号「1000」から商品番号「1999」までの商品の売り上げを記録しているリーフブロック230へのライトアクセス(行の挿入操作)が増加する。このとき、定常的なリードアクセスに大きな変化はなく、ライトアクセスの比率が30%まで増加した場合、上記リーフブロック230には拡張ブロックが付加される。
【0139】
本実施形態によれば、このような一時的かつ部分的なライトアクセスの増加に対して、自動的に、ライトアクセスに対する処理の高速化とリードアクセスに対する処理の低速化とが実現される。そして、本実施形態によれば、増加したライトアクセスに対する処理が高速化された結果、システム全体としての性能が向上する。逆に、特売が終了することにより、ライトアクセスの比率が下がれば、拡張ブロックは、通常のリーフブロック230となるように設定されるため、インデックスが付与されることにより、リードアクセスに対する処理の高速化が実現される。
【0140】
また、本実施形態は、right−growing indexの問題にも有効である。例えば、データブロック240に格納されるデータ表が現在時刻を示す列を持ち、この現在時刻の列がキーに設定される場合、最も新しい時刻を示す一番右側のリーフブロック230にライトアクセスが集中する。本実施形態では、このリーフブロック230に拡張ブロックが付与されるため、現在時刻を更新するためのライトアクセスに対する処理を高速化することができる。
【0141】
一方で、このリーフブロック230と拡張ブロックとを1回検索するのに発生するリードアクセスの数は、拡張ブロックの増加に伴って増加する。例えば、或るリーフブロック230に9つの拡張ブロックが付加されていたとすると、1回の検索で、10回のリードアクセスが発生する。これに対して、1行を挿入するのに発生するライトアクセスは基本的には1回であるため、ライトアクセスの比率は下がる傾向にある。当該比率が或る程度まで下がると、拡張ブロックはリーフブロック230となるように設定される。その結果、一番右側には新たなリーフブロック230が追加され、より最近の時刻を示すキーが挿入される。一般に、ブロックの挿入は、1つずつよりもまとめた方が効率的に処理できることを注記する。
【0142】
[変形例]
上述の第1実施形態では、リーフブロック230を拡張するか否かの判断は、そのリーフブロック230における全アクセスに対するライトアクセスの比率と所定閾値との比較結果に基づいて実施されたが、単に、ライトカウンタがリードカウンタより多い場合に、リーフブロック230を拡張すると判断するようにしてもよい。また、リードカウンタに対するライトカウンタの比率と所定閾値との比較により、リーフブロック230を拡張するか否かの判断が実施されてもよい。
【0143】
また、上述の第2実施形態では、拡張ブロックをリーフブロック230となるように設定するか否かの判断は、そのリーフブロック230における全アクセスに対するリードアクセスの比率と所定閾値との比較結果に基づいて実施されたが、単に、リードカウンタがライトカウンタより多い場合に、拡張ブロックをリーフブロック230となるように設定すると判断するようにしてもよい。また、ライトカウンタに対するリードカウンタの比率と所定閾値との比較により、拡張ブロックをリーフブロック230となるように設定するか否かの判断が実施されてもよい。
【0144】
また、上述の各実施形態では、リーフブロック230及び各拡張ブロックには1つの拡張ポインタがそれぞれ設けられたが、拡張ブロックには拡張ポインタを設けず、リーフブロック230に複数の拡張ポインタを設けるようにしてもよい。
【0145】
また、上述の各実施形態では、アクセスカウンタ(リードカウンタ及びライトカウンタを含む)は1ずつ増やされたが、この増加幅は、アクセス種別等に応じて適宜変えてもよい。
【0146】
なお、上記各実施形態の説明は、複数のフローチャートを用いており、それぞれに複数のステップ(処理)を順番に記載しているが、本実施形態は、各ステップの順番を図示される順番に限定するものではない。本実施形態では、図示される処理ステップの順番を内容的に支障しない範囲で変更することができる。また、上述した各実施形態及び変形例は、その内容が相反しない範囲で組み合わせることができる。
【0147】
この出願は、2011年2月22日に出願された日本出願特願2011−035437を基礎とする優先権を主張し、その開示の全てをここに取り込む。