JP5967628B2 - クエリを処理する装置及び方法 - Google Patents

クエリを処理する装置及び方法 Download PDF

Info

Publication number
JP5967628B2
JP5967628B2 JP2014224424A JP2014224424A JP5967628B2 JP 5967628 B2 JP5967628 B2 JP 5967628B2 JP 2014224424 A JP2014224424 A JP 2014224424A JP 2014224424 A JP2014224424 A JP 2014224424A JP 5967628 B2 JP5967628 B2 JP 5967628B2
Authority
JP
Japan
Prior art keywords
query
data element
transaction
stored
execution unit
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.)
Expired - Fee Related
Application number
JP2014224424A
Other languages
English (en)
Other versions
JP2016091264A (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.)
International Business Machines Corp
Original Assignee
International Business Machines 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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2014224424A priority Critical patent/JP5967628B2/ja
Priority to US14/931,760 priority patent/US10120894B2/en
Publication of JP2016091264A publication Critical patent/JP2016091264A/ja
Application granted granted Critical
Publication of JP5967628B2 publication Critical patent/JP5967628B2/ja
Priority to US15/377,546 priority patent/US10002158B2/en
Expired - Fee Related 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/23Updating
    • G06F16/2365Ensuring data consistency and integrity
    • 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/23Updating
    • G06F16/2379Updates performed during online database operations; commit processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/903Querying
    • G06F16/90335Query processing

Landscapes

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

Description

