以下、実施の形態について図面を参照して説明する。
(第1実施形態)
図1は、本実施形態に係るデータベースシステム1のシステム構成を示す図である。
図1に示すように、本データベースシステム1は、各々がアプリケーションプログラム2からのデータ処理要求を受け付ける1以上のデータベース10によって構成される。ここでは、2つのデータベース10を示しているが、単なる例示であって、これに限定されるものではない。つまり、本データベースシステム1は、1つのデータベース10によっても構成され得るし、3つ以上のデータベース10によっても構成され得る。
データベース10は、複数のテーブルを結合させることが可能なリレーショナル型データベースであり、コントローラ11およびファイルシステム12を有している。アプリケーションプログラム2は、GUI(Graphical user interface)部21および論理・算術演算部22を有し、例えば、GUI部21により受け付けたユーザからの指示に応じて、論理・算術演算部22が、SQLで記述したデータ処理要求をデータベース10に発行し、返却されたデータ処理結果をGUI部21によりユーザに提示する。アプリケーションプログラム2により発行されるデータ処理要求には、大きく分けて、データの参照要求と、データの更新要求とが存在し、データの更新要求には、データの追加要求および削除要求が含まれる。また、SQLで記述されるデータ処理要求は、SQL文やクエリなどと称される。
データベース10のコントローラ11は、アプリケーションプログラム2からのデータ処理要求の受付窓口の役割を担うモジュールである。コントローラ11は、要求されたデータ処理を実行するデータベースエンジン100を有している。また、コントローラ11は、他のデータベース10のコントローラ11との間で通信する機能を有している。したがって、アプリケーションプログラム2は、データ処理要求の発行先であるデータベース10で管理されるテーブルと、このデータベース10とは異なるデータベース10で管理されるテーブルとの結合を伴うデータ処理要求を発行することもできる。換言すれば、アプリケーションプログラム2は、本データベースシステム1を構成する1以上のデータベース10内に存在するテーブルのすべてをデータ処理の対象とすることができる。データベース10のファイルシステム12は、データベース10内に存在する、テーブルのデータを含む各種データの記憶媒体上における配置場所を管理するモジュールである。
本データベースシステム1は、データベース10の各々が、テーブルを事前に参照要求に適するように変形をしたキャッシュテーブルを予め用意しておき、テーブルおよびキャッシュテーブルを使って、データの参照要求に応答する機能を有している。変形とは、典型的には、2以上のテーブルを結合することである。そして、本データベースシステム1は、キャッシュテーブルの基となるテーブルが更新された場合のキャッシュテーブルの更新を効率的に行う仕組みを実装するものであり、以下、この仕組みについて詳述する。
まず、本データベースシステム1が実装する、キャッシュテーブルを効率的に更新する仕組みの理解を助けるために、図2乃至図4を参照して、キャッシュテーブルの基となるテーブルが更新された場合の一般的な対処法について説明する。
図2は、2つのテーブル(テーブルA,B)を結合してキャッシュテーブルを生成する一例を示している。以下、キャッシュテーブルを参照用テーブル201(マテリアライズドビュー:MATERIALIZED VIEW [MVIEW])、キャッシュテーブルの基となるテーブルを更新用テーブル202と称する。
図2中、「CREATE MATERIALIZED VIEW READABLE AS SELECT 名前、場所 FROM A,B WHERE a2=1 and a3=b0 and b2=’今’」は、更新用テーブル202から参照用テーブル201を生成するためのクエリである。本クエリ中、”WHERE”部に条件文が記述され、条件文は、結合条件と絞り込み条件とを含み得る。”a3=b0”が、結合条件であり、テーブルAの3つ目のフィールドに格納される値とテーブルBの行番号とが一致する行を結合する旨を指定するものである。”a2=1”および”b2=’今’”は、絞り込み条件であり、テーブルAの2つ目のフィールドに格納される値が「1」、テーブルBの2つ目のフィールドに格納される値が「今」の行に絞り込む旨を指定するものである。なお、”SELECT”部には、抽出すべき項目名(フィールド名)が記述され、また、”FROM”部には、対象とすべきファイル名(テーブル名)が記述される。ここでは、テーブルAの1つ目のフィールドの項目名が「名前」であり、また、テーブルBの1つ目のフィールドの項目名が「場所」であるものとする。
図2に示す参照用テーブル201を予め生成しておくことにより、以降、「SELECT 名前、場所 FROM A,B WHERE a2=1 and a3=b0 and b2=’今’」を含むデータの参照要求であるクエリが発行された場合、テーブルAとテーブルBとの結合を行わなくとも、要求されたデータを速やかに返却することが可能となる。
ところで、前述したように、アプリケーションプログラム2により発行されるクエリには、データの参照要求のみならず、データの更新要求も存在する。したがって、参照用テーブル201を生成した後に、更新用テーブル202が更新されることも考えられる。この場合、その更新内容を参照用テーブル201に反映させる必要が生じる。ここで、参照用テーブル201の基となる更新用テーブル202であるテーブルAの行番号「2」の行の1つ目のフィールドが「田中」から「里中」に更新された場合を想定する。なお、以下では、行番号を主キー値と称することがある。
図3は、更新用テーブル202の更新内容を参照用テーブル201に同期的に反映させる場合の例を示している。
図3に示すように、更新用テーブル202が更新された場合に、参照用テーブル201を即応的に更新すれば、データの参照要求に対して返却されるデータは、常に最新のデータとなる。一方で、参照用テーブル201の更新を頻繁に行うことになりかねず、更新時間の増大を招くおそれがある。
また、図4は、更新用テーブル202の更新内容を参照用テーブル201に非同期的に反映させる場合の例を示している。
更新用テーブル202が更新されても、参照用テーブル201を即応的に更新するのではなく、図4に示すように、一定期間毎に、各期間の更新分を一括して更新すれば、更新時間は想定範囲内に収めることができる。一方で、データの参照要求に対して返却されるデータが、更新前の古いデータとなるおそれがある。
このような、参照用テーブル201の基となる更新用テーブル202が更新された場合の一般的な対処法である同期型および非同期型の双方の特長を踏まえた上で、続いて、図5および図6を参照して、本データベースシステム1における更新用テーブル202が更新された場合の参照用テーブル201の更新についての基本的な考え方を説明する。
まず、図5に、更新用テーブル202が更新された場合の参照用テーブル201の更新についての一般的な考え方を示す。
前述した、更新用テーブル202の更新内容を同期的に参照用テーブル201に反映させる対処法(同期型)および更新用テーブル202の更新内容を非同期的に参照用テーブル201に反映させる対処法(非同期型)のいずれも、更新用テーブル202の更新というイベントの発生を契機として、参照用テーブル201の更新を実行するという、言うなれば「更新側主導」の考え方である。
次に、図6に、本データベースシステム1における更新用テーブル202が更新された場合の参照用テーブル201の更新についての基本的な考え方を示す。
本データベースシステム1では、更新用テーブル202の更新時、旧データを無効化するだけで、参照用テーブル201の更新は実行しない。図6では、旧データを含むデータセットの配置場所を示すポインタの値を「0」に更新している。ここで、「0」は、無効を示す値として定義されているものとする。
そして、本データベースシステム1では、参照用テーブル201の参照時、該当データが無効化されていた場合に、新データを更新用テーブル202から取得し、参照用テーブル201を更新する。このように、本データベースシステム1では、言うなれば「参照側主導」の考え方を採用する。
図7に、参照用テーブル201の基となる更新用テーブル202が局所的に頻繁に更新された場合の一例を示す。
いま、ある時点(図7のa1)で参照されたデータの同一箇所が頻繁に更新された場合を考える(図7のa2〜a6)。ここでは、参照時の「3」が、「3」→「8」→「9」→「5」→「9」→「6」と更新されている。この間、このデータが参照されることはなく、その後、このデータが2度参照されたとする(図7のa7,a8)。
このような場合、「更新側主導」では、特に「同期型」においては、更新回数分、このデータに関する参照用テーブル201の更新が実行される。「非同期型」においても、各更新が互いに異なる期間内に行われたならば、「同期型」と同様、更新回数分、このデータに関する参照用テーブル201の更新が実行される。この間、このデータは参照されていないので、「3」→「8」→「9」→「5」→「9」の更新は無駄となる。
一方、「参照側主導」では、更新後の最初の参照時(図7のa7)に新データを取得して参照用テーブル201を更新するので、上記のような参照用テーブル201の無駄な更新の実行を排除できる。また、以降の参照時(図7のa8)には、参照用テーブル201に格納された新データを速やかに参照することができる。
このように、「参照側主導」は、データの参照要求に対して常に最新のデータを返却することを保証しつつ、データの更新に関するオーバヘッドを最小化する。
図8は、「更新側主導」における更新用テーブル202の更新に伴う参照用テーブル201の更新に関する処理の流れを示す図である。なお、ここでは、データの参照要求に対応するモジュールと、データの更新要求に対応するモジュールとが各々設けられているものとする。データの参照要求に対応するモジュールとは、即ち参照用テーブル201の管理を司るモジュールであり、データの更新要求に対応するモジュールとは、即ち更新用テーブル202の管理を司るモジュールである。
図8に示すように、「更新側主導」では、更新用テーブル202の更新が要求された場合(図8のb1)、更新用テーブル202の更新に加え、概ねその都度(「同期型」であれば毎回)、新データが参照用テーブル201の条件に合うか(参照用テーブル201の条件から外れたか)を確認するための計算が行われ(図8のb2)、必要であれば、参照用テーブル201を更新するためのデータの転送が行われる(図8のb3)。この更新データの参照用テーブル201への反映(図8のb4)も、更新用テーブル202の更新を契機として実行される。そして、これらの処理は、参照用テーブル201の参照(図8のb5)の有無に関係なく実行される。
ここで、まず、図9および図10を参照して、「更新側主導」の場合に必要となる、更新用テーブル202の更新時に新データが参照用テーブル201の条件に合うか(参照用テーブル201の条件から外れたか)を確認するための計算について説明する。
図9では、テーブルAの行番号「2」の行の3つめのフィールド(a3)が「1」から「3」に変更された例を示している。このフィールドは、結合条件に関わるフィールドであり、また、結合先のテーブルBの2つ目のフィールド(b2)が、絞り込み条件に関わるフィールトであるので、新データに基づき改めて結合を行い、結合先のテーブルBの2つ目のフィールドの値を確認する。その値は「昔」であり、絞り込み条件を満たさない。
この時、更新前の旧データ「1」により結合されるテーブルBの2つ目のフィールドの値を確認すると、その値は「今」であり、絞り込み条件を満たしている。これにより、参照用テーブル201から1つの行を削除する必要があることが分かる。
一方、図10では、テーブルAの行番号「3」の行の3つ目のフィールド(a3)が、「3」から「1」に変更された例を示している。このフィールドは、結合条件に関わるフィールドであり、また、結合先のテーブルBの2つ目のフィールド(b2)が、絞り込み条件に関わるフィールトであるので、新データに基づき改めて結合を行い、結合先のテーブルBの2つ目のフィールドの値を確認する。その値は「今」であり、絞り込み条件を満たしている。
この時、更新前の旧データ「3」により結合されるテーブルBの2つ目のフィールドの値を確認すると、その値は「昔」であり、絞り込み条件を満たさない。これにより、参照用テーブル201に1つの行を追加する必要があることが分かる。なお、絞り込み条件を満たしている場合には、参照用テーブル201側に存在するデータセットを更新する必要があることが分かる。例えば更新前の旧データが「2」であった場合、参照用テーブル201側の該当データセット内の「横浜」を「川崎」に更新しなければならない。
このように、「更新側主導」の場合には、更新用テーブル202の更新時、負荷の大きい結合を伴う計算が必須となる。
図11は、「参照側主導」における更新用テーブル202の更新に伴う参照用テーブル201の更新に関する処理の流れを示す図である。
図11に示すように、「参照側主導」では、更新用テーブル202の更新が要求された場合(図11のc1)、更新用テーブル202の更新(図11のc2)と、その更新の通知(図11のc3)とが行われる。また、参照用テーブル201については、更新が通知されたデータに関わる行の削除(図11のc4)、つまり無効化のみが行われ、参照用テーブル201の更新は実行されない。
また、更新用テーブル202の更新(図11のc2)が、同一テーブルの同一レコードに対する2箇所目以降の更新である場合や、そもそも参照用テーブル201と関係のないデータを対象とするものである場合、その更新の通知(図11のc3)は行われず、参照用テーブル201の該当行の削除(図11のc4)も行われない。
そして、参照用テーブル201の参照時(図11のc5)、該当のデータが存在しない場合に限り、そのデータを更新用テーブル202から取得して、参照用テーブル201を更新する(図11のc6)。
図12は、更新用テーブル202が局所的に更新された場合の参照用テーブル201の更新に関する処理の流れを「更新側主導」と「参照側主導」とで比較する図である。
参照用テーブル201を更新した後、そのデータが参照されなかった場合、その更新は無駄に終わる。したがって、図12に示すように、「更新側主導」では、例えば更新用テーブル202が局所的に更新された場合、無駄な参照用テーブル201の更新が多く発生する。これに対して、「参照側主導」では、参照用テーブル201の更新が、参照される必要分に止まる。このことから、「参照側主導」は、バースト処理に対して効果的であるといえる。
次に、本データベースシステム1が、この「参照側主導」を実現する基本原理について説明する。
図13は、「参照側主導」である本データベースシステム1における参照用テーブル201の一構成例を示す図である。
ここで、図13に示す参照用テーブル201の一構成例と比較するために、一旦、図14および図15を参照して、「更新側主導」における典型的な参照用テーブル201の一構成例および更新用テーブル202の更新に伴う当該参照用テーブル201の更新手順を説明する。
図14に示すように、「更新側主導」の場合、参照用テーブル201は、通常、結合した各テーブルの行番号(主キー値)の組み合わせである行番号(rowid)と、データセットの配置場所を示すポインタ(ptr)とを備える。
いま、更新用テーブル202のデータであって、参照用テーブル201側にキャッシュされているデータが「田中」から「里中」に更新されたものとする。
この場合、図15に示すように、更新されたデータを含む行について結合を実行し、参照用テーブル201における行番号を計算して、参照用テーブル201用の更新データとして転送する。そして、この更新データに付される行番号に基づき、参照用テーブル201を更新する。
再び、図13を参照する。
この参照用テーブル201について、「参照側主導」である本データベースシステム1では、行番号(rowid)とは別に、主キー値を格納するキーフィールドをテーブル(更新用テーブル202)毎に持つ(rA,rB)。そして、本データベースシステム1では、第1に、キャッシュが有効か否かのフラグを行毎に持つ(cache)。第2に、主キー値による行番号のダイレクトサーチを可能とするためのインデックスをテーブル(更新用テーブル202)毎に持つ(index_rA,index_rB)。第3に、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグをテーブル(更新用テーブル202)毎に持つ。
以下、図13に示したように参照用テーブル201を構成することで、本データベースシステム1が、当該参照用テーブル201を「参照側主導」でどのように更新するのかについて説明する。
図16は、本データベースシステム1の参照用テーブル201の更新に関する機能ブロック図である。
本データベースシステム1における参照用テーブル201および更新用テーブル202の管理は、データベースエンジン100が司る。図16中、(A)は、データの参照要求に対応するモジュール、つまり参照用テーブル201の管理を司るモジュールとして動作するデータベースエンジン100の機能ブロックを示し、(B)は、データの更新要求に対応するモジュール、つまり更新用テーブル202の管理を司るモジュールとして動作するデータベースエンジン100の機能ブロックを示している。1つのデータベースエンジン100を、データの参照要求に対応するモジュールおよびデータの更新要求に対応するモジュールの双方として動作させてもよいし、2つのデータベースエンジン100を、一方をデータの参照要求に対応するモジュールとして、他方をデータの更新要求に対応するモジュールとして動作させてもよい。以下、データの参照要求に対応するモジュールとして動作するデータベースエンジン100を参照側データベースエンジン100と称し、データの更新要求に対応するモジュールとして動作するデータベースエンジン100を更新側データベースエンジン100と称する。
図16(A)に示すように、参照側データベースエンジン100は、SQL文解析部111、データ制御部112、データ変更部113、データ要求部114およびメモリ115を有している。
SQL文解析部111は、SQLで記載されるデータの参照要求、つまりクエリを解析するモジュールである。SQL文解析部111は、その参照要求が参照用テーブル201を適用可能なものであるか否かを判定する。参照用テーブル201を適用可能なデータの参照要求は、参照用テーブル201からデータが取得されて返却され、参照用テーブル201を適用不可なデータの参照要求は、更新用テーブル202からデータが取得されて返却されることとなる。
データ制御部112は、参照が要求されたデータを返却するモジュールであり、当該参照が要求されたデータが参照用テーブル201に存在するか否か(参照用テーブル201のデータは有効か否か)を判定する機能を有している。データ変更部113は、更新側データベースエンジン100から更新用テーブル202の更新通知を受け取った場合に、参照用テーブル201の該当データを無効化する等の参照用テーブル201の更新を実行するモジュールである。また、データ変更部113は、更新通知として送られてくるスキーマに基づき、参照用テーブル201を作成する機能を有している。
データ要求部114は、データ制御部112により、参照が要求されたデータが参照用テーブル201に存在しないと判定された場合、該当データを更新用テーブル202から取得して、参照用テーブル201に格納するモジュールである。メモリ115は、参照用テーブル201を格納する記憶領域である。
また、更新側データベースエンジン100は、図16(B)に示すように、SQL文解析部121、データ制御部122、更新通知部123およびメモリ124を有している。
SQL文解析部121も、参照側データベースエンジン100のSQL文解析部111と同様、クエリを解析するモジュールである。データの更新要求の中には、キャッシュテーブルの生成要求、つまり参照用テーブル201の生成要求も含まれ、SQL文解析部121は、クエリが参照用テーブル201の生成を要求するものか否かを判定する機能を有している。また、SQL文解析部121は、参照用テーブル201の生成を要求するクエリから、絞り込み条件と結合条件とを含む条件文を抽出する機能を有している。この条件文の抽出は、更新用テーブル202の更新に伴う参照用テーブル201の更新を「参照側主導」で行うための事前準備として行うものであり、この点については後述する。
データ制御部122は、更新が要求された更新用テーブル202のデータを更新するモジュールである。この更新時、データ制御部122は、データを更新した行の行番号を示す更新行情報210をメモリ124に格納する。データ制御部122は、参照用テーブル201の生成が要求された際、当該参照用テーブル201のスキーマを作成する。
更新通知部123は、データ制御部122により作成されたスキーマと、メモリ124に格納された更新行情報210とを、更新通知として参照側データベースエンジン100に送信するモジュールである。メモリ124は、更新行情報210を格納する記憶領域である。
ここで、図17を参照して、更新側データベースエンジン100のSQL文解析部121による参照用テーブル201の生成を要求するクエリの解析について説明する。
いま、「CREATE MATERIALIZED VIEW READABLE AS SELECT 名前、場所 FROM A,B WHERE a2=1 and a3=b0 and b2=’今’」といったクエリが発行されたものと想定する。SQL文解析部121は、このクエリから、条件文、つまり「WHERE a2=1 and a3=b0 and b2=’今’」のみを抽出する。また、SQL文解析部121は、抽出した条件文に含まれる結合条件(a3=b0)で指定される各テーブルのキー(a3,b0)と、結合対象の各テーブルの主キー(a0,b0)とを、結合に関わるキーとして取得する。
次に、図18乃至図26を参照して、事前準備として取得したキーを使った参照用テーブル201の「参照側主導」での更新手順について説明する。このうち、図18乃至図22は、更新用テーブル202の更新時に関する図であり、図23乃至図26は、参照用テーブル201の参照時に関する図である。
図18は、事前準備として取得したキー以外の変更となる更新用テーブル202の更新の一例を示している。
図18に示すように、ここでは、テーブルAの行番号(a0)「2」の行の1つ目のフィールド(a1)が、「田中」から「里中」に更新されている。”a1”は、事前準備として取得したキー以外、つまり結合に関わるキーではないので、更新側データベースエンジン100の更新通知部123は、この行のデータを含むデータセットを無効とするための更新通知(Clear)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「2」を示す情報(A2)が含まれる。
一方、参照側データベースエンジン100は、この更新通知を受けると、データ変更部113が、テーブルA用のインデックスで参照用テーブル201の行番号を取得し、その行のフラグ(cache)を無効に更新する。ここで、各フラグは、「1」が有効、「0」が無効を示すものとする。
事前準備として取得したキー以外の変更となる更新用テーブル202の更新時には、以上の処理を行うのみで終了する。
図19は、事前準備として取得したキーの変更となる更新用テーブル202の更新であって、更新された行の主キー値がそのテーブル用のインデックスに存在する場合の一例を示している。インデックスに存在する場合とは、その行のデータを含むデータセットが参照用テーブル201側に存在する場合または過去に存在した場合である。
図19に示すように、ここでは、テーブルAの行番号(a0)「2」の行の3つ目のフィールド(a3)が、何らかの値から「3」に更新されている。”a3”は、事前準備として取得したキー、つまり結合に関わるキーであるので、更新側データベースエンジン100の更新通知部123は、この行との結合を無効とするための更新通知(Key)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「2」を示す情報(A2)が含まれる。
一方、参照側データベースエンジン100は、この更新通知を受けると、データ変更部113が、テーブルA用のインデックスで参照用テーブル201の行番号を取得し、その行のテーブルA以外のすべてのキーフィールド(rB)、フラグ(cache)およびポインタ(ptr)を無効に更新する。また、データ変更部113は、キーフィールドを無効に更新した場合、そのキーフィールドに対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグを無効に更新する。
また、図20は、事前準備として取得したキーの変更となる更新用テーブル202の更新であって、更新された行の主キー値がそのテーブル用のインデックスに存在しない場合の一例を示している。インデックスに存在しない場合とは、更新前のデータによる結合では絞り込み条件を満たさず、その行のデータを含むデータセットが参照用テーブル201側において作成されなかった場合、または、その主キー値を格納していたキーフィールドすべてが無効に更新された場合である。
図20に示すように、ここでは、テーブルAの行番号(a0)「2」の行の3つ目のフィールド(a3)が、何らかの値から「1」に更新されている。”a3”は、事前準備として取得したキー、つまり結合に関わるキーであるので、更新側データベースエンジン100の更新通知部123は、この行との結合を無効とするための更新通知(Key)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「2」の行を示す情報(A2)が含まれる。
一方、参照側データベースエンジン100は、この更新通知を受けると、データ変更部113が、テーブルA用のインデックスで参照用テーブル201の行番号を取得しようと試みる。更新された行の主キー値がテーブルA用のインデックスに存在しない場合、データ変更部113は、参照用テーブル201に行を追加するとともに、更新された行の主キー値で当該追加した行の行番号を得られるようにインデックスも追加する。追加した行のテーブルAのキーフィールド(rA)には更新された行の行番号である主キー値「2」が格納され、それ以外のすべてのキーフィールド(rB)、フラグ(cache)およびポインタ(ptr)には無効を示す値「0」が格納される。また、無効を示す値「0」を格納するキーフィールドが発生したことにより、データ変更部113は、そのキーフィールドに対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグを無効に更新する。
図21は、事前準備として取得したキーの変更となる、更新用テーブル202に行が追加された場合の一例を示している。
図21に示すように、ここでは、行番号(a0)「5」の行がテーブルAに追加されている。結合に関わるキーである”a0”および”a3”のデータの追加を伴うので、更新側データベースエンジン100の更新通知部123は、この行との結合を無効とするための更新通知(Key)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「5」を示す情報(A5)が含まれる。
この場合、この更新通知を受けた参照側データベースエンジン100のデータ変更部113が行う処理は、図20を参照して説明した、事前準備として取得したキーの変更となる更新用テーブル202の更新であって、更新された行の主キー値がそのテーブル用のインデックスに存在しない場合の処理と同様となる。つまり、データ変更部113は、参照用テーブル201に行を追加するとともに、更新された行の主キー値で当該追加した行の行番号を得られるようにインデックスも追加する。追加した行のテーブルAのキーフィールド(rA)には更新された行の行番号である主キー値「5」が格納され、それ以外のすべてのキーフィールド(rB)、フラグ(cache)およびポインタ(ptr)には無効を示す値「0」が格納される。また、無効を示す値「0」を格納するキーフィールドが発生したことにより、データ変更部113は、そのキーフィールドに対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグを無効に更新する。
逆に、図22は、事前準備として取得したキーの変更となる、更新用テーブル202から行が削除された場合の一例を示している。
図22に示すように、ここでは、行番号(a0)「2」の行がテーブルAから削除されている。結合に関わるキーである”a0”および”a3”のデータの削除を伴うので、更新側データベースエンジン100の更新通知部123は、この行との結合を無効とするための更新通知(Key)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「2」を示す情報(A2)が含まれる。
この場合、この更新通知を受けた参照側データベースエンジン100のデータ変更部113が行う処理は、図19を参照して説明した、事前準備として取得したキーの変更となる更新用テーブル202の更新であって、更新された行の主キー値がそのテーブル用のインデックスに存在する場合の処理と同様となる。つまり、データ変更部113は、テーブルA用のインデックスで参照用テーブル201の行番号を取得し、その行のテーブルA以外のすべてのキーフィールド(rB)、フラグ(cache)およびポインタ(ptr)を無効に更新する。また、データ変更部113は、キーフィールドを無効に更新した場合、そのキーフィールドに対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグを無効に更新する。
以上が、本データベースシステム1の更新用テーブル202の更新時における参照用テーブル201の更新手順である。なお、更新側データベースエンジン100は、更新用テーブル202が更新された場合であっても、それが参照用テーブルの生成時にSQL文解析部121により抽出された条件文に含まれる絞り込み条件を満たさないデータに対する更新であった場合には、更新通知部123による更新通知の参照側データベースエンジン100への送信は行わない。
図23は、更新用テーブル202上で更新されている行の主キー値を絞り込み条件として指定する参照であって、その更新が、事前準備として取得したキー以外の変更である場合の一例を示している。
図23に示すように、ここでは、テーブルAの主キー(a0)値「2」が絞り込み条件として指定されている。このテーブルAの行番号(a0)「2」の行は、1つ目のフィールド(a1)が「田中」から「里中」に更新されている。”a1”は、事前準備として取得したキー以外、つまり結合に関わるキーではないので、参照用テーブル201上では、その行のフラグ(cache)が無効に更新されていることになる。
参照側データベースエンジン100は、データ制御部112により、参照が要求されたデータを返却する。データ制御部112は、参照対象の行のフラグ(cache)が有効を示す場合には、その行のポインタ(ptr)で示される配置場所に存在するデータセットを使って、参照が要求されたデータを返却することができる。
一方、参照対象の行のフラグ(cache)が無効を示す場合、データ制御部112は、参照が要求されたデータは参照用テーブル201に存在しない(参照用テーブル201のデータは有効ではない)と判定する。この場合、データ要求部114が、その行のキーフィールド(rA,rB)に格納される主キー値(「2」,「1」)を絞り込み条件として指定したクエリを作成し、更新後のデータを含むデータセットを更新用テーブル202から取得する。データ要求部114は、参照対象の行のポインタ(ptr)を、取得したデータセットの配置場所を示す値に更新して、当該参照対象の行のフラグ(cache)を有効に更新する。そして、データ制御部112は、このデータセットを使って、参照が要求されたデータを返却する。
参照対象の行のキーフィールドに格納される主キー値を絞り込み条件として指定したクエリを作成することにより、参照時における、更新用テーブル202からの最新のデータセットの取得を迅速に行うことができる。
図24は、更新用テーブル202上で更新されている行と結合された(更新されていない)行の主キー値を絞り込み条件として指定する参照であって、その更新が、事前準備として取得したキー以外の変更である場合の一例を示している。
図24に示すように、ここでは、テーブルBの主キー(b0)値「1」が絞り込み条件として指定されている。このテーブルBの行番号(b0)「1」の行は、更新されていないが、この行が結合されるテーブルAの行番号(a0)「2」の行と行番号(a0)「3」の行とのうち、行番号(a0)「2」の行は、1つ目のフィールド(a1)が、「田中」から「里中」に更新されている。”a1”は、事前準備として取得したキー以外、つまり結合に関わるキーではないので、参照用テーブル201上では、その行のフラグ(cache)が無効に更新されていることになる。
参照対象の行のフラグ(cache)が無効を示すので、参照側データベースエンジン100は、図23を参照して説明した、更新用テーブル202上で更新されている行の主キー値を絞り込み条件として指定する参照であって、その更新が、事前準備として取得したキー以外の変更である場合と同様の処理を行うことになる。つまり、データ制御部112により、参照が要求されたデータは参照用テーブル201に存在しない(参照用テーブル201のデータは有効ではない)と判定され、データ要求部114が、その行のキーフィールド(rA,rB)に格納される主キー値(「2」,「1」)を絞り込み条件として指定したクエリを作成し、更新後のデータを含むデータセットを更新用テーブル202から取得する。
この場合も、参照対象の行のキーフィールドに格納される主キー値を絞り込み条件として指定したクエリを作成するので、参照時における、更新用テーブル202からの最新のデータセットの取得を迅速に行うことができる。
また、図25は、主キー値を絞り込み条件として指定する参照であって、参照用テーブル201が、当該主キー値の指定が有効な状態にない場合の一例を示している。絞り込み条件としての主キー値の指定が有効な状態に無い場合とは、その主キー値のキーフィールドに無効を示す値を格納する行が存在する場合であり、例えば、事前準備として取得したキーの変更となる更新用テーブル202の更新に伴って、行が追加された場合や、ある行の当該主キー値のキーフィールドが無効に更新された場合などが該当する。
図25に示すように、ここでは、テーブルBの主キー(b0)値「1」が絞り込み条件として指定されている。また、参照用テーブル201の行番号(rowid)「3」の行のテーブルB用のキーフィールド(rB)が無効を示していることから、そのキーフィールド(rB)に対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグが無効を示している。この行番号(rowid)「3」の行のテーブルB用のキーフィールド(rB)には、「1」が格納されているべきである可能性があり、このようなテーブルB用のキーフィールド(rB)が不定である行の有無を、当該テーブルB用のキーフィールド(rB)に対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグで即時に判定することができる。
この場合、参照側データベースエンジン100は、まず、データ制御部112が、参照が要求されたデータは参照用テーブル201に存在しない(参照用テーブル201のデータは有効ではない)と判定する。そして、データ要求部114が、参照要求で絞り込み条件として指定されたテーブルBの主キー(b0)値「1」を用いてクエリを作成し、当該参照要求で絞り込み条件として指定されたテーブルBの主キー(b0)値「1」に関わるデータセットを更新用テーブル202から取得する。参照要求で絞り込み条件として指定された主キー値を用いてクエリを作成することにより、参照時における、更新用テーブル202からのデータセットの取得を最小限に抑えることができる。
データ要求部114は、キーフィールド(rB)に主キー値「1」が格納され、フラグ(cache)が無効を示していた行については、ポインタ(ptr)を、取得したデータセットの配置場所を示す値に更新して、フラグ(cache)を有効に更新する。また、キーフィールド(rB)に無効を示す値が格納されており、かつ、そのキーフィールド(rB)には主キー値「1」が格納されているべきであった行については、さらに、当該キーフィールド(rB)に主キー値「1」を格納する。この際、キーフィールド(rB)に無効を示す値を格納する行が無くなった場合、データ要求部114は、そのキーフィールド(rB)に対応する、絞り込み条件としての主キー値の指定が有効な状態か否かのフラグを有効に更新する。
以上が、本データベースシステム1の参照用テーブル201の参照時における参照用テーブル201の更新手順である。
このように、本データベースシステム1は、更新用テーブル202の更新に伴う参照用テーブル201の更新を「参照側主導」で行うことを実現する。
図26は、更新側データベースエンジン100の参照用テーブル201の生成時の動作手順を示す図である。
更新側データベースエンジン100は、クエリを受け取ると(ブロックA1)、SQL文解析部121が、そのクエリが参照用テーブル201の生成を要求するものであるか否かを判定する(ブロックA2)。SQL文解析部121により、参照用テーブル201の生成を要求するクエリであると判定されると(ブロックA2のYES)、データ制御部122が、その参照用テーブル201のスキーマを作成する(ブロックA3)。更新通知部123は、データ制御部122により作成されたスキーマを、更新通知として参照側データベースエンジン100に送信する(ブロックA4)。
図27は、参照側データベースエンジン100の参照用テーブル201の生成時の動作手順を示す図である。
参照側データベースエンジン100は、更新通知としてスキーマを受信すると(ブロックB1)、データ変更部113が、このスキーマに基づき、図13に示した構成を持つ参照用テーブル201をメモリ115に作成する(ブロックB2)。
図28は、更新側データベースエンジン100の更新用テーブル202の更新時の動作手順を示す図である。
更新側データベースエンジン100は、クエリを受け取ると(ブロックC1)、SQL文解析部121が、そのクエリが更新用テーブル202の更新を要求するものであるか否かを判定する(ブロックC3)。SQL文解析部121により、更新用テーブル202の更新を要求するクエリであると判定されると(ブロックC3のYES)、更新対象の行の情報(更新行情報210)がメモリ124に格納される(ブロックC4)。
この更新に対するコミットを要求するクエリを受けると(ブロックC2のYES)、データ制御部122は、コミット処理を実行する(ブロックC6)。また、更新通知部123は、メモリ124に格納された更新行情報210に基づき、更新通知を参照側データベースエンジン100に送信する(ブロックC7)。
図29は、参照側データベースエンジン100の更新用テーブル202の更新時および参照要求の受け付け時の動作手順を示す図である。
参照側データベースエンジン100は、更新用テーブル202の更新通知を更新側データベースエンジン100から受けると(ブロックD1)、データ変更部113が、その通知内容に応じて、参照用テーブル201を変更する(ブロックD2)。この時の参照用テーブル201の変更とは、更新データの反映ではなく、参照時に更新データの反映が必要であることを記録するためのものである。
また、参照側データベースエンジン100は、データの参照を要求するクエリを受けた場合(ブロックD3)、SQL文解析部121が、その要求が参照用テーブル201を適用可能なものであるか否かを判定する(ブロックD4)。参照用テーブル201を適用可能なものであった場合(ブロックD4のYES)、データ制御部112は、参照対象のデータが参照用テーブル201に存在すれば(ブロックC5のNO)、そのデータを返却する(ブロックD8)。
一方、参照対象のデータが参照用テーブル201に存在しなかった場合(ブロックC5のYES)、データ要求部114が、参照用テーブル201の情報を使って、参照対象のデータを更新用テーブル202から取得する(ブロックC6)。データ変更部113は、データ要求部114により取得されたデータを参照用テーブル201に格納し(ブロックD7)、また、データ制御部112は、同データを返却する(ブロックD8)。
図30は、更新用テーブル202の更新に伴う参照用テーブル201の更新を「更新側主導」で行った場合と「参照側主導」で行った場合との処理量を比較する図であり、図31は、更新用テーブル202の更新に伴う参照用テーブル201の更新を「更新側主導」で行った場合と「参照側主導」で行った場合との所要時間を比較する図である。
図30および図31から明らかなように、更新用テーブル202の更新に伴う参照用テーブル201の更新に関する処理量および所要時間は、いずれも、「参照側主導」の方が「更新側主導」よりも格段に少ない。
このように、本データベースシステム1によれば、キャッシュテーブルを効率的に更新することが実現される。
(第2実施形態)
次に、第2の実施の形態について説明する。
図32は、本実施形態のデータベースシステム1における参照用テーブルの一構成例を示す図である。
図32に示すように、本データベースシステム1では、参照用テーブル201の各行のキャッシュが有効か否かのフラグを、さらにテーブル毎に持つ(cacheA,cacheB)。図32では、参照用テーブル201の行番号(rowid)「B」の行のテーブルAに関するフラグ(cacheA)が無効を示している。一方、この行のテーブルBに関するフラグ(cacheB)は有効を示している。つまり、テーブルAのデータとテーブルBのデータとが結合されたデータセット単位ではなく、更新用テーブル202のテーブル単位に有効か否かを管理する。まず、図33を参照して、本データベースシステム1の参照用テーブル201が図32に示す状態となる更新用テーブル202の更新時の動作手順を説明する。
図33に示すように、ここでは、テーブルAの行番号(a0)「2」の行の1つ目のフィールド(a1)が、「田中」から「里中」に更新されている。”a1”は、事前準備として取得したキー以外、つまり結合に関わるキーではない。この場合、更新側データベースエンジン100の更新通知部123は、この行のデータを無効とするための更新通知(Clear)を参照側データベースエンジン100に送信する。この更新通知には、テーブルAの行番号「2」を示す情報(A2)が含まれる。
一方、参照側データベースエンジン100は、この更新通知を受けると、データ変更部113が、テーブルA用のインデックスで参照用テーブル201の行番号を取得し、その行のテーブルA用のフラグ(cacheA)を無効に更新する。これにより、参照用テーブル201は、図32に示す状態となる。
次に、図34を参照して、参照用テーブル201が図32に示す状態、つまり参照用テーブル201の行番号(rowid)「B」の行のテーブルAに関するフラグ(cacheA)が無効を示している状態にある状況下において、この行のデータを参照する時の動作手順を説明する。
参照対象の行のいずれかのフラグ(cacheA,cacheB)が無効を示す場合、データ要求部114は、参照用テーブル201の生成要求に含まれるクエリの条件であって、参照要求のクエリに含まれる条件である「SELECT 名前、場所 FROM A,B WHERE a2=1 and a3=b0 and b2=’今’」のうち、フラグが無効のテーブル(ここでは、テーブルA)に関する絞り込み条件(a2=1)のみを適用し、また、そのテーブル用のキーフィールドに格納される主キー値を絞り込み条件として指定したクエリを作成する。これにより、フラグが無効を示すデータを迅速に取得することができる。データ変更部113は、その行のデータセットの中の当該データ部分のみを、取得されたデータで更新する。
このように、本データベースシステム1によれば、事前準備として取得した、結合に関わるキー以外の変更となる更新用テーブル202の更新に伴う参照用テーブル201の更新について、より一層の効率化を図ることが実現される。
(第3実施形態)
次に、第3の実施の形態について説明する。
図35は、本実施形態のデータベースシステム1における参照用テーブルの一構成例を示す図である。
図35に示すように、本データベースシステム1では、参照用テーブル201の各行について、データセットの配置場所を示すポインタを持つのではなく、更新用テーブル202のテーブル毎に、データセットを構成するデータ(同一テーブルの同一行から複数のフィールドのデータが抽出される場合は、当該複数のデータからなるデータセット)の配置場所を示すポインタを持つ(Aptr,Bptr)。このポインタ(Aptr,Bptr)は、キャッシュが有効か否かのフラグの役割を兼ねる。
テーブル形式でデータを格納する場合、異なる行のフィールドに同一のデータが格納されることが発生し得る。そこで、ポインタを更新用テーブル202のテーブル毎に持つことにより、このような場合であっても、その行数分、当該同一のデータを格納するための記憶領域を確保することを不要とし、重複の圧縮を実現する。
各実施形態の動作手順は、ソフトウェア(プログラム)によって実現することができるので、このソフトウェアを格納したコンピュータ読み取り可能な記憶媒体を通じてこのソフトウェアを通常のコンピュータにインストールして実行することにより、各実施形態と同様の効果を容易に実現することができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。