JP5790755B2 - データベース管理装置及びデータベース管理方法 - Google Patents

データベース管理装置及びデータベース管理方法 Download PDF

Info

Publication number
JP5790755B2
JP5790755B2 JP2013500713A JP2013500713A JP5790755B2 JP 5790755 B2 JP5790755 B2 JP 5790755B2 JP 2013500713 A JP2013500713 A JP 2013500713A JP 2013500713 A JP2013500713 A JP 2013500713A JP 5790755 B2 JP5790755 B2 JP 5790755B2
Authority
JP
Japan
Prior art keywords
block
index
data
leaf
counter
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2013500713A
Other languages
English (en)
Other versions
JPWO2012114402A1 (ja
Inventor
盛朗 佐々木
盛朗 佐々木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NEC Corp filed Critical NEC Corp
Priority to JP2013500713A priority Critical patent/JP5790755B2/ja
Publication of JPWO2012114402A1 publication Critical patent/JPWO2012114402A1/ja
Application granted granted Critical
Publication of JP5790755B2 publication Critical patent/JP5790755B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/13File access structures, e.g. distributed indices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/17Details of further file system functions
    • G06F16/1727Details of free space management performed by the file system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2264Multidimensional index structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2272Management thereof
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/40Information retrieval; Database structures therefor; File system structures therefor of multimedia data, e.g. slideshows comprising image and additional audio data
    • G06F16/41Indexing; Data structures therefor; Storage structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/31Indexing; Data structures therefor; Storage structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/80Information retrieval; Database structures therefor; File system structures therefor of semi-structured data, e.g. markup language structured data such as SGML, XML or HTML
    • G06F16/81Indexing, e.g. XML tags; Data structures therefor; Storage structures

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Multimedia (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、ツリー構造のインデックスが付加されたデータベースの管理技術に関する。
大量のデータから少量のデータを高速に検索するために、データにインデックスを付与するのが一般的である。検索処理が多く実行されるのはデータベースであり、最も広く用いられているデータベースの一つは、表形式でデータを管理する関係データベースである。表は、行と列を持ち、例えば、一つの行に一つの取引に関するデータを格納する。行は、複数の列から構成され、例えば、ある列に日付データを、別の列に売上金額を格納する。
この場合、特定の日付における総売上金額を得る方法には、フルスキャン、インデックススキャン等がある。フルスキャンでは、全ての行に関して日付が一致するかどうかを調べ、一致する行の売上高を加算する。インデックススキャンでは、日付が一致する行をインデックスによって特定し、特定された行から売上高の総和を得る。インデックススキャンは、全行数に比べて日付が一致する行の数が十分に小さいときに効率的である。
Bツリーは、インデックスを格納するデータ構造の一つとして知られている。例えば、非特許文献1には、Bツリーを使った検索、Bツリーへのデータの挿入、Bツリーへのデータの削除の各アルゴリズムが記載されている。非特許文献2には、広く用いられている関係データベースのORACLE(登録商標)におけるBツリーの説明が記載されている。
このようなBツリーインデックスを用いることにより、行数をnとすると、「log n」に比例する計算量でデータを検索することができる。なお、フルスキャンの計算量は、nに比例する。
また、特許文献1には、同一のキー値に対して複数のアクセスが生じた場合に発生するロック競合を減らすために、複数のツリー構造のインデックスを用意し、キー値をいずれか1つに格納するインデックス管理方式が提案されている。この方式では、インデックス中のキー数が均等化され、各インデックスに対するアクセス数がカウントされることで、各インデックスのアクセス負荷の均等化が図られる。
特許文献2には、Bツリーインデックスでのロック競合の回数を数え、多数のロック競合が起きた場合に、Bツリーを分割するデータベース管理手法が提案されている。
特許文献3には、Bツリー等のバランス木にレコード追加する場合に、ブロックを分割することなく、1回の入出力処理で読み書きできる大きさまでそのブロックを拡大させるレコード追加処理方式が提案されている。なお、この方式では、限界の大きさまでブロックが拡大された後は、ブロック分割が行われる。
特許文献4には、ノンデンスBツリークラスタ構造を用いた格納構造によりデータを管理するデータ処理システムにおけるスプリット制御方法が提案されている。この方法では、オーバーフロー時のブロック分割を即時に行うのではなく、対象レコードをオーバーフロー領域へ書き込むことで、ブロック分割処理のオーバーヘッドが低減される。
また、非特許文献3には、挿入アプリケーションでの索引のホットスポットを除去するように設計されている逆キー索引手法が提案されている。例えば、データ挿入時の時刻を示す列にBツリーインデックスを張った場合には、インデックスの一番右の(一番大きい値を持つ)リーフブロックとその上位のブランチブロックにライトアクセスが集中する。逆キー索引手法は、このようなright−growing indexと呼ばれる状況を避けるため、インデックスのキー値を反対にして構築する。具体的には、通常の索引では、一般的には、キー値(102)及びキー値(103)は、同じブロックに挿入されるが、逆キー索引では、これらのキー値が、反対にされた値(201)及び値(301)として扱われることにより、異なるブロックに挿入される。
特開平5−334153号公報 特開平7−200376号公報 特許第2615046号 特許第2708657号
Comer, D. "Ubiquitous B-Tree", ACM Computing Surveys, vol.11, no.2, p.121-137, June 1979 "Oracle Database概要"、10g リリース2、部品番号:B19215-02、2006年3月(図5-7)、http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02.pdf "Oracle Database パフォーマンス・チューニング・ガイド"、10g リリース2 (10.2)、部品番号:B19207-02、2008年5月、2-12(アプリケーション設計の原則)、http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02.pdf
Bツリーインデックスが付加されたデータベースでは、一般的には、検索は高速であるが、データの挿入及び削除は低速になる。Bツリーインデックスが付加されていないデータベースに対するデータの挿入及び削除は、単に表として記録されたデータを操作すればよい。しかしながら、Bツリーインデックスが付加された表に対するデータの挿入及び削除は、Bツリーに記録されたデータも操作しなければならないからである。更に、Bツリーでは、操作を加えるブロックの空き領域の過不足によって、ブロック自体の追加及び削除が発生する場合もある。この場合、そのブロックの上位のブロックのデータも操作する必要がある。
従って、データベースにインデックスを付加する形態、及び、データベースにインデックスを付加しない形態は、共に、メリット及びデメリットを持つため、データベースに対する処理全体を考慮した場合、いずれの形態も十分な性能を達成できない可能性がある。このような問題は、例えば、特定の範囲のキーの挿入及び検索が頻繁に発生する場合等に生じ得る。これは、特定の範囲のキーが頻繁に挿入される場合には、対応するブロックにライトアクセスが集中し、特定の範囲のキーが頻繁に検索される場合には、対応するブロックにリードアクセスが集中するからである。
上述のような問題は、リーフブロック又はブランチブロックには近い値を持つキーが格納されることにも起因する。そこで、上述の逆キー索引によれば、特定範囲のキーの挿入処理及び検索処理の対象となるブロックを分散させることができるため、上述のような問題の一部を解決することができる。
ところが、逆キー索引には、範囲検索ができないという問題がある。また、データベースの管理者や運用者が、逆キー索引を用いるか否かの決定のために、検索及び挿入の発生頻度を正確に認識する必要があるという問題がある。
本発明の目的は、ツリー構造のインデックスが付加されたデータベースの性能を最適化するためのデータベース管理技術を提供することにある。
本発明の各態様では、上述した課題を解決するために、それぞれ以下の構成を採用する。
第1の態様は、表データを格納するデータブロックを含むデータベースを管理するデータベース管理装置に関する。第1態様に係るデータベース管理装置は、上記表データを構成する1つの行データ又は他のインデックスブロックを特定するための少なくとも1つのインデックスエントリと、リードカウンタ及びライトカウンタを含むアクセスカウンタとをそれぞれ有し、ツリー構造を持つ複数のインデックスブロックと、上記表データに対するデータ操作に応じてツリー構造に沿ってアクセスされたインデックスブロックに関し、インデックスブロックへのリードアクセスに応じてリードカウンタを更新し、インデックスブロックへの更新アクセスに応じてライトカウンタを更新するアクセス管理手段と、データブロックに挿入される新たな行データを特定するための新たなインデックスエントリを複数のインデックスブロックのうちの挿入対象のリーフブロックに挿入するデータ挿入手段と、挿入対象のリーフブロックにおけるリードカウンタとライトカウンタとの比較結果に基づいて、上記新たなインデックスエントリの格納先として、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得し、当該拡張ブロックを特定するための特定情報を挿入対象のリーフブロックに設定する拡張ブロック操作手段と、を備える。
第2の態様は、表データを格納するデータブロックを含むデータベースを管理するデータベース管理方法に関する。第2態様に係るデータベース管理方法では、表データを構成する1つの行データ又は他のインデックスブロックを特定するための少なくとも1つのインデックスエントリと、リードカウンタ及びライトカウンタを含むアクセスカウンタとをそれぞれ有し、ツリー構造を持つ複数のインデックスブロックを格納するコンピュータが、上記表データに対するデータ操作に応じてツリー構造に沿ってアクセスされたインデックスブロックに関し、インデックスブロックへのリードアクセスに応じてリードカウンタを更新し、インデックスブロックへの更新アクセスに応じてライトカウンタを更新し、データブロックに挿入される新たな行データを特定するための新たなインデックスエントリを複数のインデックスブロックのうちの挿入対象のリーフブロックに挿入し、挿入対象のリーフブロックにおけるリードカウンタとライトカウンタとの比較結果に基づいて、上記新たなインデックスエントリの格納先として、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得し、当該拡張ブロックを特定するための特定情報を前記挿入対象のリーフブロックに設定する。
本発明の他の態様としては、上記第1態様に係る各構成をコンピュータに実現させるプログラムであってもよいし、このプログラムを記録したコンピュータが読み取り可能な記録媒体であってもよい。この記録媒体は、非一時的な有形の媒体を含む。
上記各態様によれば、ツリー構造のインデックスが付加されたデータベースの性能を最適化するためのデータベース管理技術を提供することができる。
図1は、第1実施形態におけるデータベース(DB)システムの構成例を示す概念図である。 図2は、ブランチブロックの構成例を概念的に示す図である。 図3は、リーフブロックの構成例を概念的に示す図である。 図4は、第1実施形態におけるデータベース(DB)システムのデータ検索時の動作例を示すフローチャートである。 図5は、ブランチブロック、リーフブロック及びデータブロックの関係の例を概念的に示す図である。 図6は、第1実施形態におけるデータベース(DB)システムのデータ挿入時の動作例を示すフローチャートである。 図7は、第1実施形態におけるデータベース(DB)システムのデータ削除時の動作例を示すフローチャートである。 図8は、第2実施形態におけるデータベース(DB)システムの動作例を示すフローチャートである。
以下、本発明の実施の形態としてのデータベースシステム(以降、DBシステムと表記する)について説明する。なお、以下に挙げる各実施形態はそれぞれ例示であり、本発明は以下の各実施形態の構成に限定されない。
[第1実施形態]
〔システム構成〕
図1は、第1実施形態におけるDBシステム10の構成例を示す概念図である。DBシステム10は、図1に示すように、ハードウェア構成として、CPU1、メモリ2(RAM(Random Access Memory)、ROM(Read Only Memory)、ハードディスク(HDD)等)、入出力インタフェース3等を有する。これら各ハードウェア要素は例えばバス5により接続される。入出力インタフェース(入出力I/F)3は、外部のコンピュータ等と通信を行うためのネットワークインタフェースやユーザインタフェース等を含む。
DBシステム10は、例えば、メモリ2に格納されるプログラムがCPU1により読み出され実行されることにより、以下のような各処理部を実現する。DBシステム10は、データベース管理部(以降、DB管理部と表記する)100、データベース(以降、DBと表記する)部200等を有する。
なお、図1の例では、DBシステム10が1台のコンピュータとして実現される例を示すが、複数のコンピュータで実現されてもよい。また、図1の例では、1つのCPU1のみが示されるが、複数のプロセッサ(例えば、CPU、DSP(Digital Signal Processor)等)を有していてもよい。例えば、DB管理部100とDB部200とが異なるコンピュータ又はCPU上で実現されてもよい。本実施形態は、DBシステム10のハードウェア構成を限定しない。
DB部200は、メモリ2上に実現され、複数のブロック210(図1では210(#1)、210(#2)、210(#n)として表記)を含む。各ブロック210は、例えば、所定容量(例えば、4キロバイト(KB))の連続した記憶領域として確保される。ブロック210間は、連続領域として確保されてもよいし、非連続な各領域として確保されてもよい。本実施形態は、ブロック210の領域サイズを限定しない。
各ブロック210は、インデックスを格納するブロック(以降、インデックスブロックとも表記される)と、データを格納するブロック(以降、データブロックとも表記される)240とに大別される。データブロック240は、任意の表(テーブル)を格納する。
インデックスブロックは、ツリー構造(例えば、Bツリー(Balanced Tree)構造)を持ち、更に、ブランチブロック220と、リーフブロック230とに大別される。ブランチブロック220及びリーフブロック230の各々は、インデックスとなる少なくとも1つのエントリを格納する。各インデックスブロックに格納されるエントリは、インデックスエントリと呼ぶこともできる。インデックスエントリは、検索対象となるキー値と識別子(ID)とを含む。
リーフブロック230は、インデックスブロックの中の最下層のブロックである。リーフブロックのエントリに含まれる識別子は、データブロックのいずれか1つの行データを特定するためのデータである。その識別子は、例えば、特定すべき行データの先頭を指すポインタとその行データのサイズとから構成される。
ブランチブロック220は、リーフブロック230又は他のブランチブロック220へのリンクを持つブロックである。このリンクは、インデックスエントリの識別子によって実現される。即ち、ブランチブロック220のエントリに含まれる識別子は、いずれか1つのブランチブロック220又はいずれか1つのリーフブロック230を特定するポインタである。以降、最上位のブランチブロック220をルートブロックと表記する場合もある。ここで、最上位とは、検索時に最初に検索されることを意味する。
以降、インデックスエントリの識別子によりリンクされた各インデックスブロックにおいて、そのインデックスエントリを含むブランチブロック220を親ブロックと表記し、そのインデックスエントリの識別子で特定されるリーフブロック230又は他のブランチブロック220を子ブロックと表記する場合もある。
図2は、ブランチブロック220の構成例を概念的に示す図である。図2に示すように、ブランチブロック220は、ブロックヘッダと少なくとも1つのインデックスエントリとをそれぞれ含む。インデックスエントリは、上述したように、キー値(図2の「key」)と識別子(図2の「id」)とを含む。ブロックヘッダには、ブロック種、アクセスカウンタ等が設定される。
ブロック種は、リーフブロック、ブランチブロック等を識別するための情報である。アクセスカウンタは、リードカウンタ及びライトカウンタを含み、インデックスブロックへのアクセスの数をカウントする。具体的には、ブランチブロック220へのリードアクセスに応じてリードカウンタが更新され、ブランチブロック220への更新アクセス(エントリ追加及びエントリ削除)に応じてライトカウンタが更新される。
図3は、リーフブロック230の構成例を概念的に示す図である。図3に示すように、リーフブロック230は、そのブロックヘッダに拡張ポインタを有する点において、ブランチブロック220と異なる。リーフブロック230のその他の構成については、ブランチブロック220と同様である。拡張ポインタは、リーフブロック230の容量を拡張するために追加される拡張ブロックを特定するための情報である。例えば、拡張ポインタには、拡張ブロックのアドレスが設定される。なお、拡張ブロックを持たないリーフブロック230の拡張ポインタには、無効値(例えば、NULL)が設定される。以降、リーフブロック230を拡張するとの表記は、そのリーフブロック230に拡張ブロックを付加することを意味する。
拡張ブロックは、メモリ2上に実現される、上述のブロック210のうちの一つである。拡張ブロックには、リーフブロック230と同様に、データブロックのいずれか1つの行データを特定する識別子を含むインデックスエントリが格納される。拡張ブロックは、他のインデックスブロック(ブランチブロック220)のインデックスエントリにより特定されない点において、インデックスブロックとは異なる。1つのリーフブロック230に対して複数の拡張ブロックが追加された場合には、拡張ブロックには、他の拡張ブロックを特定するための拡張ポインタが設定される。
上述のように、図2及び図3では、インデックスブロック内の連続領域に、ブロックヘッダ内の各値及び各エントリが格納される例を示したが、ブロックヘッダ内の各値と各エントリとは、相互に関連付けられていれば、必ずしも連続した領域に格納されなくともよい。
以降、ブランチブロック220、リーフブロック230、データブロック240、及び拡張ブロックを単にブロックと表記する場合もある。また、インデックスエントリを単にエントリと表記する場合もある。
DB管理部100は、アクセス管理部110、検索部120、データ挿入部130、データ削除部140、拡張ブロック操作部150等を含む。DB管理部100に含まれるこれら各処理部も、メモリ2に格納されるプログラムがCPU1により読み出され実行されることにより、ソフトウェア要素として実現される。
検索部120は、検索キーを取得し、この検索キーに対応する列(フィールド)のデータを含む行をデータブロック240から抽出する。検索キーは、他の装置から通信を介して取得されてもよいし、CPU1により実行されているプロセス等のような他の処理部から取得されてもよいし、ユーザインタフェースを介してユーザにより入力されてもよい。
検索部120は、データブロック240における抽出すべき行を特定するために、インデックス検索を行う。このインデックス検索において、検索部120は、まず、ルートブロックにアクセスする。検索部120は、ルートブロックに含まれるエントリのうち、検索キー以下の最大のキー値を持つエントリ、又は、検索キー以上の最小のキー値を持つエントリを検索する。
検索部120は、抽出されたエントリの識別子により特定される他のブランチブロック220又はリーフブロック230を読み出す。検索部120は、他のブランチブロック220が読み出された場合には、上記のルートブロックに対する検索と同様に特定のエントリを抽出する。一方、検索部120は、リーフブロック230が読み出された場合には、検索キーの条件を満たすエントリを抽出し、そのエントリの識別子で特定される行データをデータブロック240から抽出する。
検索部120は、リーフブロック230が読み出された場合で、かつ、そのリーフブロック230の拡張ポインタに有効値が設定されている(そのリーフブロック230が拡張されている)場合には、リーフブロック230に含まれるエントリと、その拡張ポインタで特定される拡張ブロックに含まれるエントリとを対象に、検索キーの条件を満たすエントリを抽出する。言い換えれば、検索部120は、拡張ブロックをリーフブロック230のインデックスエントリを格納する領域の一部として扱う。
データ挿入部130は、挿入する行データを受け取り、データブロック240にその行データを書き込む。このとき、データ挿入部130は、その挿入された行データに基づいて、インデックスブロック内のインデックスを更新する。データブロック240への書き込みは、例えば、挿入すべき行データよりも大きな空き領域を持つブロックのいずれか1つに書き込まれる。
データ挿入部130は、インデックスの更新において、対応するリーフブロック230に、その挿入された行データに対応する新たなインデックスエントリを追加する。この新たなインデックスエントリは、キーが設定される列であって挿入された行に含まれる列のデータをキー値として含み、更に、その行を特定するための識別子を含む。
データ挿入部130は、更新対象のリーフブロック230が拡張されている場合には、そのリーフブロック230の拡張ブロックに新たなインデックスエントリを追加する。リーフブロック230が拡張されているか否かは、後述する拡張ブロック操作部150から送られるデータに基づいて判断される。なお、データ挿入部130も、拡張ブロックをリーフブロック230のインデックスエントリを格納する領域の一部として扱う。
インデックスの更新では、リーフブロック230へのエントリの追加に加えて、ブランチブロック220にも新たなインデックスエントリを追加することが要求される場合がある。それは、挿入対象のリーフブロック230に、新たなインデックスエントリを追加するための十分な空き領域がない場合(オーバーフローが起きる場合)である。
このようにオーバーフローが起きる場合には、データ挿入部130は、ブロック分割を行うことによって空き領域を作る。ブロック分割では、データ挿入部130は、所定容量の空き領域がなくなったリーフブロック230のデータの一部を新たに確保したリーフブロック230に移すことで空き領域を作り出す。ブロック分割は、リーフブロック230のみでなくブランチブロック220においても同様に処理される。ブロック分割の詳細については動作例の項で詳述する。
データ削除部140は、削除する行データを特定するための値を受け取り、データブロック240から行データを削除し、削除された行データに対応するインデックスエントリをリーフブロック230から削除する。例えば、削除する行データを特定するための値は、検索部120の検索処理の結果として取得される。ここで、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、削除対象のインデックスエントリが実際には拡張ブロックに格納されている場合であっても、データ削除部140は、特定されたエントリを通常の処理と同様に削除する。
インデックスエントリをリーフブロック230又はその拡張ブロックから削除することにより、リーフブロック230又はその拡張ブロックの空き領域が所定サイズ以上となる場合(アンダーフローが起きる場合)、データ削除部140は、そのリーフブロック230が拡張されているか否かに応じて、以下のような処理を実行する。
データ削除部140は、そのリーフブロック230が拡張されていない場合には、このリーフブロック230を空きブロックにし、かつ、必要に応じて、ブロック統合処理を実行する。このブロック統合処理については動作例の項において詳述する。
一方、データ削除部140は、そのリーフブロック230が拡張されている場合には、拡張ブロックの統合処理を実行する。具体的には、データ削除部140は、そのリーフブロック230が拡張されている場合で、かつ、リーフブロック230自体にアンダーフローが起きると判定した場合には、拡張ブロック内のインデックスエントリをそのリーフブロック230に移動させる。データ削除部140は、そのリーフブロック230が拡張されている場合で、かつ、拡張ブロックにアンダーフローが起きると判定した場合には、同一リーフブロック230のための他の拡張ブロックに、その拡張ブロックのインデックスエントリを移動させる。
拡張ブロック操作部150は、データ挿入部130がブロック分割を行う前に、リーフブロック230のブロック分割を行うか、拡張ブロックを用いたリーフブロック230の容量の拡張を行うかのいずれか一方を選択する。この選択のために、拡張ブロック操作部150は、新たなインデックスエントリが追加されるリーフブロック230における全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かを判定する。具体的には、拡張ブロック操作部150は、ライトカウンタの値(W)を、リードカウンタの値とライトカウンタの値との合計(W+R)で除算することにより、当該ライトアクセスの比率(W/(W+R))を算出する。
拡張ブロック操作部150は、当該ライトアクセスの比率が所定閾値を超える場合に、拡張ブロックを用いたリーフブロック230の容量の拡張を選択し、新たな拡張ブロックを取得する。拡張ブロック操作部150は、拡張ブロックを取得すると、その拡張ブロックへのポインタをリーフブロック230の拡張ポインタに設定する。一方、拡張ブロック操作部150は、当該ライトアクセスの比率が所定閾値以下である場合には、データ挿入部130にリーフブロック230のブロック分割を実行させる。
上記所定閾値は、例えば、予め調整可能にメモリ2に格納される。当該所定閾値には、例えば、全インデックスブロックにおけるライトアクセスの全アクセスに対する比率のxパーセンタイル(xは例えば10)等が用いられる。
拡張ブロック操作部150は、検索部120においてリーフブロック230が読み出された場合に、そのリーフブロック230の拡張ポインタ及び拡張ブロックの拡張ポインタを参照することにより、そのリーフブロック230のための全ての拡張ブロックを特定する。拡張ブロック操作部150は、それら拡張ブロックに含まれるエントリを検索対象とするように検索部120に指示する。
拡張ブロック操作部150は、データ削除部140により、リーフブロック230と拡張ブロックとの間、又は、拡張ブロック間におけるインデックスエントリの移動が実行される場合に、移動対象とする拡張ブロック及び移動対象とするインデックスエントリを特定する。リーフブロック230と拡張ブロックとの間、及び、拡張ブロック間におけるインデックスエントリの移動は、拡張ブロックを空ブロックとするように実行されることが好ましい。また、拡張ブロック操作部150は、インデックスエントリの移動により、リーフブロック230がオーバーフローしないように、移動させるインデックスエントリの数を決める。
アクセス管理部110は、データブロック240に対するデータ操作に応じてツリー構造に沿ってアクセスされた各インデックスブロックに関し、アクセスカウンタをそれぞれ更新する。具体的には、アクセス管理部110は、検索部120、データ挿入部130及びデータ削除部140によるインデックスブロックへのアクセス内容に基づいて、リードアクセス時にはそのインデックスブロックのリードカウンタを更新し、更新アクセス時にはそのインデックスブロックのライトカウンタを更新する。更新アクセスには、エントリの挿入操作及びエントリの削除操作が含まれる。なお、エントリの移動操作は、エントリの挿入操作とエントリの削除操作との組み合わせで実現される。
アクセス管理部110は、検索部120がインデックス検索を行うことによりインデックスエントリの識別子により特定されるブランチブロック220又はリーフブロック230を読み出す際に、その読み出されたインデックスブロックのブロックヘッダのアクセスカウンタを増加させる。但し、ルートブロックは最初に参照されるブロックであるため、検索部120は、アクセスした際に、ルートブロックのブロックヘッダのアクセスカウンタを増加させる。
アクセス管理部110は、検索部120がルートブロックのいずれかのエントリの識別子が示すブランチブロック220を読む際に、そのブランチブロック220のアクセスカウンタを1増加させる。更に、アクセス管理部110は、検索部120がこのブランチブロック220からたどるリーフブロック230にアクセスするときに、リーフブロック230のアクセスカウンタを1増加させる。
アクセス管理部110は、行データ挿入時においてデータ挿入部130により新たなインデックスエントリが追加されると、そのインデックスエントリが追加されたインデックスブロックのライトカウンタを1増加させる。このとき、アクセス管理部110は、そのインデックスエントリが追加されたインデックスブロックを検索するまでにアクセスされた各インデックスブロックのリードカウンタをそれぞれ1増加させる。
同様に、行データ挿入時においてブロック分割が行われる場合には、アクセス管理部110は、そのブロック分割処理においてアクセスされたインデックスブロックのリードカウンタを増加させ、かつ、ブロック分割処理でエントリが移動させられる度に移動先のインデックスブロックのライトカウンタを1増加させる。
また、アクセス管理部110は、データ削除部140がインデックスブロックからエントリを削除した場合には、そのインデックスブロックのライトカウンタを増加させる。更に、アクセス管理部110は、データ削除部140がインデックスブロックを空きブロックにする場合には、そのインデックスブロックを空きブロックにするために移動されたエントリの移動先となる他のインデックスブロックのライトカウンタを増加させる。
ここで、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、実際には拡張ブロック内のエントリが操作された場合であっても、その拡張ブロックを持つリーフブロック230のアクセスカウンタが更新される。具体的には、検索部120により拡張ブロック内のエントリが抽出された場合であっても、その拡張ブロックに対応するリーフブロック230のリードカウンタが更新される。同様に、データ挿入部130により拡張ブロックに新たなエントリが追加された場合、及び、データ削除部140により拡張ブロックのエントリが削除された場合であっても、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。また、データ削除部140により拡張ブロックの統合処理が実行される場合には、拡張ブロック内のエントリを移動させる度に、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。
〔動作例〕
以下、第1実施形態におけるDBシステム10の動作例について図4から図7を用いて説明する。図4は、第1実施形態におけるDBシステム10のデータ検索時の動作例を示すフローチャートである。図4の例では、完全一致検索を行う場合の動作が示される。図5は、ブランチブロック220、リーフブロック230及びデータブロック240の関係の例を概念的に示す図である。ここでは、図5の例において、文字列の大小を辞書順に従って比較することを想定し、検索部120が、検索キー「go」を列データに含む行を検索する場合を例に挙げて、当該動作例を説明する。
検索部120は、検索キーを取得すると、まず、ルートブロックを読み出す(S10)。図5の例では、検索部120は、検索キー「go」を取得すると、キー値「e」、「m」、「t」を含む各インデックスエントリを持つルートブロックを読み出す。
アクセス管理部110は、検索部120がルートブロックにアクセスした場合に、そのルートブロックのリードカウンタを1増加させる(S11)。
検索部120は、ルートブロック内のインデックスエントリのうち、当該検索キー以下の最大のキー値を持つエントリ、又は、当該検索キー以上の最小のキー値を持つエントリを特定する。いずれの特定方法を取っても一般性を失わないので、ここでは、検索部120は、当該検索キー以下の最大のキー値を持つエントリを特定するものとする(S12)。このエントリの特定は、ブロック中の全てのエントリを比較することにより実現されてもよいし、ブロック中のエントリをキー値でソートした上で一部のエントリを比較することにより実現されてもよい。
図5の例では、簡略化されているが、キー値「e」については、例えば、キー値「e」を持つエントリと「e」より小さい値を示すキー値(例えば、NULL)を持つエントリとが含まれる。ここで、検索キー「go」以下の最大のキー値は「e」であり、検索キー「go」は、キー値「e」より大きくキー値「m」よりも小さいので、左から2番目のブランチブロックを特定する識別子を含むエントリが特定される。
続いて、検索部120は、そのように特定されたエントリの識別子によって特定されるインデックスブロックを読み出す(S13)。
アクセス管理部110は、検索部120がインデックスブロックを読み出すと、そのインデックスブロックのリードカウンタを1増加させる(S14)。
検索部120は、ブロックヘッダに設定されるブロック種により、その読み出されたインデックスブロックがリーフブロック230かブランチブロック220かを判定する(S15)。検索部120及びアクセス管理部110は、その読み出されたインデックスブロックがブランチブロック220である場合には(S15;NO)、その読み出されたブランチブロック220に関し上記(S12)、(S13)及び(S14)の処理を実行する。
検索部120は、その読み出されたインデックスブロックがリーフブロック230である場合には(S15;YES)、その読み出されたリーフブロック230内のエントリを取得する(S16)。図5の例では、リーフブロック230内のエントリ(キー値「game」を含むエントリからキー値「gift」を含むエントリまで)が取得される。
続いて、拡張ブロック操作部150が、その読み出されたリーフブロック230の拡張ポインタが無効か否かを判定する(S17)。この判定は、拡張ポインタに有効値が設定されているか否かにより行われる。拡張ブロック操作部150は、拡張ポインタが有効であると判定すると(S17;NO)、その拡張ポインタにより特定される拡張ブロック内のエントリを取得する(S18)。図5の例では、リーフブロック230の拡張ブロック内のエントリ(キー値「give」を含むエントリからキー値「hear」を含むエントリまで)が取得される。
拡張ブロック操作部150は、その拡張ブロック内の拡張ポインタに有効値が設定されている場合には、更に、その拡張ポインタで特定される他の拡張ブロック内のエントリも取得する。このようにして、拡張ブロック操作部150は、その読み出されたリーフブロック230のための各拡張ブロック内のエントリをそれぞれ取得する(S18)。なお、リーフブロック230の拡張ポインタが無効であると判定すると(S17;YES)、検索部120は、処理(S20)を実行する。
検索部120は、処理(S16)で取得されたリーフブロック230内のエントリ、及び、処理(S18)で取得された拡張ブロック内のエントリの中から、検索キーを含む検索条件に一致するエントリを特定する(S20)。ここでは、その検索条件は、検索キーを列データに含む行(完全一致)の検索を示す。図5の例では、キー値「go」を含むインデックスエントリが特定される。
このインデックスエントリの特定は、リーフブロック230及びそのリーフブロック230が持つ拡張ブロック内の全てのエントリを比較することにより実現されてもよいし、それらエントリをキー値でソートした上で一部のエントリを比較することにより実現されてもよい。
検索部120は、特定されたインデックスエントリに含まれる識別子で特定される行データを抽出する(S21)。図5の例では、キー値「go」を含むインデックスエントリの識別子により特定されるデータブロック240の行が抽出される。例えば、その識別子に含まれるポインタで、行データの先頭が特定され、その先頭アドレスから行の大きさ(バイト数)分のデータが読み出される。
図6は、第1実施形態におけるDBシステム10のデータ挿入時の動作例を示すフローチャートである。
データ挿入部130は、挿入すべき行データを取得すると、この行データを空き領域のある任意のデータブロック240に書き込む(S31)。
データ挿入部130は、挿入された行データに対応するインデックスエントリを挿入すべきリーフブロック230を特定する(S32)。このリーフブロック230の特定は、挿入された行データにおけるキーが設定された列の値を検索キーとしたインデックス検索によりリーフブロック230を特定する場合と同様の手法で実現される。図4の動作例によれば、(S10)、(S11)、(S12)、(S13)、(S14)及び(S15)の処理が実行されることにより、挿入すべきリーフブロック230が特定される。
このとき、挿入された行データに対応するリーフブロック230を特定するために読み出されたインデックスブロックのリードカウンタは、アクセス管理部110によりカウントアップされる。
続いて、データ挿入部130は、特定されたリーフブロック230に挿入すべき新たなインデックスエントリを生成する(S33)。新たなインデックスエントリは、挿入された行データにおけるキーが設定された列の値をキー値として含み、挿入された行データを特定するための識別子を含む。
データ挿入部130は、特定されたリーフブロック230が新たなインデックスエントリの追加によりオーバーフローするか否かを判定する(S34)。ここで、オーバーフローとは、新たなインデックスエントリを追加するとブロックの空き領域が所定の比率を下回ることである。
データ挿入部130は、オーバーフローしないと判定すると(S34;NO)、その特定されたリーフブロック230にその新たに生成されたインデックスエントリを書き込む(S35)。このとき、アクセス管理部110は、書き込まれたリーフブロック230のライトカウンタを1増加させる(S36)。
続いて、データ挿入部130は、ブロック分割がなされたか否かを判定する(S37)。データ挿入部130は、ブロック分割がされていない場合には(S37;NO)、処理を終了し、ブロック分割がなされている場合には(S37;YES)、ブロック分割がなされたブロックの上位のブランチブロックを特定する(S38)。この上位ブランチブロックの特定は、再帰関数的な処理を施すことにより実現してもよいし、ブロックヘッダに上位ブロックの識別子を格納することで実現してもよい。
以降、データ挿入部130は、その特定された上位ブランチブロックを対象ブロックとして処理(S33)に戻って各処理を実行する。
一方、データ挿入部130は、オーバーフローすると判定した場合には(S34;YES)、そのオーバーフローすると判定されたインデックスブロックがリーフブロック230であるか否かを判定する(S40)。
対象のインデックスブロックがリーフブロック230でない場合には(S40;NO)、データ挿入部130は、その対象のインデックスブロックに対してブロック分割処理を実行する。
ブロック分割処理では、まず、データ挿入部130は、オーバーフローすると判定されたインデックスブロックがルートブロックか否かを判定する(S50)。データ挿入部130は、当該インデックスブロックがルートブロックである場合(S50;YES)、新たなルートブロックとするための新たな空きブロックを取得する(S51)。このとき、アクセス管理部110は、取得された空きブロックのリードカウンタを1増加させる(S52)。
データ挿入部130は、オーバーフローすると判定された現在のルートブロック内の最小のキー値及び現在のルートブロックを特定するための識別子を含むインデックスエントリを生成する(S53)。データ挿入部130は、このように生成されたインデックスエントリを、新たなルートブロックとするために取得された空きブロックに書き込む(S54)。言い換えれば、生成されたインデックスエントリは、新たなルートブロックから元のルートブロック(その後のブランチブロック)へリンクするためのデータとなる。
このとき、アクセス管理部110は、そのインデックスエントリが書き込まれたインデックスブロックのライトカウンタを1増加させる(S55)。
続いて、データ挿入部130は、ルートブロックを変更する(S56)。具体的には、データ挿入部130は、オーバーフローすると判定された元のルートブロックから新たに取得されたブロックに、ルートブロックを変更する。例えば、この変更は、ブロックヘッダのブロック種の変更により実現される。
次に、データ挿入部130は、空きブロックを更に取得する(S57)。データ挿入部130は、そのオーバーフローすると判定されたインデックスブロック内の移動させるべきエントリを決定し、決定された各エントリを上記取得された空きブロックに順次移動させる(S58)。例えば、データ挿入部130は、予め閾値を保持しており、オーバーフローすると判定されたインデックスブロックのエントリのうち、当該閾値以上のキー値を持つエントリを移動エントリに決定する。その閾値には、中央値などのような、1つ以上のエントリのキー値よりも小さい値を用いる。
このとき、アクセス管理部110は、エントリを空きブロックに移すたびに、空きブロックのライトカウンタを1増加させる(S59)。
その後、データ挿入部130は、エントリの移動によりできた空き領域に処理(S33)で生成されたインデックスエントリを書き込む(S35)。以降、データ挿入部130及びアクセス管理部110は、上述した処理(S36)以降の各処理を実行する。
一方、データ挿入部130は、オーバーフローすると判定されたインデックスブロックがリーフブロック230である場合には(S40;YES)、更に、そのリーフブロック230が拡張されているか否かを確認する(S41)。具体的には、データ挿入部130は、そのリーフブロック230の拡張ポインタが有効であるか否かを拡張ブロック操作部150に判定させる(S41)。データ挿入部130は、そのリーフブロック230が拡張されている場合には(S41;YES)、更に、そのリーフブロック230が、処理(S33)で生成されたインデックスエントリを挿入したとしてもオーバーフローしない拡張ブロックを持つか否かを判定する(S42)。このとき、拡張ブロック操作部150は、そのリーフブロック230の拡張ポインタを参照することにより、リーフブロック230のための拡張ブロックを特定する。
データ挿入部130は、そのリーフブロック230がオーバーフローしない拡張ブロックを持つ場合には(S42;YES)、その拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S43)。一方、拡張ブロック操作部150は、そのリーフブロック230が拡張されているがオーバーフローしない拡張ブロックを持たない場合(S42;NO)、新たな拡張ブロックを取得し、その取得された拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S45)。このとき、拡張ブロック操作部150は、その取得された拡張ブロックを特定するためのポインタを拡張ポインタとしてそのリーフブロック230又は既に存在する拡張ポインタに設定する(S45)。
拡張ブロック操作部150は、そのリーフブロック230が拡張されていない場合(S41;NO)、そのリーフブロック230における全アクセスに対するライトアクセスの比率を算出する。拡張ブロック操作部150は、算出されたライトアクセスの比率が所定閾値を超えるか否かを判定する(S44)。
拡張ブロック操作部150は、ライトアクセスの比率が所定閾値を超えない場合(S44;NO)、データ挿入部130に、そのリーフブロック230に対して上述したようなブロック分割処理を実行させる。これにより、データ挿入部130は、上述した処理(S57)、(S58)及び(S59)を実行する。
一方、拡張ブロック操作部150は、ライトアクセスの比率が所定閾値を超える場合(S44;YES)、新たな拡張ブロックを取得し、その取得された拡張ブロックをインデックスエントリ挿入のための対象ブロックに設定する(S45)。このとき、拡張ブロック操作部150は、その取得された拡張ブロックを特定するためのポインタを拡張ポインタとしてそのリーフブロック230又は既に存在する拡張ポインタに設定する(S45)。
その後、データ挿入部130は、上述の処理(S43)又は(S45)でインデックスエントリ挿入のための対象ブロックに設定された拡張ブロックに、処理(S33)で生成されたインデックスエントリを書き込む(S35)。以降、データ挿入部130及びアクセス管理部110は、上述した処理(S36)以降の各処理を実行する。なお、当該拡張ブロックに新たなインデックスエントリが書き込まれた場合においても、データ挿入部130は、その拡張ブロックに対応するリーフブロック230のライトブロックを更新する。
図7は、第1実施形態におけるDBシステム10のデータ削除時の動作例を示すフローチャートである。
データ削除部140は、削除する行データを特定するための値を受け取り、データブロック240から行データを削除する(S61)。行データの削除は、行のデータを消去することで実現してもよいし、その行データに無効を示す値を付加することで実現してもよい。
データ削除部140は、削除された行データを特定するインデックスエントリを有するリーフブロック230を特定する(S62)。このリーフブロック230の特定は、削除された行データにおけるキーが設定された列の値を検索キーとしたインデックス検索によりリーフブロック230を特定する場合と同様の手法で実現される。図4の動作例によれば、(S10)、(S11)、(S12)、(S13)、(S14)及び(S15)の各処理が実行されることにより、当該リーフブロック230が特定される。
データ削除部140は、特定されたリーフブロック230における、削除された行データに対応するインデックスエントリを削除する(S63)。このとき、特定されたリーフブロック230が拡張されている場合には、データ検索時の処理と同様に、リーフブロック230及び拡張ブロック内の全エントリを対象にして、削除対象となるインデックスエントリが特定される。更に、このとき、アクセス管理部110は、そのインデックエントリが削除されたリーフブロック230のライトカウンタを増加させる(S64)。削除されたインデックスエントリが拡張ブロック内に存在していたとしても、その拡張ブロックに対応するリーフブロック230のライトカウンタが更新される。
データ削除部140は、エントリを削除したリーフブロック230又は拡張ブロックがアンダーフローするか否かを判定する(S65)。データ削除部140は、アンダーフローが起きていなければ(S65;NO)、処理を終了する。
拡張ブロック操作部150は、データ削除部140により、アンダーフローすると判定された場合には(S65;YES)、削除対象として特定されたリーフブロック230の拡張ポインタに無効値が設定されているか否かを判定する(S66)。データ削除部140は、拡張ポインタに無効値が設定されている場合には(S66;YES)、リーフブロック230に残るエントリを、他のリーフブロック230に移動させ、そのリーフブロック230を空きブロックにする(S67)。このとき、アクセス管理部110は、エントリを移動させた先のリーフブロック230のライトカウンタを1増加させる(S68)。
なお、移動先ブロックは、一つであってもよいし、複数あってもよく、任意の方法で選択すればよい。また、移動先のリーフブロック230が拡張されている場合には、その移動先のリーフブロック230のための拡張ブロックを移動先ブロックに選択してもよい。この場合においても、拡張ブロックは、リーフブロック230のインデックスエントリを格納する領域の一部として扱われるため、移動されたエントリの格納される領域が実際には拡張ブロック内であったとしても、そのエントリ移動処理は、通常のエントリ移動処理と同様の処理で実現可能である。
データ削除部140は、空きブロックとなったリーフブロック230のアクセスカウンタ(リードカウンタ及びライトカウンタ)を0に設定する。空きブロックとすることで、このブロックはデータ挿入部130又は拡張ブロック操作部150によって再利用される。また、空きブロック化されたリーフブロック230のアクセスカウンタは、それぞれ移動先のブロックのアクセスカウンタに合算されてもよい。
続いて、データ削除部140は、ブロック統合が可能か否か判定する(S69)。具体的には、データ削除部140は、空きブロック化されたリーフブロック230の親ブロック(ブランチブロック220)にぶら下がる全子ブロックの全エントリをその親ブロックに入れることができるか否かを判定する(S69)。
データ削除部140は、ブロック統合が不可能と判定すると(S69;NO)、処理を終了する。一方、データ削除部140は、ブロック統合が可能と判定すると(S69;YES)、それらブロックを統合する(S70)。つまり、子ブロックの全エントリを親ブロックに移しつつ、親ブロックに存在したエントリは削除する。結果、その親ブロックにぶら下がる全ての子ブロックが空きブロックとされる。
このとき、アクセス管理部110は、上位ブロックのライトカウンタを1増加させる(S71)。なお、統合される子ブロックのアクセスカウンタの値は、親ブロックのアクセスカウンタに合算されてもよい。
一方で、削除対象として特定されたリーフブロック230の拡張ポインタに有効値が設定されている場合には(S66;NO)、拡張ブロック操作部150が、移動対象のエントリ及び移動先を特定し、データ削除部140が当該移動対象のエントリを当該移動先のブロックに順次移動させる(S72)。これにより、アンダーフローしているリーフブロック230に関し、拡張ブロック間、又は、拡張ブロックとそのリーフブロック230との間で、エントリの移動が実行される。
このとき、拡張ブロック操作部150は、リーフブロック230自体がアンダーフローしている場合には、拡張ブロック内のインデックスエントリを移動対象に決定し、アンダーフローしているリーフブロック230を移動先に決定する。また、拡張ブロック操作部150は、拡張ブロックがアンダーフローしている場合には、その拡張ブロック内のエントリを移動対象に決定し、同一リーフブロック230のための他の拡張ブロックを移動先に決定する。
アクセス管理部110は、エントリの移動が行われる度に、対応するリーフブロック230のライトカウンタを増加させる(S73)。
〔第1実施形態の作用及び効果〕
このように第1実施形態では、各インデックスブロックには、リードカウンタとライトカウンタとがそれぞれ設けられ、データブロック240に対するデータ操作に応じて、検索部120、データ挿入部130及びデータ削除部140によりアクセスされたインデックスブロックのリードカウンタ及びライトカウンタがアクセス管理部110により更新される。このように、第1実施形態によれば、各インデックスブロックへのアクセス回数が、リードアクセスとライトアクセスとで区別されそれぞれ管理される。
更に、第1実施形態では、データ挿入部130によりデータ挿入処理が実行される際に、拡張ブロック操作部150により、挿入対象のリーフブロック230における全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かが判定され、ライトアクセスの比率が所定閾値を超える場合に、そのリーフブロック230に拡張ブロックが追加される。この拡張ブロックは、インデックスブロックとは異なり、他のブロック内のインデックスエントリにより特定されず、リーフブロック230の拡張ポインタで特定される。
この拡張ブロックは、検索部120、データ挿入部130及びデータ削除部140によるインデックスエントリの操作において、この拡張ブロックを特定するための拡張ポインタが設定されたリーフブロック230のインデックスエントリを格納する領域の一部として扱われる。また、リーフブロック230がアンダーフローする場合には、そのリーフブロック230と拡張ブロックとの間、又は、拡張ブロック間でブロック統合が実施される。
このように、第1実施形態によれば、ライトアクセスの比率が大きいリーフブロック230がオーバーフローすると判定された場合には、そのリーフブロック230には、他のブロック内にそれを特定するためのインデックスエントリを設定しなくてもよい拡張ブロックが追加され、リーフブロック230のインデックスエントリを格納するための領域が拡張される。
従って、第1実施形態によれば、他のブロックのエントリに影響を与えない拡張ブロックを用いることにより、データ挿入速度を向上させることができる。ところが、拡張ブロックを用いた場合、検索対象となるエントリが増加することになるため、拡張ブロックにより拡張されたリーフブロック230に対する検索速度は低下することになる。そこで、第1実施形態では、ライトアクセスが集中するブロックのみを対象に拡張ブロックを付加することにより、システム全体のパフォーマンスを最適化することができる。なお、上述したright−growing indexは、インデックスブロック間でライトアクセスの比率に差が生じる典型例である。
[第2実施形態]
以下、第2実施形態におけるDBシステム10について説明する。第2実施形態は、上述の第1実施形態の構成に加えて、上記拡張ブロックを、リードアクセスの比率に応じて、リーフブロック230となるように設定する構成を更に有する。第2実施形態では、DBシステム10の構成は上述の第1実施形態と同様であるが、各処理部の処理が第1実施形態と異なる。以下、第2実施形態におけるDBシステム10について、第1実施形態と異なる内容を中心に説明し、第1実施形態と同一の内容についての説明は適宜省略する。
拡張ブロック操作部150は、拡張ブロックを持つリーフブロック230に関し、全アクセスに対するリードアクセスの比率が所定閾値を超えるか否かを判定し、リードアクセスの比率が所定閾値を超える場合に、当該拡張ブロックをリーフブロック230となるように設定する。具体的には、拡張ブロック操作部150は、リードカウンタの値(R)を、リードカウンタの値とライトカウンタの値との合計(R+W)で除算することにより当該リードアクセスの比率(R/(R+W))を算出する。なお、拡張ブロックをリーフブロック230となるように設定する処理の詳細については、動作例の項において説明する。
リードアクセスの比率と比較される所定閾値は、第1実施形態におけるライトアクセスの比率との比較で利用された所定閾値と共に、予め調整可能にメモリ2に格納される。リードアクセスの比率と比較される所定閾値についても、例えば、全インデックスブロックにおけるリードアクセスの全アクセスに対する比率のxパーセンタイル(xは例えば10)等が用いられる。なお、リードアクセスの比率と比較される所定閾値と、第1実施形態におけるライトアクセスの比率との比較で利用された所定閾値とは1つの値であってもよい。
〔動作例〕
図8は、第2実施形態におけるDBシステム10の動作例を示すフローチャートである。図8では、第1実施形態におけるDBシステム10のデータ検索時と同じ処理については図4と同じ符号が付されている。
第2実施形態におけるDBシステム10は、データ検索時において、第1実施形態と同様の処理(S10)から処理(S21)を実行する。インデックスエントリに含まれる識別子で特定される行データが検索部120により抽出されると(S21)、拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに有効値が設定されているか否か、かつ、リードアクセスの比率が所定閾値を超えているか否かを判定する(S81)。
拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに無効値が設定されている、又は、リードアクセスの全アクセスに対する比率が所定閾値以下である場合には(S81;NO)、処理を終了する。一方、拡張ブロック操作部150は、特定されたリーフブロック230の拡張ポインタに有効値が設定されており、かつ、リードアクセスの比率が所定閾値を超えている場合には(S81;YES)、そのリーフブロック230が有する拡張ブロックをインデックスブロックとなるように設定する(S82)。
処理(S82)において、拡張ブロック操作部150は、リーフブロック230内のその拡張ブロックを特定するための拡張ポインタに無効値を設定する。更に、拡張ブロック操作部150は、その拡張ブロックを図3に示される形態に設定する。例えば、拡張ブロック操作部150は、ブロックヘッダを、ブロック種がリーフブロック230を示すように設定し、ブロックヘッダにリードカウンタ及びライトカウンタを設ける。なお、拡張ブロックにも、予め、リーフブロック230と同様のブロックヘッダが設けられていてもよい。この場合には、拡張ブロックのブロックヘッダは、拡張ポインタ以外利用されなければよい。
拡張ブロック操作部150は、更に、リーフブロック230及びそのリーフブロック230の拡張に利用される拡張ブロックに格納される全エントリをキー値を用いてソートし、最も小さいキー値を持つエントリから所定数のエントリをリーフブロック230に格納し、それ以降のエントリを拡張ブロックに格納する。上記所定数は、例えば、全エントリの数を、リーフブロック230及び拡張ブロックの数で割った値に設定される。
拡張ブロック操作部150は、上述のようなエントリのソートをした後、データ挿入部130に、その拡張ブロックを特定するための識別子を含むインデックスエントリをブランチブロック220に追加するように指示する。これにより、データ挿入部130は、その拡張ブロックを対象にして、ブロック分割により生じた新たなブロックを挿入する処理と同様の処理を実行する。具体的には、データ挿入部130は、図6に示される処理(S38)以降の処理を実行する。
リーフブロック230が複数の拡張ブロックにより拡張されている場合には、上述のような処理(S82)は、それら全ての拡張ブロックを対象に実行される。
また、上述のような拡張ブロックをインデックスブロックとなるように設定する処理(S81)及び(S82)は、図8のフローチャートで示される処理の順番に限定されない。例えば、検索部120により処理(S21)が実行されるのと並行して、処理(S81)及び(S82)が実行されてもよい。更に、当該処理(S81)及び(S82)は、データ検索処理とは無関係に、任意のタイミング(例えば、周期的)で、全リーフブロック230を対象に実行されてもよい。
〔第2実施形態における作用及び効果〕
このように第2実施形態では、データ挿入速度を向上させるために追加された拡張ブロックが、リードアクセスの比率が所定閾値を超える場合に、リーフブロック230となるように設定される。即ち、第2実施形態では、ライトアクセスの比率が大きいリーフブロック230には拡張ブロックが付加され、そのリーフブロック230のリードアクセスの比率が大きくなると、その拡張ブロックがリーフブロック230となるように設定される。
リーフブロック230及びブランチブロック220には近い値を持つキーが格納されるため、特定の範囲のキーが頻繁に挿入される場合、対応するブロックにはライトアクセスが集中する。一方、特定の範囲のキーが頻繁に検索されれば、対応するブロックにはリードアクセスが集中する。したがって、インデックスを張ることで検索速度を向上させるべきブロックとインデックスを張らずに挿入速度を向上させるべきブロックが存在し得る。
第2実施形態によれば、アクセス比率に応じてインデックスを張るブロックとインデックスを張らないブロック(拡張ブロック)とを決めているため、ライトアクセスが多いブロックとリードアクセスが多いブロックが混在していても、効率的にデータを処理することができる。言い換えれば、キーの値の範囲によってリードとライトのアクセス比率が異なる場合でも、高い処理性能が実現され得る。更に、第2実施形態によれば、アクセス比率の変化に動的に追随できるために、ワークロードが変化しても十分な性能を達成することができる。
上述のような第1実施形態及び第2実施形態における作用効果を具体例に基づいて以下に説明する。例えば、データブロック240が売上明細表を格納し、その売上明細表の中の商品番号がキー値に設定され、その売上明細表に対して、売上明細の挿入及び検索(集計)の各処理が発生する例を想定する。また、この例において、各リーフブロック230に5パーセント(%)から15%の比率でライトアクセスがそれぞれ発生し、リーフブロック230を拡張するか否かの判断に用いられる所定閾値が25%に設定されていると仮定する。
この例において、商品番号「1300」の商品の特売がされた場合、この特売商品の売り上げが増加すれば、例えば、商品番号「1000」から商品番号「1999」までの商品の売り上げを記録しているリーフブロック230へのライトアクセス(行の挿入操作)が増加する。このとき、定常的なリードアクセスに大きな変化はなく、ライトアクセスの比率が30%まで増加した場合、上記リーフブロック230には拡張ブロックが付加される。
本実施形態によれば、このような一時的かつ部分的なライトアクセスの増加に対して、自動的に、ライトアクセスに対する処理の高速化とリードアクセスに対する処理の低速化とが実現される。そして、本実施形態によれば、増加したライトアクセスに対する処理が高速化された結果、システム全体としての性能が向上する。逆に、特売が終了することにより、ライトアクセスの比率が下がれば、拡張ブロックは、通常のリーフブロック230となるように設定されるため、インデックスが付与されることにより、リードアクセスに対する処理の高速化が実現される。
また、本実施形態は、right−growing indexの問題にも有効である。例えば、データブロック240に格納されるデータ表が現在時刻を示す列を持ち、この現在時刻の列がキーに設定される場合、最も新しい時刻を示す一番右側のリーフブロック230にライトアクセスが集中する。本実施形態では、このリーフブロック230に拡張ブロックが付与されるため、現在時刻を更新するためのライトアクセスに対する処理を高速化することができる。
一方で、このリーフブロック230と拡張ブロックとを1回検索するのに発生するリードアクセスの数は、拡張ブロックの増加に伴って増加する。例えば、或るリーフブロック230に9つの拡張ブロックが付加されていたとすると、1回の検索で、10回のリードアクセスが発生する。これに対して、1行を挿入するのに発生するライトアクセスは基本的には1回であるため、ライトアクセスの比率は下がる傾向にある。当該比率が或る程度まで下がると、拡張ブロックはリーフブロック230となるように設定される。その結果、一番右側には新たなリーフブロック230が追加され、より最近の時刻を示すキーが挿入される。一般に、ブロックの挿入は、1つずつよりもまとめた方が効率的に処理できることを注記する。
[変形例]
上述の第1実施形態では、リーフブロック230を拡張するか否かの判断は、そのリーフブロック230における全アクセスに対するライトアクセスの比率と所定閾値との比較結果に基づいて実施されたが、単に、ライトカウンタがリードカウンタより多い場合に、リーフブロック230を拡張すると判断するようにしてもよい。また、リードカウンタに対するライトカウンタの比率と所定閾値との比較により、リーフブロック230を拡張するか否かの判断が実施されてもよい。
また、上述の第2実施形態では、拡張ブロックをリーフブロック230となるように設定するか否かの判断は、そのリーフブロック230における全アクセスに対するリードアクセスの比率と所定閾値との比較結果に基づいて実施されたが、単に、リードカウンタがライトカウンタより多い場合に、拡張ブロックをリーフブロック230となるように設定すると判断するようにしてもよい。また、ライトカウンタに対するリードカウンタの比率と所定閾値との比較により、拡張ブロックをリーフブロック230となるように設定するか否かの判断が実施されてもよい。
また、上述の各実施形態では、リーフブロック230及び各拡張ブロックには1つの拡張ポインタがそれぞれ設けられたが、拡張ブロックには拡張ポインタを設けず、リーフブロック230に複数の拡張ポインタを設けるようにしてもよい。
また、上述の各実施形態では、アクセスカウンタ(リードカウンタ及びライトカウンタを含む)は1ずつ増やされたが、この増加幅は、アクセス種別等に応じて適宜変えてもよい。
なお、上記各実施形態の説明は、複数のフローチャートを用いており、それぞれに複数のステップ(処理)を順番に記載しているが、本実施形態は、各ステップの順番を図示される順番に限定するものではない。本実施形態では、図示される処理ステップの順番を内容的に支障しない範囲で変更することができる。また、上述した各実施形態及び変形例は、その内容が相反しない範囲で組み合わせることができる。
この出願は、2011年2月22日に出願された日本出願特願2011−035437を基礎とする優先権を主張し、その開示の全てをここに取り込む。

Claims (9)

  1. 表データを格納するデータブロックを含むデータベースを管理するデータベース管理装置において、
    前記表データを構成する1つの行データ又は他のインデックスブロックを特定するための少なくとも1つのインデックスエントリと、リードカウンタ及びライトカウンタを含むアクセスカウンタとをそれぞれ有し、ツリー構造を持つ複数のインデックスブロックと、
    前記表データに対するデータ操作に応じて前記ツリー構造に沿ってアクセスされたインデックスブロックに関し、インデックスブロックへのリードアクセスに応じてリードカウンタを更新し、インデックスブロックへの更新アクセスに応じてライトカウンタを更新するアクセス管理手段と、
    前記データブロックに挿入される新たな行データを特定するための新たなインデックスエントリを前記複数のインデックスブロックのうちの挿入対象のリーフブロックに挿入するデータ挿入手段と、
    前記挿入対象のリーフブロックにおける前記リードカウンタと前記ライトカウンタとの比較結果に基づいて、前記新たなインデックスエントリの格納先として、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得し、当該拡張ブロックを特定するための特定情報を前記挿入対象のリーフブロックに設定する拡張ブロック操作手段と、
    を備えることを特徴とするデータベース管理装置。
  2. 前記拡張ブロック操作手段は、前記挿入対象のリーフブロックにおける前記ライトカウンタと前記リードカウンタとの比較結果に基づいて、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定することを特徴とする請求項1に記載のデータベース管理装置。
  3. 前記拡張ブロック操作手段は、前記リードカウンタ及び前記ライトカウンタに基づいて、前記挿入対象のリーフブロックにおける全アクセスに対するライトアクセスの比率が所定閾値を超えるか否かを判定し、前記ライトアクセスの比率が所定閾値を超える場合に、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得する、
    ことを特徴とする請求項1又は2に記載のデータベース管理装置。
  4. 前記拡張ブロック操作手段は、前記リードカウンタ及び前記ライトカウンタに基づいて、前記挿入対象のリーフブロックにおける全アクセスに対するリードアクセスの比率が所定閾値を超えるか否かを判定し、前記リードアクセスの比率が所定閾値を超える場合に、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定する、
    ことを特徴とする請求項2又は3に記載のデータベース管理装置。
  5. 前記アクセス管理手段は、前記拡張ブロックに格納されたインデックスエントリに対してアクセスされた場合には、当該拡張ブロックを特定するための特定情報が設定されたリーフブロックのアクセスカウンタを更新する、
    ことを特徴とする請求項1から4のいずれか1項に記載のデータベース管理装置。
  6. 表データを格納するデータブロックを含むデータベースを管理するプログラムにおいて、
    コンピュータに、
    前記表データを構成する1つの行データ又は他のインデックスブロックを特定するための少なくとも1つのインデックスエントリと、リードカウンタ及びライトカウンタを含むアクセスカウンタとをそれぞれ有し、ツリー構造を持つ複数のインデックスブロックと、
    前記表データに対するデータ操作に応じて前記ツリー構造に沿ってアクセスされたインデックスブロックに関し、インデックスブロックへのリードアクセスに応じてリードカウンタを更新し、インデックスブロックへの更新アクセスに応じてライトカウンタを更新するアクセス管理手段と、
    前記データブロックに挿入される新たな行データを特定するための新たなインデックスエントリを前記複数のインデックスブロックのうちの挿入対象のリーフブロックに挿入するデータ挿入手段と、
    前記挿入対象のリーフブロックにおける前記リードカウンタと前記ライトカウンタとの比較結果に基づいて、前記新たなインデックスエントリの格納先として、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得し、当該拡張ブロックを特定するための特定情報を前記挿入対象のリーフブロックに設定する拡張ブロック操作手段と、
    を実現させることを特徴とするプログラム。
  7. 前記拡張ブロック操作手段は、前記挿入対象のリーフブロックにおける前記ライトカウンタと前記リードカウンタとの比較結果に基づいて、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定することを特徴とする請求項6に記載のプログラム。
  8. 表データを格納するデータブロックを含むデータベースを管理するデータベース管理方法において、
    前記表データを構成する1つの行データ又は他のインデックスブロックを特定するための少なくとも1つのインデックスエントリと、リードカウンタ及びライトカウンタを含むアクセスカウンタとをそれぞれ有し、ツリー構造を持つ複数のインデックスブロックを格納するコンピュータが、
    前記表データに対するデータ操作に応じて前記ツリー構造に沿ってアクセスされたインデックスブロックに関し、インデックスブロックへのリードアクセスに応じてリードカウンタを更新し、インデックスブロックへの更新アクセスに応じてライトカウンタを更新し、
    前記データブロックに挿入される新たな行データを特定するための新たなインデックスエントリを前記複数のインデックスブロックのうちの挿入対象のリーフブロックに挿入し、
    前記挿入対象のリーフブロックにおける前記リードカウンタと前記ライトカウンタとの比較結果に基づいて、前記新たなインデックスエントリの格納先として、他のインデックスブロックのインデックスエントリにより特定されない拡張ブロックを取得し、
    前記拡張ブロックを特定するための特定情報を前記挿入対象のリーフブロックに設定する、
    ことを特徴とするデータベース管理方法。
  9. 前記コンピュータが、更に、
    前記挿入対象のリーフブロックにおける前記ライトカウンタと前記リードカウンタとの比較結果に基づいて、前記拡張ブロックを他のインデックスブロックのインデックスエントリにより特定されるリーフブロックとなるように設定する、
    ことを特徴とする請求項8に記載のデータベース管理方法。
JP2013500713A 2011-02-22 2011-11-07 データベース管理装置及びデータベース管理方法 Active JP5790755B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013500713A JP5790755B2 (ja) 2011-02-22 2011-11-07 データベース管理装置及びデータベース管理方法

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2011035437 2011-02-22
JP2011035437 2011-02-22
PCT/JP2011/006220 WO2012114402A1 (ja) 2011-02-22 2011-11-07 データベース管理装置及びデータベース管理方法
JP2013500713A JP5790755B2 (ja) 2011-02-22 2011-11-07 データベース管理装置及びデータベース管理方法

Publications (2)

Publication Number Publication Date
JPWO2012114402A1 JPWO2012114402A1 (ja) 2014-07-07
JP5790755B2 true JP5790755B2 (ja) 2015-10-07

Family

ID=46720224

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013500713A Active JP5790755B2 (ja) 2011-02-22 2011-11-07 データベース管理装置及びデータベース管理方法

Country Status (3)

Country Link
US (1) US9275091B2 (ja)
JP (1) JP5790755B2 (ja)
WO (1) WO2012114402A1 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9578120B1 (en) * 2013-12-20 2017-02-21 Amazon Technologies, Inc. Messaging with key-value persistence
US9372879B1 (en) * 2013-12-20 2016-06-21 Amazon Technologies, Inc. Balanced append tree data structure
US9507815B2 (en) * 2014-07-07 2016-11-29 Sap Se Column store optimization using simplex store
US10013440B1 (en) * 2014-10-31 2018-07-03 Amazon Technologies, Inc. Incremental out-of-place updates for index structures
US9916359B2 (en) * 2015-06-01 2018-03-13 Sap Se Indexing dynamic hierarchical data

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2615046B2 (ja) 1987-05-08 1997-05-28 富士通株式会社 レコード追加処理方法
JP2708657B2 (ja) 1992-02-18 1998-02-04 富士通株式会社 スプリット制御方法
JPH05334153A (ja) 1992-06-01 1993-12-17 Nippon Telegr & Teleph Corp <Ntt> インデックス管理方式
JPH07200376A (ja) 1993-12-28 1995-08-04 Fuji Xerox Co Ltd データベース管理装置
JP2003345832A (ja) * 2002-05-23 2003-12-05 Nec Corp データ検索方法、データ検索装置及びデータ検索プログラム
US7634498B2 (en) * 2003-10-24 2009-12-15 Microsoft Corporation Indexing XML datatype content system and method
US7792839B2 (en) * 2005-01-13 2010-09-07 International Business Machines Corporation Incremental indexing of a database table in a database
JP4683546B2 (ja) * 2005-07-15 2011-05-18 国立大学法人 東京大学 データベースの再編成方法及びデータベース再編成システム
US20070162421A1 (en) * 2006-01-12 2007-07-12 Sybase, Inc. Real-Time Messaging System for Bridging RDBMSs and Message Buses
JP4412291B2 (ja) * 2006-01-30 2010-02-10 睦 藤原 記憶装置
US9141435B2 (en) * 2007-07-30 2015-09-22 Sybase, Inc. System and methodology providing workload management in database cluster
US7836037B2 (en) * 2007-10-04 2010-11-16 Sap Ag Selection of rows and values from indexes with updates
US8620884B2 (en) * 2008-10-24 2013-12-31 Microsoft Corporation Scalable blob storage integrated with scalable structured storage
US20100257181A1 (en) * 2009-04-01 2010-10-07 Sybase, Inc. Dynamic Hash Table for Efficient Data Access In A Relational Database System
US8140495B2 (en) * 2009-05-04 2012-03-20 Microsoft Corporation Asynchronous database index maintenance
US8484210B2 (en) * 2009-06-19 2013-07-09 Sybase, Inc. Representing markup language document data in a searchable format in a database system
US20110131200A1 (en) * 2009-12-01 2011-06-02 Sybase, Inc. Complex path-based query execution

Also Published As

Publication number Publication date
WO2012114402A1 (ja) 2012-08-30
US9275091B2 (en) 2016-03-01
US20130332465A1 (en) 2013-12-12
JPWO2012114402A1 (ja) 2014-07-07

Similar Documents

Publication Publication Date Title
KR102564170B1 (ko) 데이터 객체 저장 방법, 장치, 및 이를 이용한 컴퓨터 프로그램이 저장되는 컴퓨터 판독가능한 저장 매체
US20190278783A1 (en) Compaction policy
US9189506B2 (en) Database index management
US9262458B2 (en) Method and system for dynamically partitioning very large database indices on write-once tables
US9047330B2 (en) Index compression in databases
US7162693B2 (en) Process for managing data in which existing data item is moved to neighbor page before insertion or after deletion of another data item
US8719237B2 (en) Method and apparatus for deleting duplicate data
JP5088668B2 (ja) 計算機負荷見積システム、計算機負荷見積方法、計算機負荷見積プログラム
TW201841123A (zh) 用於維護操作之合併樹修改
TW201837720A (zh) 用於多串流儲存裝置之串流選擇
JP5790755B2 (ja) データベース管理装置及びデータベース管理方法
CN105989015B (zh) 一种数据库扩容方法和装置以及访问数据库的方法和装置
US20170270183A1 (en) Sensor data management apparatus, sensor data management method, and computer program product
CN113867627B (zh) 一种存储***性能优化方法及***
WO2012081165A1 (ja) データベース管理装置及びデータベース管理方法
US20180011897A1 (en) Data processing method having structure of cache index specified to transaction in mobile environment dbms
JP6006740B2 (ja) インデックス管理装置
KR100859710B1 (ko) 데이터에 대한 검색을 수행하기 위한 자료구조를 이용하여 데이터를 검색, 저장, 삭제하는 방법
JP5774213B2 (ja) 累積移動平均に基づく多重検索ツリーのノードを分割する方法および装置
JP2008065716A (ja) データ管理装置、データ管理方法及びデータ管理プログラム
JP2010191903A (ja) 分散ファイルシステムのストライピング種別選択方法及びその分散ファイルシステム
KR102404174B1 (ko) 비관계형 데이터베이스 관리 시스템의 메모리 자료구조, 노드를 삽입하는 방법 및 범위 질의를 처리하는 방법
WO2021224960A1 (ja) 保存装置、保存方法、およびプログラム
KR100899817B1 (ko) 데이터에 대한 검색을 수행하는 자료구조를 기록한컴퓨터로 읽을 수 있는 기록매체
CN116774937A (zh) 数据存储方法、装置、处理设备、存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20141007

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20150707

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20150720

R150 Certificate of patent or registration of utility model

Ref document number: 5790755

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150