本発明は、クエリを処理する装置及び方法に関する。特に、本発明は、NoSQL型のデータベース(NoSQLデータベース)に対するクエリを処理する装置及び方法に関する。
トランザクションをサポートしないNoSQLデータベース上でトランザクション機能を実現する技術は知られている(例えば、非特許文献1、2参照)。
非特許文献1は、大きいデータセットの逐次的更新処理のためのシステムであるPercolatorを開示する。
非特許文献2は、“value”フィールドを含むモデルに対して、トランザクション中に変更されたオブジェクトのバージョンを表す“updated”フィールドを追加することを開示する。
尚、トランザクションの状態を管理する技術は、公報記載の技術としても知られている(例えば、特許文献1〜4参照)。
特許文献1は、データベースの更新要求に応答して、更新データにトランザクション毎に異なるコミット情報を付加して記憶し、コミット要求に応答して、コミット対象の更新データからコミット情報を除去し、利用者からの表示要求に応答して、コミットしたデータを検索し、コミット前のデータで、かつ自トランザクションで更新データを検索し、コミット前のデータで、かつ他のトランザクションでの更新データを検索し、これらの検索結果を表示方法を変えて表示装置に出力する技術を開示する。
特許文献2は、データの変更操作の処理は高速な挿入向けデータ保持手段及び削除向けデータ保持手段をそれぞれ複数備え、データ保持部管理手段は、それぞれの挿入向けデータ保持手段又は削除向けデータ保持手段について、対応するトランザクションの識別子とともに、未使用,使用中,コミット済み,転送中の別を保持する技術を開示する。
特許文献3は、キーをグローバル・トランザクションID、バリューを{トランザクションの状態,終了待ちグローバル・トランザクションID}とする、管理用マップを用意し、グローバル・トランザクションの開始処理では、管理用マップのキーを管理するサーバ上で、管理用ローカル・トランザクションを開始し、グローバル・トランザクションの終了を待機する処理では、管理用マップのキーを管理するサーバ上で、ロック開放待ち用ローカル・トランザクションを開始し、競合するトランザクションの終了を待機する技術を開示する。
特許文献4は、第1の記憶部は、トランザクションによる更新処理のログを記憶し、第2の記憶部は、更新部によりデータが更新された場合に、データの更新がなされたことを示す更新情報をトランザクションIDに対応付けて記憶し、復元部は、検索部により検索された際に、検索対象となるデータの更新情報が、第2の記憶部に存在するか否かを判定し、判定が真の場合に、データを更新したトランザクションを第1の記憶部から読み出し、データの復元処理を行う技術を開示する。
特開平5−289921号公報 特開2009−26334号公報 特開2013−33345号公報 WO2011/099082号公報
Large-scale Incremental Processing Using Distributed Transactions and Notifications、[online]、[平成26年9月10日検索]、インターネット<URL:http://research.***.com/pubs/pub36726.html> MongoDB transaction example、[online]、[平成26年9月1日検索]、インターネット<URL:https://github.com/rystsov/mongodb-transaction-example>
このように、NoSQLデータベース上でトランザクション機能を実現することは公知であった。しかしながら、非特許文献1の技術は、主キーに対応した値を返す機能を提供するが、条件に合致した値を返すといった複雑なクエリをサポートしていない。また、非特許文献2の技術を普通に用いた場合には、“value”フィールドのみを対象にクエリを実行することになるだけであり、最新のデータを抽出することはできないという問題があった。
尚、特許文献1〜4の技術は、このような問題に対する解決手段を提示するものではない。
本発明の目的は、NoSQLデータベース上でトランザクション機能を実現し、かつ、最新のデータをクエリで抽出することにある。
かかる目的のもと、本発明は、NoSQL型のデータベースに対するクエリを処理する装置であって、データベースにおけるコミットされて保存された複数の保存データ要素と、複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部と、複数の未保存データ要素に対して、クエリを実行する第1のクエリ実行部と、第1のクエリ実行部によりクエリが実行された後に、複数の保存データ要素に対して、クエリを実行する第2のクエリ実行部と、第2のクエリ実行部によりクエリが実行された後に、第2のクエリ実行部によるクエリの実行中に保存された少なくとも1つの保存データ要素に対して、クエリを実行する第3のクエリ実行部とを含む、装置を提供する。
ここで、第1のクエリ実行部は、複数の未保存データ要素のうちのクエリにより抽出された特定の未保存データ要素をクエリの結果に含めるかどうかを、特定の未保存データ要素による更新に関するトランザクションの状態に基づいて判定する、ものであってよい。その場合、第1のクエリ実行部は、トランザクションがクエリを実行している場合は、特定の未保存データ要素をクエリの結果に含め、トランザクションがクエリを実行しておらず、トランザクションの状態がコミット済みである場合は、特定の未保存データ要素で、複数の保存データ要素のうちの特定の未保存データ要素による更新の対象である保存データ要素を置き換える、ものであってよい。
また、第2のクエリ実行部は、複数の保存データ要素のうちのクエリにより抽出された特定の保存データ要素をクエリの結果に含めるかどうかを、特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、ものであってもよい。その場合、第2のクエリ実行部は、特定の保存データ要素の更新のための未保存データ要素が記憶されていない場合、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態がアボートである場合、及び、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態が実行中であり、トランザクションがクエリを実行していない場合は、特定の保存データ要素をクエリの結果に含め、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態がコミット済みである場合は、特定の未保存データ要素で特定の保存データ要素を置き換える、ものであってよい。
更に、第3のクエリ実行部は、少なくとも1つの保存データ要素のうちのクエリにより抽出された特定の保存データ要素をクエリの結果に含めるかどうかを、特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、ものであってよい。その場合、第3のクエリ実行部は、特定の保存データ要素の更新のための未保存データ要素が記憶されていない場合、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態がアボートである場合、及び、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態が実行中である場合は、特定の保存データ要素をクエリの結果に含め、特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、トランザクションの状態がコミット済みである場合は、特定の未保存データ要素で特定の保存データ要素を置き換えた後、第3のクエリ実行部の処理を再実行する、ものであってよい。
更にまた、記憶部は、複数の未保存データ要素の各未保存データ要素に関連付けて、各未保存データ要素による更新を実行したトランザクションを識別するトランザクションIDを記憶する、ものであってよい。その場合、記憶部は、複数の保存データ要素の各保存データ要素、各未保存データ要素、及びトランザクションIDを1つのエントリとして記憶する、ものであってよい。また、記憶部は、トランザクションの状態を示すトランザクション状態情報をトランザクションIDに関連付けて記憶する、ものであってよい。第1のクエリ実行部、第2のクエリ実行部、及び第3のクエリ実行部は、それぞれ、クエリにより抽出されたデータ要素を含むエントリ中のトランザクションIDによりトランザクション状態情報を参照しながら処理を実行する、ものであってよい。第2のクエリ実行部は、クエリにより抽出された保存データ要素にエントリ中で付随する未保存データ要素がコミット済みのトランザクションにより更新されていた場合は、未保存データ要素で保存データ要素を置き換えて、エントリに関連するキーを保存し、第3のクエリ実行部は、キーを用いてクエリを実行する、ものであってよい。
また、本発明は、NoSQL型のデータベースに対するクエリを処理する装置であって、データベースにおけるコミットされて保存された複数の保存データ要素と、複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素と、複数の保存データ要素の複数の未保存データ要素による更新に関する複数のトランザクションを識別する複数の識別情報とを対応付けて記憶する記憶部と、複数の未保存データ要素に対して、クエリを実行し、複数の未保存データ要素のうちのクエリにより抽出された特定の未保存データ要素を、複数の識別情報のうちの特定の未保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、クエリの結果に含める第1のクエリ実行部と、第1のクエリ実行部によりクエリが実行された後に、複数の保存データ要素に対して、クエリを実行し、複数の保存データ要素のうちのクエリにより抽出された特定の保存データ要素を、複数の識別情報のうちの特定の保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、クエリの結果に含める第2のクエリ実行部と、第2のクエリ実行部によりクエリが実行された後に、第2のクエリ実行部によるクエリの実行中に保存された少なくとも1つの保存データ要素に対して、クエリを実行し、少なくとも1つの保存データ要素のうちのクエリにより抽出された特定の保存データ要素を、複数の識別情報のうちの特定の保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、クエリの結果に含める第3のクエリ実行部とを含む、装置も提供する。
更に、本発明は、NoSQL型のデータベースに対するクエリを処理する方法であって、データベースにおけるコミットされて保存された複数の保存データ要素と、複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部を含み、複数の未保存データ要素に対して、クエリを実行する第1のステップと、第1のステップでクエリが実行された後に、複数の保存データ要素に対して、クエリを実行する第2のステップと、第2のステップでクエリが実行された後に、第2のステップでのクエリの実行中に保存された少なくとも1つの保存データ要素に対して、クエリを実行する第3のステップとを含む、方法も提供する。
更にまた、本発明は、NoSQL型のデータベースに対するクエリを処理する装置として、コンピュータを機能させるプログラムであって、コンピュータを、データベースにおけるコミットされて保存された複数の保存データ要素と、複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部と、複数の未保存データ要素に対して、クエリを実行する第1のクエリ実行部と、第1のクエリ実行部によりクエリが実行された後に、複数の保存データ要素に対して、クエリを実行する第2のクエリ実行部と、第2のクエリ実行部によりクエリが実行された後に、第2のクエリ実行部によるクエリの実行中に保存された少なくとも1つの保存データ要素に対して、クエリを実行する第3のクエリ実行部として機能させる、プログラムも提供する。
本発明によれば、NoSQLデータベース上でトランザクション機能を実現し、かつ、最新のデータをクエリで抽出することができる。
(a)〜(f)は、コミット済みデータのみに対してクエリを実行したときの様子を示した図である。 (a)〜(f)は、インフライトデータに対してクエリを実行する第1フェーズにおける処理の様子を示した図である。 (a)〜(f)は、コミット済みデータに対してクエリを実行する第2フェーズにおける処理の様子を示した図である。 (a)〜(f)は、第2フェーズで保存されたキーに対応するコミット済みデータに対して再度第2フェーズと同じクエリを実行する第3フェーズにおける処理の様子を示した図である。 本発明の実施の形態におけるデータベース装置の機能構成例を示した図である。 本実施の形態におけるクエリ処理部の第1フェーズの動作例を示したフローチャートである。 本実施の形態におけるクエリ処理部の第2フェーズの動作例を示したフローチャートである。 本実施の形態におけるクエリ処理部の第3フェーズの動作例を示したフローチャートである。 本発明の実施の形態におけるデータベース装置のハードウェア構成例を示した図である。
以下、添付図面を参照して、本発明の実施の形態について詳細に説明する。
[本実施の形態の背景]
1つのエントリに対する原子的な更新のみを保障するNoSQLデータベースにおいても、複数のエントリに対する原子的な更新を行うトランザクションは実現可能である。「実行中」、「コミット済み」、「アボート」等のトランザクション状態と、コミットされていない又はコミットされているがコミット済みデータとして保存されていないデータ(以下、「インフライトデータ」という)とを、NoSQLデータベース内に保存することにより、既存のNoSQLデータベースを変更せずに、トランザクションは実現できる。
具体的には、以下のようなステップを実行すればよい。即ち、第1ステップは、トランザクションの開始時に、トランザクションを識別するトランザクションIDに対して、トランザクション状態「実行中」を保存するステップである。第2ステップは、トランザクションが更新で用いるデータを、インフライトデータとして、トランザクションIDと共にNoSQLデータベースに保存するステップである。第3ステップは、トランザクションのコミット時に、トランザクションIDに対するトランザクション状態を「コミット済み」で上書きするステップである。第4ステップは、インフライトデータをコミット済みデータとして保存するステップである。
このようなNoSQLデータベースに対してクエリを実行することで最新のデータを抽出することを考える。但し、クエリは、以下のようなものとする。即ち、第一に、ジョイン処理をサポートしないものとする。つまり、複数のエントリの関連を指定するクエリは存在しない。また、第二に、キー以外も指定したクエリをサポートするものとする。つまり、KVS(Key-Value Store)以上のクエリが実行可能である。
例えば、MongoDBは、コミット済みデータのみを対象にクエリを実行する機能を提供する。しかしながら、上述したようにインフライトデータがNoSQLデータベースに保存された状態では、インフライトデータをトランザクション状態に応じて処理する必要がある。ところが、インフライトデータは、コミットされたとしても、クライアントの障害等により、コミット済みデータとして保存されない可能性がある。つまり、上記の第4ステップは実行されない場合がある。このような場合、インフライトデータについて、コミットされていないのか、コミットされたがコミット済みデータとして保存されていないのか、判断できない。従って、コミットされたがコミット済みデータとして保存されていないデータはクエリにより抽出できない。こうしたことから、インフライトデータがNoSQLデータベースに保存された状態では、MongoDBが提供するクエリ機能は利用できなくなってしまう。
図1(a)〜(f)は、コミット済みデータのみに対してクエリを実行したときの様子を示した図である。ここで、各エントリにおいて、「_id」はキーを表し、これに続く「value1」「value2」はコミット済みデータを表す。そして、これに続く「_dirty」の後において、「value1」「value2」はインフライトデータを表し、「_txId」はトランザクションIDを表す。また、トランザクションID「Tx1」に対してトランザクション状態「実行中」が、トランザクションID「Tx2」に対してトランザクション状態「コミット済み」が、トランザクションID「Tx3」に対してトランザクション状態「アボート」が、それぞれ保持されているものとする。そして、図には、トランザクション「Tx」がクエリ{value1:{$gt:0}}を実行したときの様子を示す。
尚、本明細書において、クエリは、MongoDBクエリ言語の記法に従って記述する。即ち、{value1:{$gt:0}}は、コミット済みデータにおけるvalue1の値が「0」より大きいエントリ(太枠で囲んで示す)を抽出することを意味する。
図1(a)では、エントリ30aにトランザクションID「Tx1」が保持されており、このトランザクションIDに対してトランザクション状態「実行中」が保持されている。従って、最新のデータはコミット済みデータであり、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30aはクエリ結果に含まれるはずである。一方で、コミット済みデータのみに対してクエリを実行した場合も、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30aはクエリ結果に含まれる。従って、このエントリ30aについては、クエリ結果に問題は生じていない。
図1(b)では、エントリ30bにトランザクションID「Tx2」が保持されており、このトランザクションIDに対してトランザクション状態「コミット済み」が保持されている。従って、最新のデータはインフライトデータであり、インフライトデータにおけるvalue1の値「−5」は「0」より大きくないので、エントリ30bはクエリ結果に含まれないはずである。一方で、コミット済みデータのみに対してクエリを実行した場合は、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30bはクエリ結果に含まれる。従って、このエントリ30bについては、トランザクションがコミットしたはずのデータがクエリ結果に反映されないという問題が生じている。
図1(c)では、エントリ30cにトランザクションID「Tx2」が保持されており、このトランザクションIDに対してトランザクション状態「コミット済み」が保持されている。従って、最新のデータはインフライトデータであり、インフライトデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30cはクエリ結果に含まれるはずである。一方で、コミット済みデータのみに対してクエリを実行した場合は、コミット済みデータにおけるvalue1の値「−10」は「0」より大きくないので、エントリ30cはクエリ結果に含まれない。従って、このエントリ30cについては、トランザクションがコミットしたはずのデータがクエリ結果に反映されないという問題が生じている。
図1(d)では、エントリ30dにトランザクションID「Tx3」が保持されており、このトランザクションIDに対してトランザクション状態「アボート」が保持されている。従って、最新のデータはコミット済みデータであり、コミット済みデータにおけるvalue1の値「0」は「0」より大きくないので、エントリ30dはクエリ結果に含まれないはずである。一方で、コミット済みデータのみに対してクエリを実行した場合も、コミット済みデータにおけるvalue1の値「0」は「0」より大きくないので、エントリ30dはクエリ結果に含まれない。従って、このエントリ30dについては、クエリ結果に問題は生じていない。
図1(e)では、エントリ30eにトランザクションID「Tx」が保持されており、このトランザクションIDのトランザクションはクエリを実行しているトランザクションである。従って、最新のデータはインフライトデータであり、インフライトデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30eはクエリ結果に含まれるはずである。一方で、コミット済みデータのみに対してクエリを実行した場合は、コミット済みデータにおけるvalue1の値「0」は「0」より大きくないので、エントリ30eはクエリ結果に含まれない。従って、このエントリ30eについては、クエリを実行しているトランザクションが更新したデータがクエリ結果に反映されないという問題が生じている。
図1(f)では、エントリ30fにトランザクションID「Tx3」が保持されており、このトランザクションIDに対してトランザクション状態「アボート」が保持されている。従って、最新のデータはコミット済みデータであり、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30fはクエリ結果に含まれるはずである。一方で、コミット済みデータのみに対してクエリを実行した場合も、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ30fはクエリ結果に含まれる。従って、このエントリ30fについては、クエリ結果に問題は生じていない。
[本実施の形態の概要]
そこで、本実施の形態では、クエリを実行した時刻で最新のデータ、又は、その時刻以降に最新となったデータを、クエリ結果として返す。そのために、原子的な更新が可能なエントリごとにコミット済みデータ(Committed Data)とインフライトデータ(In-Flight Data)とを保持し、インフライトデータ、コミット済みデータ、クエリ実行中にコミットされ保存されたデータをこの順に対象としてクエリを実行する。以下、これらの各データを対象としたクエリの実行を、第1フェーズ、第2フェーズ、第3フェーズとし、図1(a)〜(f)と略同様の例を用いて説明する。
第1フェーズは、インフライトデータに対してクエリを実行するフェーズである。このフェーズでは、クエリ{value1:{$gt:0}}は、プレフィックス「_dirty」が付加されることにより、クエリ{_dirty.value1:{$gt:0}}に変換され、この変換後のクエリが実行される。
図2(a)〜(f)は、このときの処理の様子を示した図である。第1フェーズでは、まず、上記の変換後のクエリにより、インフライトデータにおけるvalue1の値が「0」より大きいエントリが抽出される。図では、ここで抽出されたエントリを太線で囲んで示している。
即ち、図2(a)のエントリ31aのインフライトデータにおけるvalue1の値「0」、図2(b)のエントリ31bのインフライトデータにおけるvalue1の値「−5」、及び、図2(f)のエントリ31fのインフライトデータにおけるvalue1の値「−10」は何れも「0」より大きくないので、エントリ31a,31b,31fは抽出されない。
一方、図2(c)のエントリ31cのインフライトデータにおけるvalue1の値「10」、図2(d)のエントリ31dのインフライトデータにおけるvalue1の値「10」、及び、図2(e)のエントリ31eのインフライトデータにおけるvalue1の値「10」は何れも「0」より大きいので、エントリ31c,31d,31eは抽出される。そして、この抽出されたエントリ31c,31d,31eに対して、トランザクション状態に応じた処理が行われる。
図2(e)では、エントリ31eにトランザクションID「Tx」が保持されており、このトランザクションIDのトランザクションはクエリを実行しているトランザクションである。従って、エントリ31eにおけるインフライトデータは、最新のデータであり、クエリ結果に追加される。
図2(c)では、エントリ31cにトランザクションID「Tx2」が保持されており、このトランザクションIDに対してトランザクション状態「コミット済み」が保持されている。従って、エントリ31cにおけるインフライトデータは、コミット済みデータに変換される。
図2(d)では、エントリ31dにトランザクションID「Tx3」が保持されており、このトランザクションIDに対してトランザクション状態「アボート」が保持されている。従って、エントリ31dにおけるインフライトデータは、最新のデータでなく、クエリ結果に追加されない。
第2フェーズは、コミット済みデータに対してクエリを実行するフェーズである。このフェーズでは、クエリ{value1:{$gt:0}}がそのまま実行される。
図3(a)〜(f)は、このときの処理の様子を示した図である。第2フェーズでは、まず、上記のクエリにより、コミット済みデータにおけるvalue1の値が「0」より大きいエントリが抽出される。図では、ここで抽出されたエントリを太線で囲んで示している。
即ち、図3(d)のエントリ32dのコミット済みデータにおけるvalue1の値「0」は「0」より大きくないので、エントリ32dは抽出されない。
一方、図3(a)のエントリ32aのコミット済みデータにおけるvalue1の値「10」、図3(b)のエントリ32bのコミット済みデータにおけるvalue1の値「30」、図3(e)のエントリ32eのコミット済みデータにおけるvalue1の値「5」、及び、図3(f)のエントリ32fのコミット済みデータにおけるvalue1の値「10」は何れも「0」より大きいので、エントリ32a,32b,32e,32fは抽出される。また、図3(c)のエントリ32cのコミット済みデータは、図2(c)のエントリ31cのインフライトデータで置き換えられており、コミット済みデータにおけるvalue1の値「10」は「0」より大きいので、エントリ32cも抽出される。そして、この抽出されたエントリ32a,32b,32c,32e,32fに対して、トランザクション状態に応じた処理が行われる。
図3(c)では、エントリ32cにインフライトデータが保持されていない。従って、エントリ32cにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
図3(e)では、エントリ32eにトランザクションID「Tx」が保持されており、このトランザクションIDのトランザクションはクエリを実行しているトランザクションである。従って、このトランザクションIDに対してトランザクション状態「実行中」が保持されているが、エントリ32eにおけるコミット済みデータは、最新のデータでなく、クエリ結果に追加されない。
図3(b)では、エントリ32bにトランザクションID「Tx2」が保持されており、このトランザクションIDに対してトランザクション状態「コミット済み」が保持されている。従って、エントリ32bにおけるインフライトデータは、コミット済みデータに変換され、エントリ32bのキーが保存される。
図3(f)では、エントリ32fにトランザクションID「Tx3」が保持されており、このトランザクションIDに対してトランザクション状態「アボート」が保持されている。従って、エントリ32fにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
図3(a)では、エントリ32aにトランザクションID「Tx1」が保持されており、このトランザクションIDに対してトランザクション状態「実行中」が保持されている。また、このトランザクションIDのトランザクションはクエリを実行しているトランザクションでない。従って、エントリ32aにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
第3フェーズは、第2フェーズで保存されたキーに対応するコミット済みデータに対して、再度第2フェーズと同じクエリを実行するフェーズである。このフェーズでは、クエリ{value1:{$gt:0}}は、もう1つの条件「_id:{$in,[k2]}」が追加されることより、クエリ{value1:{$gt:0},_id:{$in,[k2]}}に変換され、この変換後のクエリが実行される。尚、2つ目の条件「_id:{$in,[k2]}」は、「_id」の値が[]内に列挙された値に含まれるという条件を意味する。
図4(a)〜(f)は、このときの処理の様子を示した図である。第3フェーズでは、上記のクエリの2つ目の条件により、図4(b)のエントリ33bのみが対象となる。図では、このことを図4(a),(c)〜(f)のエントリを破線で囲むことにより示している。しかしながら、図4(b)のエントリ33bのコミット済みデータにおけるvalue1の値「−5」は「0」より大きくないので、結局、エントリ33bは抽出されないこととなる。
そこで、仮に、上記のクエリの2つ目の条件を「_id:{$in,[k1,k2,k3,k4,k6]}」とし、この条件により、図3(a)〜(d),(f)のエントリ32a〜32d,32fが第3フェーズにおける処理の対象になったものとする。尚、このときは、第2フェーズのクエリ実行時に、図3(a)〜(d),(f)のエントリ32a〜32d,32fの全てにおいて、インフライトデータはコミット済みデータに変換されているはずである。しかしながら、その後のトランザクションの処理により再び図3(a),(b),(d),(f)のようにインフライトデータが保持されることはあり得る。また、上記のクエリの2つ目の条件でk5を除いたのは、クエリを実行しているトランザクションのコミット後に同じトランザクションがインフライトデータを生成することはないからである。以下、図3(a)〜(d),(f)のエントリ32a〜32d,32fを対象として、第3フェーズについて説明する。
第3フェーズでは、まず、上記のクエリにより、コミット済みデータにおけるvalue1の値が「0」より大きいエントリが抽出される。ここでも、太線で囲んで示したエントリが、抽出されるエントリである。
即ち、図3(d)のエントリ32dのコミット済みデータにおけるvalue1の値「0」は「0」より大きくないので、エントリ32dは抽出されない。
一方、図3(a)のエントリ32aのコミット済みデータにおけるvalue1の値「10」、図3(b)のエントリ32bのコミット済みデータにおけるvalue1の値「30」、図3(c)のエントリ32cのコミット済みデータにおけるvalue1の値「10」、及び、図3(f)のエントリ32fのコミット済みデータにおけるvalue1の値「10」は何れも「0」より大きいので、エントリ32a,32b,32c,32fは抽出される。そして、この抽出されたエントリ32a,32b,32c,32fに対して、トランザクション状態に応じた処理が行われる。
図3(c)では、エントリ32cにインフライトデータが保持されていない。従って、エントリ32cにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
図3(b)では、エントリ32bにトランザクションID「Tx2」が保持されており、このトランザクションIDに対してトランザクション状態「コミット済み」が保持されている。従って、エントリ32bにおけるインフライトデータは、コミット済みデータに変換され、エントリ32bのキーが保存される。そして、このエントリ32bについて、第3フェーズが再実行される。
図3(f)では、エントリ32fにトランザクションID「Tx3」が保持されており、このトランザクションIDに対してトランザクション状態「アボート」が保持されている。従って、エントリ32fにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
図3(a)では、エントリ32aにトランザクションID「Tx1」が保持されており、このトランザクションIDに対してトランザクション状態「実行中」が保持されている。従って、エントリ32aにおけるコミット済みデータは、最新のデータであり、クエリ結果に追加される。
[本実施の形態におけるデータベース装置の機能構成]
図5は、本実施の形態におけるデータベース装置10の機能構成例を示した図である。図示するように、このデータベース装置10は、クエリ処理部20と、データベース部30とを含む。そして、クエリ処理部20は、クエリ受付部21と、第1クエリ実行部22と、第2クエリ実行部23と、第3クエリ実行部24と、キー記憶部25と、クエリ結果記憶部26と、クエリ結果出力部27とを含む。また、データベース部30は、データ記憶部31と、トランザクション状態記憶部32とを含む。
まず、クエリ処理部20の構成要素について説明する。
クエリ受付部21は、例えばクライアントが発行したクエリを受け付ける。
第1クエリ実行部22は、クエリ受付部21が受け付けたクエリを、データ記憶部31における対象のエントリに保持されたインフライトデータに対して実行する。そして、各エントリを更新中のトランザクションとクエリを実行しているトランザクションとが同じかどうか、及び、トランザクション状態記憶部32に記憶された各エントリに対するトランザクション状態に基づいて、クエリ結果を求め、これをクエリ結果記憶部26に記憶する。その際、あるエントリに対するトランザクション状態が「コミット済み」であれば、そのエントリに保持されたインフライトデータをコミット済みデータに変換する。本実施の形態では、コミットされていない又はコミットされたが保存されていない未保存データ要素の一例として、インフライトデータを用いており、複数の未保存データ要素に対してクエリを実行する第1のクエリ実行部の一例として、第1クエリ実行部22を設けている。
第2クエリ実行部23は、クエリ受付部21が受け付けたクエリを、データ記憶部31における対象のエントリに保持されたコミット済みデータに対して実行する。そして、各エントリを更新中のトランザクションがあるかどうか、各エントリを更新中のトランザクションとクエリを実行しているトランザクションとが同じかどうか、及び、トランザクション状態記憶部32に記憶された各エントリに対するトランザクション状態に基づいて、クエリ結果を求め、これをクエリ結果記憶部26に記憶する。その際、あるエントリに対するトランザクション状態が「コミット済み」であれば、そのエントリに保持されたインフライトデータをコミット済みデータに変換し、そのエントリのキーをキー記憶部25に記憶する。本実施の形態では、コミットされて保存された保存データ要素の一例として、コミット済みデータを用いており、複数の保存データ要素に対してクエリを実行する第2のクエリ実行部の一例として、第2クエリ実行部23を設けている。
第3クエリ実行部24は、キー記憶部25にキーが記憶されているかどうかを判定する。そして、キー記憶部25にキーが記憶されていれば、クエリ受付部21が受け付けたクエリを、そのキーを保持するエントリに保持されたコミット済みデータに対して実行し、その後、第2クエリ実行部23と同様の処理を行う。また、キー記憶部25にキーが記憶されていなければ、処理が終了した旨をクエリ結果出力部27に通知する。本実施の形態では、第2のクエリ実行部によるクエリの実行中に保存された少なくとも1つの保存データ要素の一例として、キーを保持するエントリに保持されたコミット済みデータを用いており、少なくとも1つの保存データ要素に対してクエリを実行する第3のクエリ実行部の一例として、第3クエリ実行部24を設けている。
キー記憶部25は、第2クエリ実行部23又は第3クエリ実行部24があるエントリに保持されたインフライトデータをコミット済みデータに変換した場合に第2クエリ実行部23又は第3クエリ実行部24から渡され、第3クエリ実行部24により読み出されるそのエントリのキーを記憶する。
クエリ結果記憶部26は、第1クエリ実行部22により求められたクエリ結果と、第2クエリ実行部23により求められたクエリ結果と、第3クエリ実行部24により求められたクエリ結果とを記憶する。
クエリ結果出力部27は、第3クエリ実行部24から処理が終了した旨を通知されると、クエリ結果記憶部26に記憶されたクエリ結果を外部に出力する。
次に、データベース部30の構成要素について説明する。
データ記憶部31は、クエリ処理部20によるクエリ処理の対象となるデータを記憶する。具体的には、データとしてエントリを記憶し、各エントリには、上述したように、キーとコミット済みデータとインフライトデータとトランザクションIDとを保持する。本実施の形態では、複数の保存データ要素と複数の未保存データ要素とを記憶する記憶部の一例として、データ記憶部31を設けている。
トランザクション状態記憶部32は、トランザクションIDとそのトランザクションIDで識別されるトランザクションの状態であるトランザクション状態とを対応付けて記憶する。ここで、トランザクション状態には、上述したように、「実行中」、「コミット済み」、「アボート」等がある。
[本実施の形態におけるクエリ処理部の動作]
図6は、本実施の形態におけるクエリ処理部20の第1フェーズの動作例を示したフローチャートである。クエリ処理部20では、上述したように、第1クエリ実行部22が第1フェーズの動作を行う。尚、この動作に先立ち、クエリ受付部21が、例えばクライアントが発行したクエリを受け付けるものとする。図2(a)〜(f)の例で言えば、クエリ{value1:{$gt:0}}を受け付ける。そして、クエリ受付部21が、受け付けたクエリを第1クエリ実行部22に受け渡すことにより、この動作は開始する。
動作が開始すると、まず、第1クエリ実行部22は、インフライトデータに対してクエリを実行する(ステップ201)。図2(a)〜(f)の例で言えば、クエリ受付部21から受け取ったクエリ{value1:{$gt:0}}をクエリ{_dirty.value1:{$gt:0}}に変換する。そして、この変換後のクエリをデータ記憶部31に記憶されたエントリに対して実行する。その際、第1クエリ実行部22は、エントリに対するカーソルを取得する。
次に、第1クエリ実行部22は、このカーソルが次のエントリを有するかどうかを判定する(ステップ202)。そして、このカーソルが次のエントリを有すると判定すれば、データ記憶部31から、そのエントリを取得する(ステップ203)。次いで、第1クエリ実行部22は、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中であるかどうかを判定する(ステップ204)。ここで、この判定は、別途保持されているクエリを実行中のトランザクションのトランザクションIDと、エントリに保持されているトランザクションIDとを比較することにより、行えばよい。
その結果、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中であると判定すれば、第1クエリ実行部22は、そのエントリに保持されているインフライトデータをクエリ結果記憶部26のクエリ結果に追加し(ステップ205)、処理をステップ202へ戻す。図2(a)〜(f)の例で言えば、図2(e)のエントリ31eに保持されているインフライトデータをクエリ結果に追加する。
一方、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中でないと判定すれば、第1クエリ実行部22は、そのエントリに対するトランザクション状態を確認する(ステップ206)。ここで、この確認は、そのエントリに保持されているトランザクションIDに対するトランザクション状態をトランザクション状態記憶部32から取得することにより、行えばよい。
これにより、第1クエリ実行部22は、インフライトデータがロールバックされるかどうかを判定する(ステップ207)。インフライトデータがロールバックされると判定すれば、第1クエリ実行部22は、そのまま処理をステップ202へ戻す。図2(a)〜(f)の例で言えば、図2(d)のエントリ31dに保持されているインフライトデータはクエリ結果に追加しない。或いは、図6には示していないが、第1クエリ実行部22が、エントリからインフライトデータを削除する処理を行った後に、処理をステップ202へ戻してもよい。
一方、インフライトデータがロールバックされると判定しなければ、第1クエリ実行部22は、インフライトデータがコミットされたかどうかを判定する(ステップ208)。インフライトデータがコミットされたと判定すれば、第1クエリ実行部22は、このインフライトデータでコミット済みデータを置き換え(ステップ209)、処理をステップ202へ戻す。図2(a)〜(f)の例で言えば、図2(c)のエントリ31cに保持されているインフライトデータをコミット済みデータに変換する。一方、インフライトデータがコミットされていないと判定すれば、第1クエリ実行部22は、そのまま処理をステップ202へ戻す。
その後、ステップ202でこのカーソルが次のエントリを有しないと判定すれば、第2フェーズの動作に移る。具体的には、第1クエリ実行部22が、第1フェーズの動作の開始時にクエリ受付部21から受け取ったクエリを第2クエリ実行部23に受け渡す。
図7は、本実施の形態におけるクエリ処理部20の第2フェーズの動作例を示したフローチャートである。クエリ処理部20では、上述したように、第2クエリ実行部23が第2フェーズの動作を行う。尚、第1クエリ実行部22が、第1フェーズの動作の開始時にクエリ受付部21から受け取ったクエリを第2クエリ実行部23に受け渡すことにより、この動作は開始する。
動作が開始すると、まず、第2クエリ実行部23は、コミット済みデータに対してクエリを実行する(ステップ221)。図3(a)〜(f)の例で言えば、クエリ受付部21から受け取ったクエリ{value1:{$gt:0}}をそのままデータ記憶部31に記憶されたエントリに対して実行する。その際、第2クエリ実行部23は、エントリに対するカーソルを取得する。
次に、第2クエリ実行部23は、このカーソルが次のエントリを有するかどうかを判定する(ステップ222)。そして、このカーソルが次のエントリを有すると判定すれば、データ記憶部31から、そのエントリを取得する(ステップ223)。次いで、第2クエリ実行部23は、そのエントリが、何らかのトランザクションにより更新中であるかどうかを判定する(ステップ224)。ここで、この判定は、エントリにインフライトデータが保持されているかどうかを調べることにより、行えばよい。
その結果、そのエントリが、何らかのトランザクションにより更新中でないと判定すれば、第2クエリ実行部23は、そのエントリに保持されているコミット済みデータをクエリ結果記憶部26のクエリ結果に追加し(ステップ225)、処理をステップ222へ戻す。図3(a)〜(f)の例で言えば、図3(c)のエントリ32cに保持されているコミット済みデータをクエリ結果に追加する。
一方、そのエントリが、何らかのトランザクションにより更新中であると判定すれば、第2クエリ実行部23は、そのエントリに対するトランザクション状態を確認する(ステップ226)。ここで、この確認は、そのエントリに保持されているトランザクションIDに対するトランザクション状態をトランザクション状態記憶部32から取得することにより、行えばよい。
これにより、第2クエリ実行部23は、インフライトデータがロールバックされるかどうかを判定する(ステップ227)。インフライトデータがロールバックされると判定すれば、第2クエリ実行部23は、そのエントリに保持されているコミット済みデータをクエリ結果記憶部26のクエリ結果に追加し(ステップ225)、処理をステップ222へ戻す。図3(a)〜(f)の例で言えば、図3(f)のエントリ32fに保持されているコミット済みデータをクエリ結果に追加する。
一方、インフライトデータがロールバックされると判定しなければ、第2クエリ実行部23は、インフライトデータがコミットされたかどうかを判定する(ステップ228)。インフライトデータがコミットされたと判定すれば、第2クエリ実行部23は、このインフライトデータでコミット済みデータを置き換え、このエントリのキーをキー記憶部25に記憶し(ステップ229)、処理をステップ222へ戻す。図3(a)〜(f)の例で言えば、図3(b)のエントリ32bに保持されているインフライトデータをコミット済みデータに変換し、キーk2を記憶する。
一方、インフライトデータがコミットされていないと判定すれば、第2クエリ実行部23は、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中であるかどうかを判定する(ステップ230)。ここで、この判定は、別途保持されているクエリを実行中のトランザクションのトランザクションIDと、エントリに保持されているトランザクションIDとを比較することにより、行えばよい。
その結果、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中でないと判定すれば、第2クエリ実行部23は、そのエントリに保持されているコミット済みデータをクエリ結果記憶部26のクエリ結果に追加し(ステップ225)、処理をステップ222へ戻す。図3(a)〜(f)の例で言えば、図3(a)のエントリ32aに保持されているコミット済みデータをクエリ結果に追加する。
一方、そのエントリが、クエリを実行しているトランザクションと同じトランザクションにより更新中であると判定すれば、第2クエリ実行部23は、そのまま処理をステップ222へ戻す。図3(a)〜(f)の例で言えば、図3(e)のエントリ32eに保持されているコミット済みデータはクエリ結果に追加しない。
その後、ステップ222でこのカーソルが次のエントリを有しないと判定すれば、第3フェーズの動作に移る。具体的には、第2クエリ実行部23が、第2フェーズの動作の開始時に第1クエリ実行部22から受け取ったクエリを第3クエリ実行部24に受け渡す。
図8は、本実施の形態におけるクエリ処理部20の第3フェーズの動作例を示したフローチャートである。クエリ処理部20では、上述したように、第3クエリ実行部24が第3フェーズの動作を行う。尚、第2クエリ実行部23が、第2フェーズの動作の開始時に第1クエリ実行部22から受け取ったクエリを第3クエリ実行部24に受け渡すことにより、この動作は開始する。
動作が開始すると、まず、第3クエリ実行部24は、キー記憶部25にキーが記憶されているかどうかを判定する(ステップ241)。
その結果、キー記憶部25にキーが記憶されていると判定すれば、第3クエリ実行部24は、そのキーを保持するエントリに対してクエリを実行する(ステップ242)。その際、第3クエリ実行部24は、エントリに対するカーソルを取得する。その後、第3クエリ実行部24は、図7のステップ222以降を再度実行する。
尚、第2フェーズでは、第2クエリ実行部23が図7のステップ222以降を実行するものとして説明したが、第3フェーズでは、第3クエリ実行部24が図7のステップ222以降を実行する。また、第3フェーズでは、図7のステップ230の判定は必ず「NO」となる。クエリを実行しているトランザクションが、第2フェーズでインフライトデータを生成しておりコミットされたと判定されたにも関わらず、第3フェーズで再びインフライトデータを生成しておりコミットされていないと判定されることはあり得ないからである。
一方、キー記憶部25にキーが記憶されていないと判定すれば、第3クエリ実行部24は、処理の終了をクエリ結果出力部27に通知する(ステップ243)。これにより、クエリ結果出力部27は、これまでにクエリ結果記憶部26に記憶されたクエリ結果を外部に出力する。
[本実施の形態の効果]
このように、本実施の形態では、インフライトデータ、コミット済みデータ、クエリ実行中にコミット済みデータとして保存されたデータをこの順に対象としてクエリを実行するようにした。これにより、例えばMongoDBにトランザクション機能を追加した場合でも、提供されるクエリ機能をトランザクショナルに実現することが可能になる。
具体的には、第一に、NoSQLデータベースに対するトランザクション機能の要求を満たすことが可能になる。即ち、アプリケーション開発の効率化のためにはトランザクション機能が必要であるが、本実施の形態によれば、既存アプリケーションのクエリを利用しながらトランザクション機能を実現できる。また、ACIDトランザクションが必要ならばMongoDBは使うべきではないとする考え方があるが、本実施の形態によれば、この考え方を覆すことができる。
第二に、MongoDBの全てのクエリオペレータを実装することが可能になる。このようなクエリオペレータとしては、$gt、$gte、$in、$lt、$lte、$ne、$nin、$or、$and、$not、$nor、$exists、$type、$mod、$regex、$where、$geoWithin、$geoIntersects、$near、$nearSphere、$all、$elemMatch、$size、$slice等がある。
第三に、コミット済みデータのみに対してクエリを実行する場合のレイテンシと比較して11%以下の性能劣化で、一貫性のあるクエリ結果を取得することができる。
また、本実施の形態は、アイソレーションレベルとしてREAD COMMITTEDレベルを提供し、かつ、その時点での最新データを照会することを可能とするものでもある。
[本実施の形態におけるデータベース装置のハードウェア構成]
図9は、本実施の形態におけるデータベース装置10のハードウェア構成例を示した図である。図示するように、データベース装置10は、演算手段であるCPU(Central Processing Unit)10aと、M/B(マザーボード)チップセット10bを介してCPU10aに接続されたメインメモリ10cと、同じくM/Bチップセット10bを介してCPU10aに接続された表示機構10dとを備える。また、M/Bチップセット10bには、ブリッジ回路10eを介して、ネットワークインターフェイス10fと、磁気ディスク装置(HDD)10gと、音声機構10hと、キーボード/マウス10iと、光学ドライブ10jとが接続されている。
尚、図9において、各構成要素は、バスを介して接続される。例えば、CPU10aとM/Bチップセット10bの間や、M/Bチップセット10bとメインメモリ10cの間は、CPUバスを介して接続される。また、M/Bチップセット10bと表示機構10dとの間は、AGP(Accelerated Graphics Port)を介して接続されてもよいが、表示機構10dがPCI Express対応のビデオカードを含む場合、M/Bチップセット10bとこのビデオカードの間は、PCI Express(PCIe)バスを介して接続される。また、ブリッジ回路10eと接続する場合、ネットワークインターフェイス10fについては、例えば、PCI Expressを用いることができる。また、磁気ディスク装置10gについては、例えば、シリアルATA(AT Attachment)、パラレル転送のATA、PCI(Peripheral Components Interconnect)を用いることができる。更に、キーボード/マウス10i、及び、光学ドライブ10jについては、USB(Universal Serial Bus)を用いることができる。
ここで、本発明は、全てハードウェアで実現してもよいし、全てソフトウェアで実現してもよい。また、ハードウェア及びソフトウェアの両方により実現することも可能である。また、本発明は、コンピュータ、データ処理システム、コンピュータプログラムとして実現することができる。このコンピュータプログラムは、コンピュータにより読取り可能な媒体に記憶され、提供され得る。ここで、媒体としては、電子的、磁気的、光学的、電磁的、赤外線又は半導体システム(装置又は機器)、或いは、伝搬媒体が考えられる。また、コンピュータにより読取り可能な媒体としては、半導体、ソリッドステート記憶装置、磁気テープ、取り外し可能なコンピュータディスケット、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)、リジッド磁気ディスク、及び光ディスクが例示される。現時点における光ディスクの例には、コンパクトディスク−リードオンリーメモリ(CD−ROM)、コンパクトディスク−リード/ライト(CD−R/W)及びDVDが含まれる。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態には限定されない。本発明の精神及び範囲から逸脱することなく様々に変更したり代替態様を採用したりすることが可能なことは、当業者に明らかである。
10…データベース装置、20…クエリ処理部、21…クエリ受付部、22…第1クエリ実行部、23…第2クエリ実行部、24…第3クエリ実行部、25…キー記憶部、26…クエリ結果記憶部、27…クエリ結果出力部、30…データベース部、31…データ記憶部、32…トランザクション状態記憶部

