(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024144901
(43)【公開日】2024-10-15
(54)【発明の名称】データベース管理方法、データベース管理プログラムおよび情報処理装置
(51)【国際特許分類】
G06F 16/22 20190101AFI20241004BHJP
【FI】
G06F16/22
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2023057072
(22)【出願日】2023-03-31
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】山地 亮
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175CA07
5B175KA11
(57)【要約】
【課題】インデックス再構築の処理負荷を低減する。
【解決手段】処理部3は、追記型でレコードが更新されるデータベース10におけるツリー構造のインデックス11を再構築してツリー構造のインデックス12を作成するインデックス再構築処理を実行する。このインデックス再構築処理は、インデックス11のリーフノードに含まれる複数の第1レコードのうち、複数の有効レコードに基づき、インデックス12のリーフノードに含まれる、複数の有効レコードに応じた複数の第2レコードを作成し、複数の第2レコードの作成が完了した後、複数の第2レコードに基づいて、インデックス12におけるリーフノードより上位のノードに含まれる複数の第3レコードを作成するインデックス作成処理を含む。
【選択図】
図1
【特許請求の範囲】
【請求項1】
追記型でレコードが更新されるデータベースにおけるツリー構造の第1インデックスを再構築してツリー構造の第2インデックスを作成するインデックス再構築処理を、コンピュータが実行し、
前記インデックス再構築処理は、前記第1インデックスのリーフノードに含まれる複数の第1レコードのうち、複数の有効レコードに基づき、前記第2インデックスのリーフノードに含まれる、前記複数の有効レコードに応じた複数の第2レコードを作成し、前記複数の第2レコードの作成が完了した後、前記複数の第2レコードに基づいて、前記第2インデックスにおけるリーフノードより上位のノードに含まれる複数の第3レコードを作成するインデックス作成処理を含む、
データベース管理方法。
【請求項2】
前記インデックス作成処理の実行中において、前記第1インデックスの更新要求が発生すると、前記更新要求に基づいて前記第1インデックスを更新するとともに、更新内容を示す更新情報を記憶部に記録する、
処理を前記コンピュータが実行し、
前記インデックス再構築処理は、前記インデックス作成処理が完了した後、前記記憶部に記録された前記更新情報に基づいて前記第2インデックスを前記第1インデックスと整合させる処理を含む、
請求項1記載のデータベース管理方法。
【請求項3】
前記第2インデックスを整合させる処理では、前記更新情報に基づき、前記インデックス作成処理中に前記第1インデックスのリーフノードに追加されたレコードを、前記第2インデックスのリーフノードに追加する、
請求項2記載のデータベース管理方法。
【請求項4】
前記更新情報は揮発性記憶装置に記録され、
前記第2インデックスを整合させる処理では、前記更新情報が消失した場合、不揮発性記憶装置に記録された、トランザクションのログファイルに基づいて前記第2インデックスを前記第1インデックスと整合させる、
請求項2記載のデータベース管理方法。
【請求項5】
前記インデックス作成処理では、前記複数の第2レコードの作成が完了するまで、前記複数の第3レコードの作成を抑止する、
請求項1記載のデータベース管理方法。
【請求項6】
追記型でレコードが更新されるデータベースにおけるツリー構造の第1インデックスを再構築してツリー構造の第2インデックスを作成するインデックス再構築処理を、コンピュータに実行させ、
前記インデックス再構築処理は、前記第1インデックスのリーフノードに含まれる複数の第1レコードのうち、複数の有効レコードに基づき、前記第2インデックスのリーフノードに含まれる、前記複数の有効レコードに応じた複数の第2レコードを作成し、前記複数の第2レコードの作成が完了した後、前記複数の第2レコードに基づいて、前記第2インデックスにおけるリーフノードより上位のノードに含まれる複数の第3レコードを作成するインデックス作成処理を含む、
データベース管理プログラム。
【請求項7】
追記型でレコードが更新されるデータベースにおけるツリー構造の第1インデックスおよび第2インデックスを記憶する記憶部と、
前記第1インデックスを再構築して前記第2インデックスを作成するインデックス再構築処理を実行する処理部と、
を有し、
前記インデックス再構築処理は、前記第1インデックスのリーフノードに含まれる複数の第1レコードのうち、複数の有効レコードに基づき、前記第2インデックスのリーフノードに含まれる、前記複数の有効レコードに応じた複数の第2レコードを作成し、前記複数の第2レコードの作成が完了した後、前記複数の第2レコードに基づいて、前記第2インデックスにおけるリーフノードより上位のノードに含まれる複数の第3レコードを作成するインデックス作成処理を含む、
情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データベース管理方法、データベース管理プログラムおよび情報処理装置に関する。
【背景技術】
【0002】
データベース管理システムでは、膨大な量のデータを効率的に検索するためにインデックスが用いられる。インデックスとしては、例えば、B-treeのような木構造のインデックスが広く用いられている。
【0003】
インデックスを用いたデータベース管理に関しては、次のような提案がある。例えば、最初の1回だけ全ファイルをクロールしてインデックスを作成し、2回目からはイベントの対象となったファイルのみインデックス更新の対象とした全文検索システムが提案されている。また、インデックスファイルの更新を遅延更新モードで行う際に、スタック領域に格納されているインデックス更新情報の中から不要なものを除去するようにしたインデックス更新方式が提案されている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2008-305352号公報
【特許文献2】特開平8-328924号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
ところで、データベースの中には追記型アーキテクチャを用いてテーブルやインデックスが管理されるものがある。このようなデータベースでは、テーブルやインデックスの更新の際に、更新対象のレコードは削除されずに新たなレコードが追加される。このため、テーブルやインデックスのデータ量が増大しやすい。
【0006】
インデックスのデータ量を削減するための方法として、有効レコードだけを用いてインデックスを再構築する方法がある。しかし、インデックスの再構築は処理負荷が高いという問題がある。インデックス再構築の処理負荷が高い場合、例えば、クライアントアプリケーションからのデータベースに対するクエリの処理性能が低下してしまう。
【0007】
1つの側面では、本発明は、インデックス再構築の処理負荷を低減可能なデータベース管理方法、データベース管理プログラムおよび情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【0008】
1つの案では、追記型でレコードが更新されるデータベースにおけるツリー構造の第1インデックスを再構築してツリー構造の第2インデックスを作成するインデックス再構築処理を、コンピュータが実行するデータベース管理方法が提供される。このデータベース管理方法において、インデックス再構築処理は、第1インデックスのリーフノードに含まれる複数の第1レコードのうち、複数の有効レコードに基づき、第2インデックスのリーフノードに含まれる、複数の有効レコードに応じた複数の第2レコードを作成し、複数の第2レコードの作成が完了した後、複数の第2レコードに基づいて、第2インデックスにおけるリーフノードより上位のノードに含まれる複数の第3レコードを作成するインデックス作成処理を含む。
【0009】
また、1つの案では、上記のデータベース管理方法と同様の処理をコンピュータに実行させるデータベース管理プログラムが提供される。
さらに、1つの案では、上記のデータベース管理方法と同様の処理を実行する情報処理装置が提供される。
【発明の効果】
【0010】
1つの側面では、インデックス再構築の処理負荷を低減できる。
【図面の簡単な説明】
【0011】
【
図1】第1の実施の形態に係る情報処理装置の構成例および処理例を示す図である。
【
図2】第2の実施の形態に係るデータベースシステムの構成例を示す図である。
【
図3】DBサーバのハードウェア構成例を示す図である。
【
図4】DBサーバおよび業務サーバが備える処理機能の構成例を示す図である。
【
図5】インデックスファイルの構成例を示す図である。
【
図6】インデックス再構築の全体の処理手順を示すフローチャートの例である。
【
図7】インデックス作成処理の比較例を示すフローチャートである。
【
図8】インデックス最新化処理の比較例を示す図である。
【
図9】第2の実施の形態におけるインデックス作成処理例を示す図である。
【
図10】第2の実施の形態におけるインデックス最新化処理を説明するための図である。
【
図11】第2の実施の形態におけるインデックス作成処理手順を示すフローチャートの例である。
【
図12】第2の実施の形態におけるインデックス更新処理手順を示すフローチャートの例である。
【
図13】第2の実施の形態におけるインデックス最新化処理手順を示すフローチャートの例である。
【
図14】更新管理情報が消失した場合のインデックス最新化処理例を示す図である。
【発明を実施するための形態】
【0012】
以下、本発明の実施の形態について図面を参照して説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る情報処理装置の構成例および処理例を示す図である。
図1に示す情報処理装置1は、記憶部2と処理部3を有する。
【0013】
記憶部2は、情報処理装置1が備える記憶装置に確保される記憶領域である。記憶部2は、情報処理装置1の外部に接続された記憶装置に確保された記憶領域であってもよい。記憶部2には、データベース10とインデックス11,12が記憶される。データベース10は、追記型でレコードが更新されるリレーショナルデータベースである。インデックス11,12は、データベース10を検索するための情報であり、いずれもツリー構造を有する。データベース10と同様に、インデックス11,12も追記型でレコードが更新される。また、インデックス12は、処理部3によるインデックス11の再構築によって作成され、記憶部2に記憶される。
【0014】
処理部3は、例えばプロセッサである。処理部3は、例えば、DBMS(DataBase Management System)用のソフトウェアを実行することでデータベース10を管理する。処理部3は、インデックス11を再構築してインデックス12を作成するインデックス再構築処理を実行する。
【0015】
以下、インデックス再構築処理について説明する。まず、インデックス11の構成例について説明する。
上記のように、インデックス11はツリー構造を有する。
図1の例では、インデックス11は、リーフノードにページP1~P3を含み、中間ノードにページP4,P5を含み、ルートノードにページP6を含む。
【0016】
ページP1はレコードR1~R3を含み、ページP2はレコードR4,R5を含み、ページP3はレコードR6~R8を含む。レコードR1~R8には、例えばキーが記憶される。ページP4は、ページP1,P2に対する上位ノードであり、ページP1を管理するためのレコードR11と、ページP2を管理するためのレコードR12を含む。ページP5は、ページP3に対する上位ノードであり、ページP3を管理するためのレコードR13を含む。ページP6は、ページP4,P5に対する上位ノードであり、ページP4を管理するためのレコードR21と、ページP5を管理するためのレコードR22を含む。
【0017】
インデックス11には、追記型でレコードが更新される。例えば、処理部3は、インデックス11内のあるレコードの更新が要求されると、そのレコードを削除せずに新たなレコードをインデックス11に追加する。処理部3は、更新前のレコードに対して、無効化されたことを示す削除マークを付加する。
【0018】
このような追記型の処理のため、インデックス11が更新されるたびにインデックス11のデータサイズは大きくなり、インデックス11には削除マークが付加された無効レコードが蓄積されていく。インデックス11の肥大化を抑止するために、処理部3は、インデックス11から削除マークが付加されていない有効レコードだけを抽出して新たなインデックス12を作成するインデックス再構築処理を実行する。インデックス再構築処理では、処理部3は、新たなインデックス12を作成し、作成されたインデックス12をデータベース10の検索のためのインデックスとして設定し直し、元のインデックス11を削除してインデックス11のレコードを再利用可能な状態にする。
【0019】
ここで、新たなインデックス12の作成処理は、例えば次のような手順で実行可能である。処理部3は、インデックス11のリーフノードから有効レコードを1つ選択し、そのレコードをインデックス12のリーフノードにコピーする。処理部3は、インデックス12において、コピーされたレコードに対応する上位ノードのレコードを作成する。処理部3は、このような処理をインデックス11のリーフノードの有効レコードごとに繰り返す。しかし、このような手順では、記憶部2における離散的な領域に対するアクセス回数が多くなり、処理負荷が大きく、処理にかかる時間も長くなるという問題がある。このような処理負荷の増大は、例えば、クライアントアプリケーションからのデータベース10に対するクエリの処理性能の低下を招く。
【0020】
このような問題に対して、本実施の形態において、処理部3は次のような手順でインデックス12を作成する。処理部3はまず、インデックス11のリーフノードに含まれる複数のレコードのうち、複数の有効レコードに基づき、インデックス12のリーフノードに含まれる、複数の有効レコードに応じた複数のレコードを作成する。すなわち、作成された複数のレコードには、複数の有効レコードの内容がそれぞれコピーされる。これらのレコード作成が完了した後、処理部3は、作成されたレコードに基づいて、インデックス12におけるリーフノードより上位のノードに含まれる複数のレコードを作成する。
【0021】
このような手順によれば、最初にリーフノードに含まれる複数のレコードだけが作成されるので、この作成処理中では記憶部2における連続的な記憶領域にアクセスが行われるようになる。その結果、インデックス12の作成処理負荷を低減することができ、作成処理にかかる時間も短縮することができる。
【0022】
図1の例では、処理部3は、インデックス11のページP1~P3のうち、有効レコードであるレコードR1,R3~R5,R7,R8に基づいて、インデックス12のリーフノードのレコードを作成する(ステップS1)。インデックス12では、ページP1からコピーされたレコードR1,R3を含むページP11と、ページP2からコピーされたレコードR4,R5を含むページP12と、ページP3からコピーされたレコードR7,R8を含むページP13がリーフノードに作成される。これらのリーフノードのレコード作成が完了するまでの間、それより上位のノードにおけるレコードの作成は抑止される。
【0023】
そして、インデックス11のリーフノードのレコード作成が完了した後、処理部3は、上位ノードのレコードを作成する。具体的には、処理部3は、ページP11,P12に対応する上位ノードとしてページP14を定義する。処理部3は、ページP11のレコードR1,R3に基づいてページP14に含まれるレコードR31を作成し、ページP12のレコードR4,R5に基づいてページP14に含まれるレコードR32を作成する。また、処理部3は、ページP13に対応する上位ノードとしてページP15を定義し、ページP13のレコードR7,R8に基づいてページP15に含まれるレコードR33を作成する。さらに、処理部3は、ページP14,P15に対応する上位ノードとしてページP16を定義する。処理部3は、ページP14のレコードR31,R32に基づいてページP16に含まれるレコードR41を作成し、ページP15のレコードR33に基づいてページP16に含まれるレコードR42を作成する。
【0024】
このような手順によれば、最初にリーフノードに含まれるレコードR1,R3~R5,R7,R8だけが作成されるので、この作成処理中では記憶部2における連続的なアクセスが行われるようになる。その結果、インデックス12の作成処理負荷を低減することができ、作成処理にかかる時間も短縮することができる。
【0025】
なお、実際のインデックス再構築処理では、上記手順によるインデックス12の作成処理に続いて、インデックス12の最新化処理が実行される場合がある。例えば、上記手順によるインデックス12の作成処理中に元のインデックス11に対する更新を受け付けている場合には、インデックス12の作成処理中に反映されなかったインデックス11の更新内容が、インデックス12に対して反映される。
【0026】
〔第2の実施の形態〕
次に、追記型アーキテクチャが採用されたDBMSとして、PostgreSQL(Structured Query Language)を例示して説明する。
【0027】
図2は、第2の実施の形態に係るデータベースシステムの構成例を示す図である。
図2に示すデータベースシステムは、DB(データベース)サーバ100と業務サーバ200を含む、DBサーバ100と業務サーバ200とは、ネットワーク210を介して接続されている。
【0028】
DBサーバ100は、DBMSが稼働するサーバコンピュータである。DBサーバ100は、データベースを管理し、データベースを操作するためのクエリをクライアントアプリケーションから受け付け、クエリに応じた処理を実行する。本実施の形態では、DBサーバ100は、PostgreSQLを用いてデータベースを管理する。
【0029】
業務サーバ200は、業務アプリケーションを実行するサーバコンピュータである。業務アプリケーションは、DBサーバ100に対するクライアントアプリケーションの一例であり、DBサーバ100にクエリを送信してデータベースを操作する。
【0030】
図3は、DBサーバのハードウェア構成例を示す図である。DBサーバ100は、例えば、
図3に示すようなコンピュータとして実現される。
図3に示すDBサーバ100は、プロセッサ101、RAM(Random Access Memory)102、HDD(Hard Disk Drive)103、GPU(Graphics Processing Unit)104、入力インタフェース(I/F)105、読み取り装置106およびネットワークインタフェース(I/F)107を備える。
【0031】
プロセッサ101は、DBサーバ100全体を統括的に制御する。プロセッサ101は、例えば、CPU(Central Processing Unit)、MPU(Micro Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)またはPLD(Programmable Logic Device)である。また、プロセッサ101は、CPU、MPU、DSP、ASIC、PLDのうちの2以上の要素の組み合わせであってもよい。なお、プロセッサ101は、
図1に示した処理部3の一例である。
【0032】
RAM102は、DBサーバ100の主記憶装置として使用される。RAM102には、プロセッサ101に実行させるOS(Operating System)プログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM102には、プロセッサ101による処理に必要な各種データが格納される。
【0033】
HDD103は、DBサーバ100の補助記憶装置として使用される。HDD103には、OSプログラム、アプリケーションプログラム、および各種データが格納される。なお、HDD103は、
図1に示した記憶部2の一例である。また、補助記憶装置としては、SSD(Solid State Drive)などの他の種類の不揮発性記憶装置を使用することもできる。
【0034】
GPU104には、表示装置104aが接続されている。GPU104は、プロセッサ101からの命令にしたがって、画像を表示装置104aに表示させる。表示装置104aは、例えば、液晶ディスプレイまたは有機EL(ElectroLuminescence)ディスプレイである。
【0035】
入力インタフェース105には、入力装置105aが接続されている。入力インタフェース105は、入力装置105aから出力される信号をプロセッサ101に送信する。入力装置105aとしては、キーボードやポインティングデバイスなどを用いることができる。ポインティングデバイスとしては、マウス、タッチパネル、タブレット、タッチパッド、トラックボールなどを用いることができる。
【0036】
読み取り装置106には、可搬型記録媒体106aが脱着される。読み取り装置106は、可搬型記録媒体106aに記録されたデータを読み取ってプロセッサ101に送信する。可搬型記録媒体106aとしては、光ディスク、半導体メモリなどがある。
【0037】
ネットワークインタフェース107は、ネットワーク210を介して業務サーバ200などの他の装置との間でデータの送受信を行う。
以上のようなハードウェア構成によって、DBサーバ100の処理機能を実現することができる。なお、業務サーバ200も、
図3のようなハードウェア構成によって実現することが可能である。
【0038】
図4は、DBサーバおよび業務サーバが備える処理機能の構成例を示す図である。
まず、業務サーバ200は、業務処理を実行する業務アプリケーション201を備える。業務アプリケーション201の処理は、業務サーバ200が備えるプロセッサが所定のアプリケーションプログラムを実行することで実現される。なお、業務アプリケーション201は、DBサーバ100に対応するクライアントアプリケーションの一例である。
【0039】
DBサーバ100は、共有メモリ部110、データ記憶部120、サーバ処理部131、インデックス再構築部132およびWAL(Write Ahead Logging)書き込み部133を備える。
【0040】
共有メモリ部110は、RAM102など、DBサーバ100が備える揮発性記憶装置に確保される記憶領域であり、サーバ処理部131やインデックス再構築部132によって共有される。共有メモリ部110には、更新管理情報111が格納される。更新管理情報111には、インデックス再構築処理における新インデックス作成処理中に旧インデックスファイルに対して行われた更新の内容が示す情報が書き込まれる。
【0041】
データ記憶部120は、HDD103など、DBサーバ100が備える不揮発性記憶装置に確保される記憶領域である。また、データ記憶部120は、DBサーバ100の外部に接続された不揮発性記憶装置に確保される記憶領域であってもよい。データ記憶部120には、テーブルファイル121a,121b,・・・、インデックスファイル122a,122b,・・・およびWALファイル123が格納される。
【0042】
テーブルファイル121a,121b,・・・は、それぞれ個別のテーブルのデータを含む。インデックスファイル122a,122b,・・・は、それぞれ個別のインデックスのデータを含む。WALファイル123には、テーブルファイル121a,121b,・・・およびインデックスファイル122a,122b,・・・におけるトランザクションログが書き込まれる。
【0043】
サーバ処理部131、インデックス再構築部132およびWAL書き込み部133の処理は、例えば、プロセッサ101が所定のプログラムを実行することで実現される。
サーバ処理部131は、業務アプリケーション201からデータベースを操作するためのクエリを受信し、クエリに応じた処理を実行する。サーバ処理部131は、データベースに対するデータの挿入や更新が要求された場合、インデックスファイル122a,122b,・・・を更新し得る。なお、サーバ処理部131は、Postgreインスタンスの「サーバプロセス」を実行する処理機能として実装される。
【0044】
インデックス再構築部132は、インデックスファイルの有効レコードを用いて新規のインデックスファイルを作成するインデックス再構築処理を実行する。
WAL書き込み部133は、テーブルファイル121a,121b,・・・やインデックスファイル122a,122b,・・・の操作を含むトランザクションがコミットすると、トランザクションの内容を示すログをWALファイルに書き込む。
【0045】
なお、インデックス再構築部132およびWAL書き込み部133は、Postgreインスタンスの「ワーカプロセス」を実行する処理機能として実装される。
図5は、インデックスファイルの構成例を示す図である。PostgreSQLでは、インデックスごとに1つのファイル(インデックスファイル)が作成される。
図5に示すインデックスファイル122は、上記のインデックスファイル122a,122b,・・・の一例である。また、本実施の形態では、インデックスファイル122はB-treeとして形成され、リーフノード、中間ノードおよびルートノードの3階層構造を有する。リーフノードのページ(リーフページ)、中間ノードのページ(中間ページ)およびルートノードのページ(ルートページ)には、1以上のレコードが格納される。
【0046】
図5の例では、インデックスファイル122は、リーフノードにリーフページ141a,141bを少なくとも含み、中間ノードに中間ページ142a,142bを含み、ルートノードにルートページ143を含む。リーフページ141aは、キーとしてkey1~key3をそれぞれ含むレコードを含む。リーフページ141bは、キーとしてkey101~key103を含むレコードを含む。中間ページ142aは、リーフページ141aの上位ノードとなっており、リーフページ141aに対するポインタが書き込まれたレコードを含む。中間ページ142bは、リーフページ141bの上位ノードとなっており、リーフページ141bに対するポインタが書き込まれたレコードを含む。ルートページ143は、中間ページ142aに対するポインタが書き込まれたレコードと、中間ページ142bに対するポインタが書き込まれたレコードを含む。
【0047】
ところで、PostgreSQLでは追記型アーキテクチャが採用されている。インデックスファイルのレコードが更新される場合、更新対象のレコードは削除されずに新たなレコードがインデックスファイルに追加される。このとき、更新前のレコードには無効化されたことを示す削除マークが付加される。
【0048】
このような追記型の処理が行われるため、更新のたびにインデックスファイルには削除マークが付加された無効レコードが蓄積されていき、インデックスファイルのデータサイズは大きくなっていく。インデックスファイルの肥大化は、記憶容量を圧迫するという課題があり、SQL性能を低下させる可能性がある。
【0049】
PostgreSQLでは、インデックスファイルの肥大化を抑止するために、HOT(Heap-Only Tuples)やバキューム(VACUUM)といった機能が実装されている。HOTは、インデックスファイルのキーを更新しない場合には、参照先の変更のみ実施し、インデックスファイルを直接更新しないようにする機能である。バキュームは、無効レコードを回収し、無効レコードの記憶領域を再利用可能な状態にする機能である。さらに、無効レコードの発生状況などを示す統計情報を収集し、統計情報に基づいてバキューム処理を自動実行するオートバキューム(AUTOVACUUM)も実装されている。
【0050】
しかし、このような機能を用いてもインデックスファイルの肥大化を確実に防止できるとはいえない。インデックスファイルの肥大化を確実に防止するためには、データベースの管理者の操作によって、あるいはインデックスファイルの肥大化や断片化の発生状況の自動解析結果に応じて、インデックス再構築(REINDEX)が適宜実行されることが望ましい。
【0051】
図6は、インデックス再構築の全体の処理手順を示すフローチャートの例である。
[ステップS11]インデックス再構築部132は、新規のインデックスファイル(以下、「新インデックスファイル」と記載する)を定義する。
【0052】
[ステップS12]インデックス再構築部132は、再構築対象のインデックスファイル(以下、「旧インデックスファイル」と記載する)に含まれる有効レコードを用いて、新インデックスファイルの各レコードを作成する。
【0053】
[ステップS13]このステップの処理は、ステップS12のインデックス作成処理中に旧インデックスファイルの更新を許容する場合に実行される。インデックス再構築部132は、現時点での旧インデックスファイルと新インデックスファイルとの差分を検出し、差分を新インデックスファイルに反映させる。これにより、新インデックスファイルが最新化され、旧インデックスファイルとの間の整合がとられる。
【0054】
[ステップS14]インデックス再構築部132は、新インデックスファイルを、対応するデータベース(テーブルファイル)を検索するための新規の参照先として登録する。また、インデックス再構築部132は、旧インデックスファイルを当該データベースを検索するための参照先から除外する。
【0055】
[ステップS15]インデックス再構築部132は、旧インデックスファイルを削除し、旧インデックスファイルに含まれるレコードを再利用可能な状態にする。
ここで、PostgreSQLでは、クライアントアプリケーションからのデータベースの操作をインデックス再構築処理中にも可能とする「REINDEX CONCURRENTLY」という機能がある。REINDEX CONCURRENTLYでは、ステップS12のインデックス作成処理中に旧インデックスファイルの更新が要求されると、旧インデックスファイルと新インデックスファイルの両方の更新が行われる。
【0056】
以下、
図7、
図8を用いて、REINDEX CONCURRENTLYを用いた場合のインデックス作成処理およびインデックス最新化処理の比較例について説明する。
図7は、インデックス作成処理の比較例を示すフローチャートである。
図7の処理は、
図6のステップS12の処理に対応する。
【0057】
[ステップS21]インデックス再構築部132は、旧インデックスファイルのリーフページに含まれる有効レコードを1つ選択し、選択した有効レコードのコピーを新インデックスファイルのリーフページに対して挿入する。
【0058】
[ステップS22]インデックス再構築部132は、ステップS21での挿入先ページに対応する上位ノード(中間ノードおよびルートノード)に、レコードを作成する。実際には例えば、ステップS21において新インデックスファイルに新規に作成されたリーフページにレコードが挿入された場合に、当該リーフページに対応する中間ページに当該リーフページを指し示すレコードが作成されてもよい。また、このレコードの作成先が新規に作成された中間ページである場合に、当該中間ページを指し示すレコードがルートページに作成されてもよい。
【0059】
[ステップS23]インデックス再構築部132は、旧インデックスファイルのリーフページに含まれる有効レコードのコピーをすべて新インデックスファイルに挿入済みかを判定する。コピーを挿入済みでない有効レコードがある場合、処理がステップS21に進められ、挿入済みでない有効レコードが1つ選択される。一方、すべての有効レコードのコピーが挿入済みの場合、インデックス作成処理が終了される。
【0060】
以上の処理により、無効レコードを含まない、旧インデックスファイルよりデータサイズが縮小された新インデックスファイルが作成される。また、上記の処理手順によれば、新インデックスファイルの木構造を常に保持した状態(リーフノードに追加されたレコードをルートノードから探索可能な状態)で新インデックスファイルの作成処理が実行される。このため、クライアントアプリケーションから旧インデックスファイルの更新が要求された場合に、旧インデックスファイルと新インデックスファイルの両方を更新することが可能となる。
【0061】
ただし、次のケースでは旧インデックスファイルのみ更新可能で、新インデックスファイルを更新できない。1つは、レコードのコピー処理(ステップS21)が実行中のページに対して更新が発生したケースである。他の1つは、新インデックスファイルに対するレコードのコピーが完了していないページに対して更新が発生したケースである。このようなケースでは更新内容が新インデックスファイルに反映されないので、インデックス作成処理が完了した後に新インデックスファイルを最新化する処理が必要となる。
【0062】
図8は、インデックス最新化処理の比較例を示す図である。
図8の処理は、
図6のステップS13の処理に対応する。
図8は、旧インデックスファイル122-1を再構築して新インデックスファイル122-2を作成する例を示している。旧インデックスファイル122-1は、
図5と同様のデータ構造を有しているものとする。また、
図7の手順により、新インデックスファイル122-2では、リーフページ151aにリーフページ141aの有効レコードがコピーされ、リーフページ151bにリーフページ141bの有効レコードがコピーされたとする。ただし、リーフページ141bのレコード141b1は、インデックス再構築処理において新インデックスファイル122-2に反映されなかったとする。
【0063】
なお、新インデックスファイル122-2には、中間ページ152a,152bとルートページ153が作成される。中間ページ152aには、リーフページ151aを指し示すレコードが少なくとも書き込まれ、中間ページ152bには、リーフページ151bを指し示すレコードが少なくとも書き込まれる。ルートページ153には、中間ページ152aを指し示すレコードと、中間ページ152bを指し示すレコードが書き込まれる。
【0064】
図7の手順で新インデックスファイル122-2が作成されると、インデックス再構築部132は次のような手順で新インデックスファイル122-2を最新化する。インデックス再構築部132は、旧インデックスファイル122-1のリーフノードをフルスキャンして有効レコードを読み出す。また、インデックス再構築部132は、新インデックスファイル122-2のリーフノードをフルスキャンしてレコードを読み出す。
【0065】
インデックス再構築部132は、旧インデックスファイル122-1および新インデックスファイル122-2のそれぞれから読み出したレコード同士を突き合わせて、差分レコードを抽出する。この突き合わせでは、例えば、レコードに記録された、テーブルファイル内のデータレコードに対するポインタを示すTID(Tuple ID)が比較される。
図8の例では、レコード141b1が新インデックスファイル122-2に存在しないことが検出されるので、インデックス再構築部132は、レコード141b1を新インデックスファイル122-2のリーフページ151bにコピーする。
【0066】
以上の比較例では、次のような問題がある。
図7に示したインデックス作成処理では、ステップS21~S23のループ処理が、旧インデックスファイル122-1のリーフノードの有効レコードごとに繰り返される。この処理では、リーフノードのレコードに対するアクセスとそれより上位のノードのレコードに対するアクセスとが繰り返されることになり、記憶装置の離散的な領域に対するアクセス回数が多くなる。このため、処理負荷が大きく、処理にかかる時間も長くなるという問題がある。このような処理負荷の増大は、例えば、クライアントアプリケーションからのクエリの処理性能の低下を招く。
【0067】
また、
図8に示したインデックス最新化処理では、差分レコードの抽出のために、新旧両方のインデックスファイルにおいてリーフノードがフルスキャンされる。このため、差分レコードの抽出のために読み出されるデータ量が多くなり、その分だけ処理負荷が大きく、処理にかかる時間も長くなるという問題がある。
【0068】
さらに、上記の比較例では、クライアントアプリケーションからインデックス更新が要求された場合に、旧インデックスファイルと新インデックスファイルの両方が更新される。このため、旧インデックスファイルのみ更新される場合と比較して、クエリに対する応答時間が長くなる。その結果、クライアントアプリケーションの処理(本実施の形態では業務処理)の速度が低下する可能性がある。例えば、ミッションクリティカルな業務処理では、クエリに対する応答性能の低下を許容できない場合がある。
【0069】
一方、クライアントアプリケーションからのインデックス更新要求に対して旧インデックスファイルのみ更新するようにした場合には、インデックス作成処理中に旧インデックスファイルと新インデックスファイルとの間で差分レコードが発生しやすくなる。このため、インデックス作成処理の完了後のインデックス最新化処理において、新インデックスファイルに反映すべきレコード数が増大し、インデックス最新化処理にかかる時間が一層長くなり得るという問題がある。
【0070】
このような問題点に対し、本実施の形態では、クライアントアプリケーションからインデックス更新が要求された場合に旧インデックスファイルのみ更新するようにした上で、以下のような方法でインデックス作成処理およびインデックス最新化処理の負荷を低減する。
【0071】
図9は、第2の実施の形態におけるインデックス作成処理例を示す図である。
図9の処理は、
図6のステップS12の処理に対応する。また、以下の説明では、旧インデックスファイル122-1を再構築して新インデックスファイル122-3が作成されるものとする。
【0072】
インデックス再構築部132はまず、旧インデックスファイル122-1のリーフノードに含まれるすべての有効レコードを、新インデックスファイル122-3のリーフノードにコピーする。これにより、新インデックスファイル122-3のすべてのリーフノードを作成する。
図9の例では、旧インデックスファイル122-1のリーフページ141aに含まれる有効レコードが、新インデックスファイル122-3のリーフページ161aにコピーされる。また、旧インデックスファイル122-1のリーフページ141bに含まれる有効レコードが、新インデックスファイル122-3のリーフページ161bにコピーされる。ただし、リーフページ141bのレコード141b1(
図8参照)は、インデックス作成処理中に旧インデックスファイル122-1に追加されたために、新インデックスファイル122-3にはコピーされなかったとする。
【0073】
以上のようにリーフノードの作成が完了すると、インデックス再構築部132は次に、作成されたリーフノードの各レコードに基づいて新インデックスファイル122-3の中間ノードのデータを作成する。
図9では例えば、リーフページ161aの上位ノードに中間ページ162aが作成され、リーフページ161aを指し示すレコードが中間ページ162aに書き込まれる。また、リーフページ161bの上位ノードに中間ページ162bが作成され、リーフページ161bを指し示すレコードが中間ページ162bに書き込まれる。
【0074】
以上のように中間ノードの作成が完了すると、インデックス再構築部132は次に、作成された中間ノードの各レコードに基づいて新インデックスファイル122-3のルートノードのデータを作成する。
図9では、ルートノードにルートページ163が作成され、中間ページ162aを指し示すレコードと、中間ページ162bを指し示すレコードがルートページ163に書き込まれる。
【0075】
このような手順によれば、最初に、新インデックスファイル122-3のリーフノードに含まれるレコードだけが作成され、その作成中には上位ノードの作成が抑止される。このようなリーフノードのレコード作成では、記憶装置の連続的な記憶領域にアクセスが行われるようになる。その結果、
図7に示した比較例より、インデックス作成の処理負荷を低減でき、その処理時間も短縮できる。
【0076】
ここで、前述のように本実施の形態では、上記のインデックス作成処理中にクライアントアプリケーションからインデックス更新が要求された場合には、旧インデックスファイル122-1のみ更新され、新インデックスファイル122-3は更新されない。このため、インデックス作成処理が完了した時点で、旧インデックスファイル122-1と新インデックスファイル122-3との間で差分レコードが発生し得る。
図9の手順によるインデックス作成処理時間の短縮は、このような差分レコードの発生数を抑制する効果も生み出す。
【0077】
しかし、クライアントアプリケーションからの更新要求に応じて新旧の両方のインデックスファイルを更新する上記比較例に比べると、差分レコードの発生数は増加する可能性が高く、差分レコード発生数の抑制効果は十分とはいえない。そこで、本実施の形態のDBサーバ100は、次の
図10に示すような処理により、インデックス最新化処理にかかる時間を
図8に示した比較例より短縮させる。これにより、差分レコードの発生数が増加した場合でも、インデックス再構築処理の全体にかかる時間が長期化することを抑制する。
【0078】
図10は、第2の実施の形態におけるインデックス最新化処理を説明するための図である。
図10の初期状態では、旧インデックスファイル122-1を基に新インデックスファイル122-3を作成する処理が実行中であるとする。この状態から、状態1では、旧インデックスファイル122-1に含まれるkey1を更新する要求がクライアントアプリケーションから発生したとする。この場合、サーバ処理部131は、旧インデックスファイル122-1に含まれるkey1を更新し、新インデックスファイル122-3の更新を抑止する。これとともに、サーバ処理部131は、共有メモリ部110に格納されている更新管理情報111に対して、key1を更新したことを示す更新情報111aを登録する。
【0079】
また、状態2では、旧インデックスファイル122-1に含まれるkey2を更新する要求がクライアントアプリケーションから発生したとする。この場合、サーバ処理部131は、旧インデックスファイル122-1に含まれるkey2を更新し、新インデックスファイル122-3の更新を抑止する。これとともに、サーバ処理部131は、共有メモリ部110に格納されている更新管理情報111に対して、key2を更新したことを示す更新情報111bを登録する。
【0080】
そして、状態3では、インデックス作成処理が完了したとする。すると、インデックス再構築部132は、更新管理情報111を参照して新インデックスファイル122-3の最新化処理を実行する。状態3では、更新管理情報111に更新情報111a,111bが登録されている。インデックス再構築部132は、更新情報111aに基づいてkey1の更新を新インデックスファイル122-3に反映させる。また、インデックス再構築部132は、更新情報111bに基づいてkey2の更新を新インデックスファイル122-3に反映させる。
【0081】
例えば、インデックス作成処理中に旧インデックスファイル122-1のリーフノードにレコード141b1(
図8参照)が追加されたとする。この場合、レコード141b1が追加されたことを示す更新情報(例として更新情報111aとする)が更新管理情報111に登録される。そして、インデックス最新化処理では、更新情報111aに基づいて、新インデックスファイル122-3のリーフノードにレコード141b1が追加される。
【0082】
このように、インデックス再構築部132は、インデックス作成処理が完了したとき、この作成処理の間に更新管理情報111に登録された更新情報を読み取るだけで、差分レコードを認識し、インデックス最新化処理を実行可能になる。更新情報は旧インデックスファイル122-1の更新が要求された場合にのみ登録されるので、旧インデックスファイル122-1および新インデックスファイル122-3のそれぞれのリーフノードに含まれるレコード数より明らかに少ない。このため、新旧両方のインデックスファイルのリーフノードをフルスキャンする
図8の処理と比較して、差分レコードを認識するために読み出すデータ量を大幅に縮小できる。その結果として、インデックス作成処理にかかる時間を短縮できる。
【0083】
したがって、クライアントアプリケーションからの更新要求に対して旧インデックスファイル122-1のみ更新することで差分レコード数が増加した場合でも、インデックス作成処理時間の短縮により、インデックス再構築処理の全体にかかる時間の長期化を抑制できる。
【0084】
次に、本実施の形態におけるインデックス作成処理およびインデックス最新化処理について、フローチャートを用いて説明する。
図11は、第2の実施の形態におけるインデックス作成処理手順を示すフローチャートの例である。
図11の処理は、
図6のステップS12の処理に対応する。
【0085】
[ステップS31]インデックス再構築部132は、旧インデックスファイルのリーフページから有効レコードを1つ選択する。インデックス再構築部132は、選択した有効レコードのコピーを、新インデックスファイルのリーフページに挿入する。
【0086】
[ステップS32]インデックス再構築部132は、旧インデックスファイルのリーフページに含まれる有効レコードのコピーをすべて挿入済みかを判定する。コピーを挿入済みでない有効レコードがある場合、処理がステップS31に進められ、挿入済みでない有効レコードが選択される。一方、該当するすべての有効レコードのコピーを挿入済みである場合、処理がステップS33に進められる。
【0087】
[ステップS33]インデックス再構築部132は、新インデックスファイルのリーフページを1つ選択する。インデックス再構築部132は、選択したリーフページを管理する中間ページのレコードを作成する。このレコードには少なくとも、選択したリーフページを指し示すポインタが登録される。
【0088】
[ステップS34]インデックス再構築部132は、新インデックスファイルの中間ページに含まれる、リーフページを管理するためのレコードをすべて作成済みかを判定する。未作成のレコードがある場合、処理がステップS33に進められ、未作成のレコードの下位ノードに対応するリーフページが1つ選択される。一方、該当するすべてのレコードを作成済みの場合、処理がステップS35に進められる。
【0089】
[ステップS35]インデックス再構築部132は、新インデックスファイルの中間ページを1つ選択する。インデックス再構築部132は、選択した中間ページを管理するルートページのレコードを作成する。このレコードには少なくとも、選択した中間ページを指し示すポインタが登録される。
【0090】
[ステップS36]インデックス再構築部132は、新インデックスファイルのルートページに含まれる、中間ページを管理するためのレコードをすべて作成済みかを判定する。未作成のレコードがある場合、処理がステップS35に進められ、未作成のレコードの下位ノードに対応する中間ページが1つ選択される。一方、該当するすべてのレコードを作成済みの場合、インデックス作成が終了する。
【0091】
図12は、第2の実施の形態におけるインデックス更新処理手順を示すフローチャートの例である。
[ステップS41]サーバ処理部131は、クライアントアプリケーションからのデータベースの操作要求に伴ってインデックスの更新要求が発生すると、インデックスファイルの定義情報に基づいて、更新対象のインデックスファイルを特定する。
【0092】
[ステップS42]サーバ処理部131は、特定されたインデックスファイルを更新する。
[ステップS43]サーバ処理部131は、特定されたインデックスファイルについてのインデックス作成処理が実行中であるかを判定する。インデックス作成処理が実行中である場合、処理がステップS44に進められ、インデックス作成処理が実行されていない場合、インデックス更新処理が終了する。
【0093】
[ステップS44]サーバ処理部131は、ステップS42でのインデックスファイル(旧インデックスファイル)の更新内容を示す更新情報を、共有メモリ部110に格納された更新管理情報111に書き込む。
【0094】
図13は、第2の実施の形態におけるインデックス最新化処理手順を示すフローチャートの例である。
図13の処理は、
図6のステップS13の処理に対応する。すなわち、ステップS12のインデックス作成処理(
図11の処理)が完了すると、
図13の処理が開始される。
【0095】
[ステップS51]インデックス再構築部132は、更新管理情報111を参照し、旧インデックスファイルに対応する更新情報があるかを判定する。該当する更新情報がある場合、処理がステップS52に進められ、該当する更新情報がない場合、インデックス最新化処理が終了する。
【0096】
[ステップS52]インデックス再構築部132は、旧インデックスファイルに対応する更新情報の中から1つを選択する。インデックス再構築部132は、選択した更新情報に基づいて、新インデックスファイルにレコードを作成する。インデックス再構築部132は、レコード作成が完了すると、選択した更新情報を更新管理情報111から削除する。その後、処理がステップS51に進められる。
【0097】
なお、クライアントアプリケーションからの要求に応じた旧インデックスファイルの更新速度が、インデックス最新化処理における新インデックスファイルに対する更新内容の反映速度より高速になる可能性がある。この場合、インデックス再構築部132は、例えば、インデックス最新化のプロセスを多重実行して、新インデックスファイルに対する更新内容の反映速度を高速化してもよい。
【0098】
例えば、インデックス再構築部132は、更新管理情報111に登録された、旧インデックスファイルに対応する更新情報のサイズ(更新情報の数)を算出する。これとともに、インデックス再構築部132は、更新情報を基に更新内容を新インデックスファイルに反映するのにかかる時間を算出する。そして、インデックス再構築部132は、算出されたサイズと時間とを基に、新インデックスファイルに対する更新内容の反映速度V1を算出する。また、インデックス再構築部132は、更新管理情報111に対する旧インデックスファイルに対応する更新情報の書き込み発生の時間間隔を基に、クライアントアプリケーションからの要求による旧インデックスファイルの更新速度V2を算出する。そして、インデックス再構築部132は、V2>V1の場合に、{(V2/V1)×所定の係数}で算出される数だけのインデックス最新化のプロセスを生成し、これらのプロセスを並列実行する。
【0099】
ところで、上記の更新管理情報111は、揮発性記憶装置に確保される共有メモリ部110に格納される。このため、DBサーバ100の障害発生や停電発生によって、更新管理情報111が消失してしまう可能性がある。このような事態が発生した場合、インデックス再構築部132は、WALファイル123を参照して旧インデックスファイルと新インデックスファイルとの間の差分レコードを特定し、新インデックスファイルを最新化する。
【0100】
図14は、更新管理情報が消失した場合のインデックス最新化処理例を示す図である。
WAL書き込み部133は、データベースの操作を含むトランザクションがコミットすると、トランザクションの内容を示すログをWALファイル123に書き込む。
図14に示すように、このようなログは、クライアントアプリケーションからの要求に応じて旧インデックスファイル122-1が更新される場合にも、インデックス再構築処理によって新インデックスファイル122-3が更新される場合にも、WALファイル123に書き込まれる。
【0101】
図14では、インデックス作成処理が完了した時点でDBサーバ100に障害が発生し、その後に更新管理情報111の更新情報が消失した状態でDBサーバ100が復旧したとする。インデックス再構築部132は、WALファイル123から旧インデックスファイル122-1および新インデックスファイル122-3に関するログを読み出す。インデックス再構築部132は、旧インデックスファイル122-1に関するログと新インデックスファイル122-3に関するログとを比較することで、差分レコードを判別し、差分レコードの内容を示す更新情報を更新管理情報111に登録する。
図14の例では、ログの比較によって旧インデックスファイル122-1におけるkey1の更新が反映されていないと判定され、その旨を示す更新情報111cが更新管理情報111に登録される。
【0102】
この状態から、インデックス再構築部132は
図13に示したインデックス最新化処理を実行する。これにより、更新情報111cに基づいてkey3の更新が新インデックスファイル122-3に反映される。このような処理により、更新管理情報111の更新情報が消失した場合でも新インデックスファイル122-3を最新化し、旧インデックスファイル122-1との間でレコードの整合をとることが可能となる。
【0103】
なお、PostgreSQLのオートバキュームには、無効レコードの発生状況などを示す統計情報を収集する機能が実装されている。そこで、インデックス再構築部132は、この機能によって収集された統計情報を参照して、再構築処理が必要なインデックスファイルを特定し、特定されたインデックスファイルを旧インデックスファイルとしてインデックス再構築を実行することが可能である。これにより、データベースの管理者が再構築処理が必要なインデックスファイルを特定することなく、必要なインデックスファイルを処理対象としたインデックス再構築処理を自動的に実行することが可能となる。
【0104】
また、上記の各実施の形態に示した装置(例えば、情報処理装置1、DBサーバ100、業務サーバ200)の処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供され、そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置(HDD)、磁気テープなどがある。光ディスクには、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスク(Blu-ray Disc:BD、登録商標)などがある。
【0105】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたDVD、CDなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【0106】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムまたはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムにしたがった処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムにしたがった処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムにしたがった処理を実行することもできる。
【符号の説明】
【0107】
1 情報処理装置
2 記憶部
3 処理部
10 データベース
11,12 インデックス
P1~P6,P11~P16 ページ
R1~R8,R11~R13,R21,R22,R31~R33,R41,R42 レコード
S1,S2 ステップ