Claims (13)

  1. NoSQL型のデータベースに対するクエリを処理する装置であって、
    前記データベースにおけるコミットされて保存された複数の保存データ要素と、当該複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部と、
    前記複数の未保存データ要素に対して、前記クエリを実行する第1のクエリ実行部と、
    前記第1のクエリ実行部により前記クエリが実行された後に、前記複数の保存データ要素に対して、前記クエリを実行する第2のクエリ実行部と、
    前記第2のクエリ実行部により前記クエリが実行された後に、前記第2のクエリ実行部による前記クエリの実行中に保存された少なくとも1つの保存データ要素に対して、前記クエリを実行する第3のクエリ実行部と
    を含み、
    前記第1のクエリ実行部は、前記複数の未保存データ要素のうちの前記クエリにより抽出された特定の未保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の未保存データ要素による更新に関するトランザクションの状態に基づいて判定し、
    前記第2のクエリ実行部は、前記複数の保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、装置。
  2. 前記第1のクエリ実行部は、
    前記トランザクションが前記クエリを実行している場合は、前記特定の未保存データ要素を前記クエリの結果に含め、
    前記トランザクションが前記クエリを実行しておらず、当該トランザクションの状態がコミット済みである場合は、前記特定の未保存データ要素で、前記複数の保存データ要素のうちの当該特定の未保存データ要素による更新の対象である保存データ要素を置き換える、請求項1の装置。
  3. 前記第2のクエリ実行部は、
    前記特定の保存データ要素の更新のための未保存データ要素が記憶されていない場合、前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態がアボートである場合、及び、前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態が実行中であり、前記トランザクションが前記クエリを実行していない場合は、当該特定の保存データ要素を前記クエリの結果に含め、
    前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態がコミット済みである場合は、当該特定の未保存データ要素で当該特定の保存データ要素を置き換える、請求項1の装置。
  4. 前記第3のクエリ実行部は、前記少なくとも1つの保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、請求項1の装置。
  5. 前記第3のクエリ実行部は、
    前記特定の保存データ要素の更新のための未保存データ要素が記憶されていない場合、前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態がアボートである場合、及び、前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態が実行中である場合は、当該特定の保存データ要素を前記クエリの結果に含め、
    前記特定の保存データ要素の更新のための特定の未保存データ要素が記憶されており、前記トランザクションの状態がコミット済みである場合は、当該特定の未保存データ要素で当該特定の保存データ要素を置き換えた後、前記第3のクエリ実行部の処理を再実行する、請求項4の装置。
  6. 前記記憶部は、前記複数の未保存データ要素の各未保存データ要素に関連付けて、当該各未保存データ要素による更新を実行したトランザクションを識別するトランザクションIDを記憶する、請求項1乃至請求項5の何れかの装置。
  7. 前記記憶部は、前記複数の保存データ要素の各保存データ要素、前記各未保存データ要素、及び前記トランザクションIDを1つのエントリとして記憶する、請求項6の装置。
  8. 前記記憶部は、前記トランザクションの状態を示すトランザクション状態情報を前記トランザクションIDに関連付けて記憶する、請求項7の装置。
  9. 前記第1のクエリ実行部、前記第2のクエリ実行部、及び前記第3のクエリ実行部は、それぞれ、前記クエリにより抽出されたデータ要素を含む前記エントリ中の前記トランザクションIDにより前記トランザクション状態情報を参照しながら処理を実行する、請求項8の装置。
  10. 前記第2のクエリ実行部は、前記クエリにより抽出された保存データ要素に前記エントリ中で付随する未保存データ要素がコミット済みのトランザクションにより更新されていた場合は、当該未保存データ要素で当該保存データ要素を置き換えて、当該エントリに関連するキーを保存し、
    前記第3のクエリ実行部は、前記キーを用いて前記クエリを実行する、請求項9の装置。
  11. NoSQL型のデータベースに対するクエリを処理する装置であって、
    前記データベースにおけるコミットされて保存された複数の保存データ要素と、当該複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素と、当該複数の保存データ要素の当該複数の未保存データ要素による更新に関する複数のトランザクションを識別する複数の識別情報とを対応付けて記憶する記憶部と、
    前記複数の未保存データ要素に対して、前記クエリを実行し、当該複数の未保存データ要素のうちの前記クエリにより抽出された特定の未保存データ要素を、前記複数の識別情報のうちの当該特定の未保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、前記クエリの結果に含める第1のクエリ実行部と、
    前記第1のクエリ実行部により前記クエリが実行された後に、前記複数の保存データ要素に対して、前記クエリを実行し、当該複数の保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を、前記複数の識別情報のうちの当該特定の保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、前記クエリの結果に含める第2のクエリ実行部と、
    前記第2のクエリ実行部により前記クエリが実行された後に、前記第2のクエリ実行部による前記クエリの実行中に保存された少なくとも1つの保存データ要素に対して、前記クエリを実行し、当該少なくとも1つの保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を、前記複数の識別情報のうちの当該特定の保存データ要素と対応付けて記憶された識別情報により識別されるトランザクションの状態が所定の条件を満たす場合に、前記クエリの結果に含める第3のクエリ実行部と
    を含む、装置。
  12. NoSQL型のデータベースに対するクエリを処理する方法であって、
    前記データベースにおけるコミットされて保存された複数の保存データ要素と、当該複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部を含み、
    前記複数の未保存データ要素に対して、前記クエリを実行する第1のステップと、
    前記第1のステップで前記クエリが実行された後に、前記複数の保存データ要素に対して、前記クエリを実行する第2のステップと、
    前記第2のステップで前記クエリが実行された後に、前記第2のステップでの前記クエリの実行中に保存された少なくとも1つの保存データ要素に対して、前記クエリを実行する第3のステップと
    を含み、
    前記第1のステップでは、前記複数の未保存データ要素のうちの前記クエリにより抽出された特定の未保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の未保存データ要素による更新に関するトランザクションの状態に基づいて判定し、
    前記第2のステップでは、前記複数の保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、方法。
  13. NoSQL型のデータベースに対するクエリを処理する装置として、コンピュータを機能させるプログラムであって、
    前記コンピュータを、
    前記データベースにおけるコミットされて保存された複数の保存データ要素と、当該複数の保存データ要素の更新のための、コミットされていない又はコミットされたが保存されていない複数の未保存データ要素とを記憶する記憶部と、
    前記複数の未保存データ要素に対して、前記クエリを実行する第1のクエリ実行部と、
    前記第1のクエリ実行部により前記クエリが実行された後に、前記複数の保存データ要素に対して、前記クエリを実行する第2のクエリ実行部と、
    前記第2のクエリ実行部により前記クエリが実行された後に、前記第2のクエリ実行部による前記クエリの実行中に保存された少なくとも1つの保存データ要素に対して、前記クエリを実行する第3のクエリ実行部と
    して機能させ
    前記第1のクエリ実行部は、前記複数の未保存データ要素のうちの前記クエリにより抽出された特定の未保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の未保存データ要素による更新に関するトランザクションの状態に基づいて判定し、
    前記第2のクエリ実行部は、前記複数の保存データ要素のうちの前記クエリにより抽出された特定の保存データ要素を前記クエリの結果に含めるかどうかを、当該特定の保存データ要素の更新に関するトランザクションの状態に基づいて判定する、プログラム。
JP2014224424A 2014-11-04 2014-11-04 クエリを処理する装置及び方法 Expired - Fee Related JP5967628B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2014224424A JP5967628B2 (ja) 2014-11-04 2014-11-04 クエリを処理する装置及び方法
US14/931,760 US10120894B2 (en) 2014-11-04 2015-11-03 Apparatus and method for processing a query
US15/377,546 US10002158B2 (en) 2014-11-04 2016-12-13 Apparatus and method for processing a query

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014224424A JP5967628B2 (ja) 2014-11-04 2014-11-04 クエリを処理する装置及び方法

Publications (2)

Publication Number Publication Date
JP2016091264A JP2016091264A (ja) 2016-05-23
JP5967628B2 true JP5967628B2 (ja) 2016-08-10

Family

ID=55852884

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014224424A Expired - Fee Related JP5967628B2 (ja) 2014-11-04 2014-11-04 クエリを処理する装置及び方法

Country Status (2)

Country Link
US (2) US10120894B2 (ja)
JP (1) JP5967628B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10002158B2 (en) 2014-11-04 2018-06-19 International Business Machines Corporation Apparatus and method for processing a query

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6536472B2 (ja) 2016-04-28 2019-07-03 株式会社デンソー ソレノイド

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05289921A (ja) * 1992-04-14 1993-11-05 Hitachi Ltd データベース管理方法および装置
JP4287900B2 (ja) 2001-03-19 2009-07-01 株式会社リコー 書き込み遅延データベース管理システム、及びプログラム
US7689612B2 (en) * 2007-04-19 2010-03-30 Sap Ag Handling of queries of transient and persistent data
WO2011099082A1 (ja) 2010-02-15 2011-08-18 株式会社 東芝 データベース管理システム
JP2013033345A (ja) 2011-08-01 2013-02-14 Internatl Business Mach Corp <Ibm> トランザクション処理システム、方法及びプログラム
JP5967628B2 (ja) 2014-11-04 2016-08-10 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation クエリを処理する装置及び方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10002158B2 (en) 2014-11-04 2018-06-19 International Business Machines Corporation Apparatus and method for processing a query
US10120894B2 (en) 2014-11-04 2018-11-06 International Business Machines Corporation Apparatus and method for processing a query

Also Published As

Publication number Publication date
US10002158B2 (en) 2018-06-19
JP2016091264A (ja) 2016-05-23
US10120894B2 (en) 2018-11-06
US20170091261A1 (en) 2017-03-30
US20160125019A1 (en) 2016-05-05

Similar Documents

Publication Publication Date Title
US9720992B2 (en) DML replication with logical log shipping
US9336262B2 (en) Accelerated transactions with precommit-time early lock release
US9952940B2 (en) Method of operating a shared nothing cluster system
EP2738698B1 (en) Locking protocol for partitioned and distributed tables
US9652492B2 (en) Out-of-order execution of strictly-ordered transactional workloads
CN104598459A (zh) 数据库处理、数据访问方法及***
US9998544B2 (en) Synchronization testing of active clustered servers
US11132376B2 (en) System and method for management of a database system
JP5772458B2 (ja) データ管理プログラム、ノード、および分散データベースシステム
US9916360B2 (en) Joining operations in document oriented databases
JP5967628B2 (ja) クエリを処理する装置及び方法
CN110955719B (zh) 一种数据存取处理设备、***和方法
US9390131B1 (en) Executing queries subject to different consistency requirements
US11144574B2 (en) System and method for managing database
JP2008146264A (ja) サマリーテーブルをリフレッシュするための装置、方法、及びプログラム
CN108959548B (zh) 业务请求的处理方法及装置
JP2010152435A (ja) 情報処理装置及び情報処理方法及びプログラム
US20200249876A1 (en) System and method for data storage management
JPWO2014097475A1 (ja) 情報処理方法、情報処理装置、及び、プログラム
US20150134676A1 (en) Amorphous data query formulation
JP6398786B2 (ja) データベースシステム、データベースサーバ、データベースサーバプログラム、データベースクライアント及びデータベースクライアントプログラム
US11741097B2 (en) Tree structure data processing system, tree structure data processing method, tree structure data processing device, and tree structure data processing program
JP2017054207A (ja) データベース制御プログラム、データベース制御方法及びデータベース制御装置
JP2006302136A (ja) 情報検索依頼装置
JP2011043865A (ja) データ処理装置及びデータ処理方法及びプログラム

Legal Events

Date Code Title Description
A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20160406

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160426

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160511

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: 20160607

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20160607

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160628

R150 Certificate of patent or registration of utility model

Ref document number: 5967628

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees