(57)【要約】【課題】  ユーザが実行するクエリによるキーバリューストアへのアクセス傾向が変わっても性能低下を抑制する。【解決手段】  表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータを記憶するKVデータ記憶手段と、クエリで指定された表の列の値が指定された範囲にあるレコードデータを、KVデータから検索して更新または参照処理を実行する問い合せ処理手段と、列対応に、当該列がクエリで指定された回数を含む統計情報を蓄積する統計情報収集手段と、回数が最大の列（以降、第２の列）を選択し、KVデータ記憶手段内のKVデータを第２の列の値をレンジキーとするKVデータへ、変換するデータ構造変換手段と、を備える。【選択図】      図１
2018081603.tif 000002
【特許請求の範囲】
【請求項１】
表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータを記憶するKVデータ記憶手段と、
クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行する問い合せ処理手段と、
前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積する統計情報収集手段と、
前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換するデータ構造変換手段と、を備えるKVデータ構造変換装置。
【請求項２】
前記統計情報収集手段は、さらに前記更新または参照処理の対象レコードデータを含む前記葉ノード（以降、処理レコードを含むKV）の数、および、前記処理レコード検索過程でアクセスした前記葉ノード（以降、取得したKV）の数を含む前記統計情報を取得し、
前記データ構造変換手段は、「前記処理レコードを含むKVの数」／「前記取得KVの数」の算出値が所定値以下である場合に、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する、請求項１のKVデータ構造変換装置。
【請求項３】
前記データ構造変換手段は、第２の前記列対応の前記回数が、第１の前記列対応の前記回数より所定数、または、所定割合以上大きい場合、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する、請求項１のKVデータ構造変換装置。
【請求項４】
差分データ記憶手段を、さらに備え、
前記データ構造変換手段が前記KVデータの変換中に、前記問い合わせ処理手段は、前記更新または参照処理において、前記レコードデータの更新要求に対して更新データを前記差分データ記憶手段に格納し、前記レコードデータの参照要求に対して変換前の前記KVデータまたは前記更新データを参照し、
前記KVデータの変換後に、前記データ構造変換手段は、変換後の前記KVデータを前記更新データで更新し、前記問い合わせ処理手段は、前記更新または参照処理において、前記レコードデータの更新要求に対して変換後の前記KVデータを更新し、前記レコードデータの参照要求に対して変換後の前記KVデータまたは前記更新データを参照する、請求項１乃至請求項３の何れか１項のKVデータ構造変換装置。
【請求項５】
自装置のリソース負荷を監視するリソース不可監視手段をさらに備え、
前記データ構造変換手段は、前記リソース久負荷が所定閾値より低い場合に、前記KVデータを変換する、請求項１乃至請求項４の何れか１項のKVデータ構造変換装置。
【請求項６】
統計情報記憶手段と、統計情報管理手段とを、さらに備え、
前記統計情報収集手段は、取得した情報を前記統計情報管理手段に蓄積し、
前記統計情報管理手段は、取得後、所定期間を経過した前記情報を削除する、請求項１乃至請求項５の何れか１項のKVデータ構造変換装置。
【請求項７】
前記統計情報を格納する統計情報記憶手段と、
前記統計情報記憶手段に蓄積された前記統計情報に基づいて、年月日、曜日、および、時間帯の何れか１つまたはその組み合わせに基づいて周期的に発生する期間と、当該期間における第２の前記列を特定して、特定した前記期間と第２の前記列を含む構造変換計画を作成する構造変換計画作成手段と、をさらに備え、
前記統計情報収集手段は、取得した情報を前記統計情報管理手段に蓄積し、
前記データ構造変換手段は、構造変換計画作成手段が特定した前記期間の開始時点で、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する、請求項１乃至請求項６の何れか１項のKVデータ構造変換装置。
【請求項８】
前記データ構造変換手段による前記KVデータの変換履歴を記憶するシステムカタログと、
前記システムカタログに蓄積された前記変換履歴に基づいて、年月日、曜日、および、時間帯の何れか１つまたはその組み合わせに基づいて周期的に発生する期間と、当該期間における第２の前記列を特定して、特定した前記期間と第２の前記列を含む構造変換計画を作成する構造変換計画作成手段と、をさらに備え、
前記データ構造変換手段は、構造変換計画作成手段が特定した前記期間の開始時点で、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する、請求項１乃至請求項６の何れか１項のKVデータ構造変換装置。
【請求項９】
表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータをKVデータ記憶手段に記憶し、
クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行し、
前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積し、
前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する、KVデータ構造変換方法。
【請求項１０】
表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータをKVデータ記憶手段に記憶する記憶処理と、
クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行する問い合せ処理と、
前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積する統計情報収集処理と、
前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換するデータ構造変換処理と、をコンピュータに実行させるKVデータ構造変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ユーザが実行するクエリによるデータへのアクセス傾向が変わっても性能低下が抑制される、KVデータ構造変換装置、KVデータ構造変換方法、および、KVデータ構造変換プログラム、に関する。
【背景技術】
【０００２】
特許文献１は、KVS(キー Value Store)に対して表形式のデータをKV(キー Value)データに変換して格納するシステムを開示する。このようなシステムは、あらかじめ表形式のデータをどのようにKVデータに変換するかをユーザに定義させる。表形式のデータをKVデータに変換する方法にはいくつかの種類があり、その中でレンジクラスタと呼ばれる構造がある。
【０００３】
レンジクラスタは、表形式のデータを複数のKVデータで構成されるB-Tree（平衡木とも呼ぶ）の構造で表す方法であり、B-Treeのリーフノードにレコードデータが格納される。このリーフノードに格納されるレコードデータは、ユーザが任意に決めた列の値（レンジキーと呼ぶ）によってソートされて格納される。このため、レンジキーをWHERE句に指定した参照や更新処理は、B-Tree内を効率的に探索でき、高速化されるという特徴を持っている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１５-１８４６８５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１が開示するようなシステムでは、ユーザが、どの列の値をレンジキーに設定するかを定義し、表形式のデータがKVデータに変換されてストレージに格納されると、そのKVデータは、後から別のKVデータに変更することができない。このため、ユーザが最初に定義したレンジキーが、ユーザが実行するワークロードに適したレンジキーでない場合に性能を十分に発揮できないという問題があった。また、運用開始時のワークロードに対しては適切なレンジキーの設定であっても、ワークロードが変わった場合に十分な性能が発揮できなくなるという問題があった。
【０００６】
本発明は、上記課題を解決し、ユーザが実行するクエリによるデータへのアクセス傾向が変わっても性能低下が抑制される、KVデータ構造変換装置、KVデータ構造変換方法、および、KVデータ構造変換プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の１実施の形態のKVデータ構造変換装置は、表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータを記憶するKVデータ記憶手段と、クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行する問い合せ処理手段と、前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積する統計情報収集手段と、前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換するデータ構造変換手段と、を備える。
【０００８】
本発明の１実施の形態のKVデータ構造変換方法は、表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータをKVデータ記憶手段に記憶し、クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行し、前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積し、前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換する。
【０００９】
本発明の１実施の形態のKVデータ構造変換プログラムは、表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、前記レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータをKVデータ記憶手段に記憶する記憶処理と、クエリで指定された前記表の前記列の値が指定された範囲にある前記レコードデータを、前記KVデータから検索して更新または参照処理を実行する問い合せ処理と、前記列対応に、当該列が前記クエリで指定された回数を含む統計情報を蓄積する統計情報収集処理と、前記回数が最大の前記列（以降、第２の前記列）を選択し、前記KVデータ記憶手段内の前記KVデータを、第２の前記列の値を前記レンジキーとする前記KVデータへ変換するデータ構造変換処理と、をコンピュータに実行させる。
【発明の効果】
【００１０】
本発明にかかるKVデータ構造変換装置は、ユーザが実行するクエリによるデータへのアクセス傾向が変わっても性能低下を抑制する。
【図面の簡単な説明】
【００１１】
【図１】図１は、第1の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。
【図２】図２は、クライアント300からクエリが入力された際の問い合わせ処理部101の動作を説明したフローチャートである。
【図３】図３は、表形式のデータ例を示す。
【図４】図４は、図３の表形式データがレンジクラスタ構造でKVデータ群に変換された場合のKVデータ群を示す。
【図５】図５はKVデータのデータ構造が変換される際の動作を説明したフローチャートである。
【図６】図６は、統計情報記憶部204に格納されている統計情報の例を示す。
【図７】図７は、システムカタログ205に格納されている情報の例（その１）を示す。
【図８】図８は、システムカタログ205に格納されている情報の例（その２）を示す。
【図９】図９は、差分データ記憶部202に格納される更新データの例を示す。
【図１０】図１０は、図４で示したログID列がレンジキー列であるKVデータ群を、ログ発生時間列をレンジキー列とするKVデータ群に変換した例を示す。
【図１１】図１１は、第2の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。
【図１２】図１２は、第3の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。
【図１３】図１３は、第4の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。
【図１４】図１４は、本実施形態における構造変換計画作成部107の動作を示すフローチャートである。
【図１５】図１５は、システムカタログ205に格納されている変換履歴の構成を示す。
【図１６】図１６は、コンピュータ装置600の構成図である。
【図１７】図１７は、第5の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。
【発明を実施するための形態】
【００１２】
＜第１の実施の形態＞
＜構成＞
図１は、第1の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。KVデータ構造変換装置100は、通信網を経由して、１台以上のクライアント300と接続されている。
【００１３】
KVデータ構造変換装置100は、問い合わせ処理部101、統計情報収集部102、データ構造変換部103、KVデータ削除部104、KVデータ記憶部201、差分データ記憶部202、変換データ記憶部203、統計情報記憶部204、およびシステムカタログ205を備える。さらにデータ構造変換部103は、内部に構造変換判断部113およびバリュー部変更部123を備える。
【００１４】
問い合わせ処理部101は、クライアント300からクエリを受け付け、当該クエリを処理する部である。問い合わせ処理部101は、クライアント300からクエリが入力されると、処理対象のKV(Key Value)データをKVデータ記憶部201から取得する。
【００１５】
問い合わせ処理部101は、クライアント300から入力されたクエリが参照クエリ（SELECT）の場合、KVデータ記憶部201から取得したKVデータを結果としてクライアント300に返却する。クライアント300から入力されたクエリが更新クエリ（INSERT、UPDATE、DELETE）の場合、問い合わせ処理部101は、KVデータ記憶部201から取得したKVデータを更新してKVデータ記憶部201に書き戻し、処理結果をクライアント300に返却する。
【００１６】
また、問い合わせ処理部101は、入力されたクエリによるKVデータのアクセス傾向などを解析する為の統計情報を統計情報収集部102に渡す。
【００１７】
KVデータ変換処理が実行されている間は、問い合わせ処理部101は、差分データ記憶部202や変換データ記憶部203にも同様にアクセスする。差分データ記憶部202や変換データ記憶部203にアクセスする手順については後述する。
【００１８】
統計情報収集部102は、クライアント300から入力されたクエリによるKVデータのアクセス傾向などを解析する為の統計情報を収集する部である。収集される統計情報は、例えば、KVデータを選択するために利用されたクラスタキー値の情報や、検索対象を絞り込むために利用された属性情報や、KVデータ記憶部201から取得したKVデータの個数や、処理対象のレコードデータを含むKVデータの個数である。
【００１９】
統計情報収集部102で収集された統計情報は、統計情報記憶部204に書き込まれる。
【００２０】
データ構造変換部103は、統計情報記憶部204に記憶されている統計情報を基にKVデータ記憶部201に格納されているKVデータの構造を変換する部である。データ構造変換部103は、動作を開始すると、問い合わせ処理部101にデータ構造変換処理が実行中であることを通知する。
【００２１】
問い合わせ処理部101は、データ構造変換部103から通知を受け取ると、以後、更新データをKVデータ記憶部201に書き込むのではなく、差分データ記憶部202に書き込むようになる。また、データ参照時には、問い合わせ処理部101はKVデータ記憶部201と差分データ記憶部202を参照し、クライアント300に結果を返却する。
【００２２】
次にデータ構造変換部103は、KVデータ記憶部201から構造を変換する対象となるKVデータを抽出して構造を変換したのち、変換データ記憶部203に変換後のKVデータを格納する。このとき、統計情報に基づいてKVデータの構造を変換するかどうかを判断するのが、構造変換判断部113であり、実際にKVデータのバリュー部を変更することで構造を変換するのがバリュー部変更部123である。
【００２３】
KVデータ構造変換部103は、KVデータ記憶部201に格納されているKVデータ内の変換対象データをすべて変換したとき、問い合わせ処理部101にデータ構造変換処理の1段階目のフェーズが完了したことを通知する。問い合わせ処理部101は、データ構造変換部103からこの通知を受け取ると、以後、更新データを変換データ記憶部203に書き込むようになる。また、データ参照時には、問い合わせ処理部101は変換データ記憶部203と差分データ記憶部202を参照し、クライアント300に結果を返却する。
【００２４】
次にデータ構造変換部103は、差分データ記憶部202に記憶されている更新データを、変換データ記憶部203に格納されている変換後のKVデータに反映するためにマージ処理を行う。このマージ処理を行うものバリュー部変更部123である。
【００２５】
データ構造変換部103は。差分データ記憶部202内の更新データをすべてマージした後は、問い合わせ処理部101にデータ構造変換処理の2段階目のフェーズが完了したことを通知する。問い合わせ処理部101は、データ構造変換部103からの通知を受け取ると、以後、データ参照時には、変換データ記憶部203のみからデータを参照してクライアント300に結果を返却する。また、データ構造変換部103は、差分データ記憶部202内の更新データをすべてマージした後、KVデータ削除部104に変換済みのKVデータの削除を依頼する。
【００２６】
KVデータ削除部104は、KVデータ記憶部201から変換前のKVデータを削除し、差分データ記憶部202から更新データを削除する部である。
【００２７】
KVデータ記憶部201は、クライアント300から参照・更新されるKVデータを記憶する部である。ユーザが定義した表形式のデータが、KVデータの形式に変換されて格納されている。
【００２８】
差分データ記憶部202はデータ構造変換部103が動作を開始したのち、問い合わせ処理部101に入力された更新クエリの結果を記憶する部である。
【００２９】
変換データ記憶部203は、データ構造変換部103がKVデータ記憶部201に記憶されているKVデータの構造を変換した結果のKVデータを記憶する部である。
【００３０】
なお、KVデータ記憶部201、差分データ記憶部202、変換データ記憶部203はすべてKVS（Key Value Store）で構成されている。図１ではそれぞれ別の記憶装置として記載しているが、KVデータ記憶部201、差分データ記憶部202、変換データ記憶部203に格納されているデータはすべて1つのKVS、例えばKVデータ記憶部201、の中に入っていても良い。
【００３１】
このため、KVデータの構造が変換され、変換データ記憶部203に格納されたデータを、再度別のKVデータ構造に変換する場合、データ構造変換部103は、KVデータ記憶部201と変換データ記憶部203のソースとデスティネーションの役割を交互に変えて使用する。すなわち、データ構造変換部103は、変換前のKVデータが変換データ記憶部203に格納されているのではなく、KVデータ記憶部201に格納されているものと見なして同様に処理を実行することができる。
【００３２】
統計情報記憶部204は、統計情報収集部102が収集した統計情報を記憶する部である。
【００３３】
システムカタログ205は、KVデータ記憶部201や差分データ記憶部202や変換データ記憶部203に保存されているKVデータのKVデータ構造に関する情報を保存する部である。システムカタログ205には、各データベースに存在するテーブルの情報と、そのテーブルのデータがどのようにKVデータに変換されているかを示す情報と、KV構造が最後に変換された時間に関する情報とが保存されている。
【００３４】
ここで、KVデータ構造変換装置100の問い合わせ処理部101、統計情報収集部102、データ構造変換部103（構造変換判断部113およびバリュー部変更部123を含む）、並びに、KVデータ削除部104は、論理回路で構成される。差分データ記憶部202、変換データ記憶部203、統計情報記憶部204、および、システムカタログ205は、ディスク装置、または、半導体記憶装置等の記憶装置である。
【００３５】
KVデータ構造変換装置100は、コンピュータ装置600により実現されても良い。図１６は、コンピュータ装置600の構成図である。コンピュータ装置600は、バス640で相互に接続された、プロセッサ610、主記憶部630、および、外部記憶装置620を備える。プロセッサ610は、バス640を経由して、主記憶部630、および、外部記憶装置620に対してデータの読み書きを行う。また、プロセッサ610は、主記憶部630に格納されているプログラム650を実行する。なお、プログラム650は、当初外部記憶装置620に格納されており、コンピュータ装置600の初期設定時に、プロセッサ610が外部記憶装置620から主記憶部630にロードしても良い。
【００３６】
ここで、主記憶部630は半導体メモリ装置である。外部記憶装置620はディスク装置、または、半導体記憶装置等の記憶装置である。
【００３７】
プロセッサ610は、プログラム650を実行することにより、問い合わせ処理部101、統計情報収集部102、データ構造変換部103（構造変換判断部113およびバリュー部変更部123を含む）、並びに、KVデータ削除部104として機能する。すなわち、プロセッサ610は、プログラム650を実行することにより、問い合わせ処理部101、統計情報収集部102、データ構造変換部103（構造変換判断部113およびバリュー部変更部123を含む）、並びに、KVデータ削除部104が行う処理を実行する。
【００３８】
外部記憶装置620は、差分データ記憶部202、変換データ記憶部203、統計情報記憶部204、および、システムカタログ205として使用されても良い。
【００３９】
＜動作＞
次に、KVデータ構造変換装置100の動作について説明する。図２は、クライアント300からクエリが入力された際の問い合わせ処理部101の動作を説明したフローチャートである。
【００４０】
まず、クエリ入力のステップS001で、クライアント300がKVデータ構造変換装置100に対してクエリを入力すると、問い合わせ処理部101が受信する。KVデータ取得のステップS002で、問い合わせ処理部101は入力されたクエリを解析した結果と、システムカタログ205から取得した情報を基にアクセス対象のKVデータを特定し、KVデータ記憶部201から処理対象データを取得する。
【００４１】
次に、問い合わせ処理部101はクエリの解析結果から、入力されたクエリが挿入処理を行うクエリ（INSERT）であるかどうかを判断する(ステップS003)。挿入処理を行うクエリである場合、問い合わせ処理部101は、クエリを解析した結果とシステムカタログ205から取得した情報を基にデータの挿入処理を行い（ステップS004）、挿入処理の結果をクライアント300に返却する（ステップS005）。データ挿入のステップS004で挿入されたデータは、KVデータ記憶部201に書き込まれる。
【００４２】
また、データ挿入のステップS004では、問い合わせ処理部101はシステムカタログ205に格納されている情報を取得し、挿入されるデータに含まれるクラスタキー値がシステムカタログ205に存在しない値の場合は、システムカタログ205の情報を更新する。システムカタログ205に格納されている情報とその情報の更新の詳細については後述する。
【００４３】
ここで、KVデータ記憶部201が記憶しているKVデータの構造について説明する。KVデータ構造変換装置100の、例えばデータ構造変換部103は、初期設定時に、ユーザが定義する表形式のデータをKVデータに変換してKVデータ記憶部201に格納する。表形式のデータをKVデータに変換する方法の1つにレンジクラスタと呼ばれる構造がある。
【００４４】
図３は、表形式のデータ例を示す。図３に示すテーブルの主キーはログID列であるとする。表形式のデータをレンジクラスタ構造に変換するためには、予めクラスタを構成するためのキー列であるクラスタキー列と、データをソートして格納するための基準となる列であるレンジキー列が設定されている。クラスタキー列やレンジキー列は、最初はユーザがテーブルごとに任意に設定する。システムカタログ205は、初期設定時に、ユーザが設定したクラスタキー列やレンジキー列の情報を記憶している。
【００４５】
図３に示す表形式のデータのクラスタキー列は、例えば機器名列、レンジキー列は、例えばログID列であるとする。図４は、図３の表形式データがレンジクラスタ構造でKVデータ群に変換された場合のKVデータ群を示す。
【００４６】
図４が示すKVデータ群は、図３が示す表形式のデータのうち、機器名列の値が機器Aである行データを、レンジクラスタ構造のKVデータに変換したものである。このようにレンジクラスタ構造は、クラスタキー列の値ごとに表形式のデータから行データを抜き出して、各行データ（レコードデータとも、呼ぶ）をB-Tree（平衡木とも呼ぶ）形式のKVデータ群に変換したデータ構造である。図４において、KVデータの各々は、長方形で表されており、B-Treeのノードを構成している。
【００４７】
なお、図３に示す表形式のデータの機器名列は、機器Bや機器Cといった値も含むので、図４に示すKVデータ群以外にも、機器Bに対応するB-Tree構造のKVデータ群、および、機器Cに対応するB-Tree構造のKVデータ群が存在する。以降、図４に示す機器Aに対応するKVデータ群について、詳細に説明する。
【００４８】
図４の一番上に記載のKVデータは、ルートノードと呼ばれるノードであって、機器Aに関連するKVデータ群にアクセスする際には必ず最初にアクセスされるKVデータである。ルートノードのキー値（図におけるkey列の値）はクラスタキー列の値となる。図４に示す例では、機器Aがルートノードのキー値となる。ルートノードのバリュー（図のValue列の値）には、下位のノードのノードIDと下位のノードが受け持つレンジキー値の範囲を、各下位のノードに関連付けて保持している。
【００４９】
上から二番目、すなわち深さが２の段に記載のKVデータは、中間ノードと呼ばれるノードであって、さらに下位のノードへのポインタの役割を果たすノードである。中間ノードのキー値は、システムによって割り振られたノードIDの値である。また、中間ノードのバリューには、下位のノードのノードIDと下位のノードが受け持つレンジキー値の範囲を、各下位のノードに関連付けて保持している。また、中間ノードは、ルートノードと違い、同じ段の一つ右隣のノードIDも保持している。
【００５０】
上から三番目、すなわち深さが３の段に記載のKVデータは、リーフノードと呼ばれるノードであって、このノードに図３に示す表形式のレコードデータに相当するデータが格納される。リーフノードのキー値は、システムによって割り振られたノードIDの値である。また、リーフノードのバリューは、表形式のレコードデータに相当するデータをいくつか包含している。またリーフノードは、中間ノードと同様に一つ右隣のノードIDを保持している。
【００５１】
リーフノードが保持するレコードデータの個数は、ユーザによってあらかじめ定義される。たとえば、1つのリーフノードに100個のレコードデータが格納される、とユーザが定義すると、図４のリーフノード1つに格納されるレコードデータの個数は100個となる。
【００５２】
次に、図４で示されるようなレンジクラスタ構造のKVデータ群に対して、問い合わせ処理部101がどのようにアクセスするのかを説明する。例えば、次のクエリ例１のようなクエリがクライアント300から問い合わせ処理部101に入力されたとする。
【００５３】
（クエリ例１）
SELECT * FROM table WHERE 機器名=’機器A’ AND ログID = 203
このクエリは、WHERE句に機器名=’機器A’という条件がある。従って、問い合わせ処理部101は、図４に示されるKVデータ群にアクセスする。まず、問い合わせ処理部101は、機器Aという値から、キー値が機器Aであるルートノードにアクセスする。このクエリはWHERE句の条件にレンジキー列であるログIDを含んでいるので、問い合わせ処理部101は、ルートノードのバリューに保持されているデータ範囲を調べる。
【００５４】
その結果、問い合わせ処理部101は、ログID=203のデータはノードID1のノードが担当していることを検出し、ノードID1をキー値に持つKVデータにアクセスする。問い合わせ処理部101は、ノードID1の中間ノードに対しても同様にバリューに保持されているデータ範囲を調べる。その結果、ログID=203のデータはノードID5のノードが担当していることが分かるので、問い合わせ処理部101は、ノードID5をキー値に持つKVデータにアクセスする。
【００５５】
ノードID5のノードはリーフノードなので、このノードのバリューに格納されているデータを問い合わせ処理部101は取得することになる。最終的に、問い合わせ処理部101は、バリューに含まれるレコードデータの中から、ログID=203に合致するレコードデータをクライアント300に返却する。
【００５６】
このように、この例では、問い合わせ処理部101は、ルートノードと、キー値がノードID1の中間ノードと、キー値がノードID5のリーフノードの3つのKVデータにアクセスすることでクライアント300に結果を返すことができる。
【００５７】
次に、例えば、次のクエリ例２のようなクエリが、クライアント300から問い合わせ処理部101に入力されたとする。
【００５８】
（クエリ例２）
SELECT * FROM table WHERE 機器名=’機器A’ AND ( 50 < ログID AND 300 > ログID )
この場合も、問い合わせ処理部101は、まずルートノードにアクセスし、WHERE句に含まれるレンジキー列であるログIDの範囲条件から、ノードID1のノードにアクセスすれば良いと判断する。次いで、問い合わせ処理部101は、ノードID1のノードにアクセスし、次に「50 < ログID」という条件から、ノードID4のノードにアクセスすれば良いと判断する。
【００５９】
さらに、問い合わせ処理部101は、ノードID4のノードにアクセスし、ノードID4のノードが担当するデータ範囲の最大が300より小さいことを判断し、隣のノードにもアクセスする必要があると判断する。この判断は、300 > ログID」という条件に由来する。ノードID4のノードのバリューには右隣のノードのノードID（ノードID5）が保持されているので、問い合わせ処理部101は、ノードID5のノードにアクセスすることができる。
【００６０】
問い合わせ処理部101は、ノードID5のノードにアクセスし、ノードID5のノードが担当するデータ範囲の最大が300より大きいことから、これ以上ノードを探索する必要がないことを判断する。結果的に、問い合わせ処理部101は、ノードID4とノードID5のノードのバリューに格納されているデータを取得する。
【００６１】
最終的に問い合わせ処理部101は、ノードID4とノードID5のノードのバリューに含まれるレコードデータの中から「50 < ログID AND 300」に合致するレコードデータをクライアント300に返却する。
【００６２】
この例では、ルートノードと、キー値がノードID1の中間ノードと、キー値がノードID4のリーフノードと、キー値がノードID5のリーフノードの4つのKVデータにアクセスすることで、問い合わせ処理部101は、クライアント300に結果を返すことができている。
【００６３】
最後に、例えば、次のクエリ例３のようなクエリがクライアント300から問い合わせ処理部101に入力されたとする。
【００６４】
（クエリ例３）
SELECT * FROM table WHERE 機器名=’機器A’ AND ポート番号=80
この場合も、問い合わせ処理部101は、まずルートノードにアクセスする。そして、問い合わせ処理部101は、WHERE句にはレンジキー列であるログIDの条件が含まれないので、ノード全体を探索する必要がある、すなわち、ノード全体を探索しないとポート番号=80を満たすレコードをすべて抽出することができないと判断する。
【００６５】
このため、問い合わせ処理部101は、無条件にノードID1のノードにアクセスし、その次は無条件にノードID4のノードにアクセスする。ノードID4のノードはリーフノードなので、問い合わせ処理部101は、ここからは右隣のノードに順番にアクセスしていく。この検索は、最終的に一番右端のリーフノードまで探索したところで終了となる。
【００６６】
問い合わせ処理部101は、全リーフノードのバリューに格納されているデータを参照して、その中からポート番号=80という条件を満たすレコードだけを抜き出してクライアント300に返却する。
【００６７】
この例では、問い合わせ処理部101は、ルートノードと、キー値がノードID1の中間ノードと、全リーフノードのKVデータにアクセスしないとクライアント300に結果を返すことができない。
【００６８】
レンジクラスタ構造では、レンジキーによってリーフノード内のレコードデータがソートされて格納されている。このため、レンジキーの値がWHERE句の条件に含まれているとき、問い合わせ処理部101は、少数のKVデータにアクセスするだけで結果をクライアント300に返却することができる。逆に、レンジキーの値がWHERE句の条件に含まれていない場合、問い合わせ処理部101は、全てのリーフノードにアクセスする必要がある。従って、後者の場合、前者と比べてクエリの処理性能（応答時間、スループット）が悪化する。
【００６９】
なお、図４が示す例は、ルートノード、中間ノード、リーフノードの3層で構成されるが、レコードデータの量が多くなり、中間ノードが多段になっても良い。
【００７０】
KVデータ記憶部201には、最初ユーザが定義したKVデータ構造に基づいて表形式のデータがレンジクラスタ構造のKVデータに変換されて格納されている。
【００７１】
図２の説明に戻って、クライアント300から入力されたクエリが挿入処理を行うクエリでない場合、統計情報収集のステップS006で問い合わせ処理部101が統計情報収集部102に対して統計情報を入力する。
【００７２】
統計情報として収集する項目は、例えば、以下のａ）乃至ｄ）項目である。
ａ）KVデータにアクセスするために利用されたクラスタキー値の情報
ｂ）検索対象を絞り込むために利用された属性情報、例えば、WHERE句で指定された列と値の情報
ｃ）処理対象となるレコードデータを含むKVデータの個数、すなわち、検索の目的となっていたKVデータの個数
ｄ）KVデータ記憶部201から取得したKVデータの個数、すなわち、処理対象となるレコードデータを含むKVデータを取得する過程で経由したルート、中間及びリーフのノードの個数
なお、この他に有用な統計情報がある場合、統計情報として収集される項目は、それらを含んでいても良い。
【００７３】
統計情報収集部102は、問い合わせ処理部101から統計情報が入力されると、その情報を統計情報記憶部204に格納する。
【００７４】
次に、問い合わせ処理部101は、入力されたクエリが更新処理を行うクエリ（UPDATE、DELETE）であるか、参照処理を行うクエリ（SELECT）であるかを判断する（ステップS007）。問い合わせ処理部101は、更新処理を行うクエリである場合は、データの更新処理を行い（ステップS008）、更新処理の結果をクライアント300に返却する（ステップS009）。
【００７５】
データ更新のステップS008で更新されたデータは、KVデータ記憶部201に書き込まれる。入力されたクエリが参照処理を行うクエリである場合、問い合わせ処理部101は、ステップS002で取得したKVデータを参照処理結果としてクライアント300に返却する（ステップS010）。
【００７６】
図５はKVデータのデータ構造が変換される際の動作を説明したフローチャートである。図５を用いて、KVデータの構造が変換される際の動作について説明する。
【００７７】
まず、統計情報取得のステップS101で、データ構造変換部103は統計情報記憶部204に格納されている統計情報を取得する。
【００７８】
次に、システムカタログ205取得のステップS102で、データ構造変換部103はシステムカタログ205に格納されている情報を取得する。なお、データ構造変換部103が統計情報記憶部204やシステムカタログ205から情報を取得するタイミングは、ユーザが任意のタイミングで指示を出しても良いし、タイマーなどによって定期的に動作するようになっていても良い。
【００７９】
次に、構造変換判断部113は。ステップS101とS102で取得した情報からKVデータ構造変換対象のB-Treeを構成するKVデータ群があるかどうかを判定する（ステップS103）。構造変換判断部113は、あるKVデータ群がKVデータ構造変換の対象であるかどうかを、例えば以下のように判定する。
【００８０】
図６は、統計情報記憶部204に格納されている統計情報の例を示す。図６の統計情報は、処理対象となったテーブル、クラスタキーの値、KVデータにアクセスした時間、WHERE句で絞り込みに利用した属性、KVデータ記憶部201から取得したKV数、およびクエリによって処理されたレコードを含んでいるKV数を含む。統計情報収集部102は、クエリ（ただし、INSERTクエリを除く）が処理される度に、これらの統計情報を追加していく。
【００８１】
KVデータ記憶部201から取得したKV数として記録する統計情報は、ルートノードや中間ノードの個数を含んでいてもても良いが、図６の例では、問い合わせ処理部101は、KVデータ記憶部201から取得したKV数としてリーフノードの個数のみをカウントしている。すなわち、ルートノードや中間ノードはカウントされていない。
【００８２】
図７および図８はシステムカタログ205に格納されている情報の例を示す。図７に示される情報は、ユーザが最初に各表形式データ（テーブル）に対してクラスタキー列とレンジキー列を設定した際にシステムカタログ205に格納される初期情報である。図７の情報は、クラスタキー列として機種名列が、レンジキー列としてログID列が登録されていることを示す。
【００８３】
図８は、テーブルに含まれるクラスタキー値の情報、クラスタキー値ごとに構成されるB-Tree構造のKVデータ群のレンジキー列に関する情報、KV構造が変換された時間に関する情報がシステムカタログ205に格納されていることを表している。
【００８４】
なお、データが挿入される際、システムカタログ205に、それまでに記録されていないクラスタキー値を持つデータが挿入される場合がある。この時、問い合わせ処理部101は、システムカタログ205に新たな情報を追加する。テーブル情報として処理対象であるテーブル名が、クラスタキー値情報として挿入データに含まれるクラスタキー値が、レンジキー列情報として図７に示されるようなユーザが最初に設定したレンジキー列が、KV構造変換時間としてデータ挿入時間が追加される。
【００８５】
構造変換判断部113は図６に示すような統計情報を取得すると、各テーブルのクラスタキー値ごとに、絞り込み属性の値に応じた取得KV数と処理レコードを含むKV数を集計する。ここで「処理」は、「参照処理」もしくは「更新処理」を指す。
【００８６】
図６によれば、機器Aに関しては、絞り込み属性として「ログID」、「ログ発生時間」、「ポート番号」、「警告レベル」を利用して検索が行われている。レンジキー列であるログID列で検索した場合、取得KV数が少なく、処理レコードを含むKV数が取得KV数と比べて大きな差がない。これは、ログID列がレンジキー列であるためである。このため問い合わせ処理部101は、少ないKVデータにのみアクセスし、効率的に処理を行っている。
【００８７】
一方、ログID列以外で検索した場合、取得KV数が多くなり、さらに処理レコードを含むKV数が取得KV数と比べて少ない。これは、絞り込み属性として利用した列がレンジキー列ではないために、問い合わせ処理部101は、B-Treeを構成するすべてのKVデータにアクセスしたが、実際に処理対象となっていたKVデータは少なかったことを表している。
【００８８】
この例でも分かるように、レンジキーを利用しない検索では問い合わせ処理部101が、KVデータに多くアクセスすることになり、効率的な処理が行えない。
【００８９】
図６のデータによれば、機器Aに関して、問い合わせ処理部101は、ログID列で1回、ログ発生時間列で3回、ポート番号列で2回、警告レベル列で1回検索している。最多の絞り込み属性はログ発生時間列である。そして、ログ発生時間列で検索した場合には、取得するKV数が150であり、そのうち処理対象のレコードを含むKV数が平均で約12である。
【００９０】
また、図８に示す情報により、機器Aのレンジキー列はログID列であることが分かる。機器AをクラスタキーとするB-Tree構造のKVデータ群に関しては、レンジキー列ではないログ発生時間列で検索が多く行われており、KVデータに多くアクセスしていることが分かる。従って、構造変換判断部113は、機器AのKVデータを、ログ発生時間列を新たなレンジキー列とする構造に変換することを決定する。
【００９１】
機器Bに関しては、ログID列で3回、ポート番号列で1回検索しており、最多の絞り込み属性はログID列である。また、図８に示す情報により、機器Bのレンジキー列はログID列であることが分かる。機器Bで構成されるB-Tree構造のKVデータ群に関しては、最多の絞り込み属性がレンジキー列であるため、構造変換判断部113は、構造の変換はしなくて良いと決定する。
【００９２】
このように構造変換要否の決定過程で、構造変換判断部113は、まず、どの絞り込み属性が最も多く利用されているかを調べる。そして、構造変換判断部113は、その絞り込み属性を利用して検索した場合の「処理レコードを含むKV数」 / 「取得KV数」の値が一定値以下となっている場合に、その絞り込み属性を新たなレンジキー列とする構造に変換することを決定する。
【００９３】
構造変換判断部113がこのように判断するのは、「処理レコードを含むKV数」/「取得KV数」の値が一定以下というのは、目的のKVデータを得る為に、問い合わせ処理部101が一定割合以上に多くのKVデータを経由していることを意味するからである。決定の判断変換基準となる「処理レコードを含むKV数」と「取得KV数」との比率の閾値は、ユーザが予め構造変換判断部113に設定しておけば良い。
【００９４】
構造変換判断部113は、現在レンジキー列として設定されている属性を利用した検索と、変換候補となっている属性、すなわち、もっとも多く絞り込みに利用されている属性を利用した検索の利用回数の比率を構造変換要不要の判断基準として利用しても良い。
【００９５】
例えば、現在のレンジキー列として設定されている属性を利用した検索の回数が100回であり、変換候補となっている属性を利用した検索の回数が110回の場合、二つの属性でそれほど利用回数に差がないことなる。構造の変換は、CPU（Central Processing Unit）等のリソースを多く消費する処理であるため、それほど差がないのに構造を変換するのはリソース消費の観点からもったいない。
【００９６】
このため、現在レンジキー列として設定されている属性を利用した検索回数に対する、変換候補となっている属性を利用した検索の利用回数の比率または差分が一定以上になった場合にのみ、構造変換判断部113は、構造を変換するように決定しても良い。この比率の閾値は、ユーザが予め構造変換判断部113に設定しておけば良い。
【００９７】
なお、統計情報記憶部204にはシステム運用開始時からの統計情報がすべて格納されている。しかし、構造変換判断部113が統計情報記憶部204から収集する統計情報、つまりKVデータ構造変換決定のために利用する統計情報は、各テーブルの各クラスタキー値に対して図８に示すKV構造変換時間よりもアクセス時間が後のものだけである。
【００９８】
KV構造変換時間は各B-Tree構造のKVデータ群がそのKV構造に変換された時間を表している。つまり、KV構造変換時間よりも前の統計情報は、図８に示すレンジキー列で構成されるKV構造に変換される前の統計情報である、そのため、構造変換判断部113は、それらの情報を基にKVデータ構造の変換要否の決定を行わない。
【００９９】
なお、統計情報記憶部204に格納されている統計情報やシステムカタログ205に格納されている情報は、図６や図７や図８の例では表形式のデータとなっているが、これらのデータが表形式のデータで格納されている必要はない。
【０１００】
図５のステップS103でKVデータ構造変換が必要なKVデータ群が見つかった場合、処理はステップS104以降に進む。見つからなかった場合、図５の処理は終了する。
【０１０１】
ステップS104からステップS112までの処理は、KVデータ構造変換対象のKVデータ群ごとに実行される。上記の説明例では図６に示すテーブルAの機器AをクラスタキーとするKVデータ群だけがKVデータ構造変換対象であるため、当該KVデータ群に関してステップS104からステップS112までが実行されて、図５の処理は終了する。他のKVデータ群がKVデータ構造変換対象として存在する場合は、次にそのKVデータ群に対してステップS104からステップS112までが実行される。このステップS104からステップS112まで流れが、KVデータ構造変換対象のKVデータ群がなくなるまで繰り返される。
【０１０２】
構造変換開始通知のステップS104では、データ構造変換部103が問い合わせ処理部101に対してKV構造変換対象となったKVデータ群の情報を通知する。問い合わせ処理部101は通知を受け取ると、KVデータ構造変換対象となったKVデータ群に対する更新処理結果である更新データをKVデータ記憶部201ではなく、差分データ記憶部202に書き込むようになる。
【０１０３】
次に、KVデータ取得のステップS105では、データ構造変換部103がKVデータ記憶部201からKVデータ変換対象のKVデータ群のKVデータをすべて取得する。
【０１０４】
次に、KVデータ構造変換のステップS106では、バリュー部変更部123がKVデータ記憶部201から取得したKVデータに対して構造の変換を行い、変換後のKVデータを変換データ記憶部203に書き込む。
【０１０５】
バリュー部変更部123は、この変換を、例えば、以下のような手順で行う。まず、バリュー部変更部123は、変換前のリーフノードからレコードデータを集め、表形式のデータを再構築する。次に、バリュー部変更部123は、再構築した表形式のデータのレコードデータを、新たなレンジキー列の値に基づいてソートする。そして、バリュー部変更部123は、ソートされたレコードデータを順次、所定数ずつのリーフノードに分割する。最後に、バリュー部変更部123は、所定数の下位ノードごとに、一つの上位のノードを作成していく。このとき、上位のノードのバリュー部には、下位ノードの新たなレンジキーの値の範囲が記録される。上位ノードが１つになった時点で、構造変換が終了する。
【０１０６】
次に、第1フェーズ終了通知のステップS107では、データ構造変換部103が問い合わせ処理部101に対して、ステップS104で通知したKVデータ群で、KVデータ記憶部201に格納されているKVデータのデータ構造の変換が終了したことを通知する。問い合わせ処理部101は通知を受け取ると、データ構造変換が完了したKVデータ群に対する更新処理結果を差分データ記憶部202ではなく、変換データ記憶部203に格納されている、データ構造変換済みのB-Tree構造のKVデータ群に対して書き込むようになる。
【０１０７】
次に、差分データ取得のステップS108では、データ構造変換部103が差分データ記憶部202からKVデータ変換対象のKVデータ群に関する更新データを取得する。
【０１０８】
次に、差分データマージのステップS109では、バリュー部変更部123が差分データ記憶部202から取得した更新データを用いて、変換データ記憶部203に格納されている、データ構造変換済みのB-Tree構造のKVデータ群を更新する。
【０１０９】
差分データ記憶部202に格納される更新データは、KVデータ記憶部201や変換データ記憶部203に格納されているようなB-Tree構造のKVデータである必要はない。差分データ記憶部202には、KVデータ記憶部201内のKVデータ群が変換されている間に更新処理が行われたレコードデータを表すKVデータがあれば良い。
【０１１０】
図９は、差分データ記憶部202に格納される更新データの例を示す。更新データは、KVデータ形式のデータである。ここで、キー値は変換対象となっているKVデータ群のクラスタキー値（図９の例では機器A）であり、バリュー部は、更新後のレコードデータを格納する。バリュー部は更新後のレコードデータだけではなく、そのレコードデータに対する処理種別（update, delete, insert）と、処理が実行された時間も格納する。
【０１１１】
バリュー部変更部123がKVデータ記憶部201に格納されているKVデータ群に対する変換処理を終了（第1フェーズが終了）した後は、問い合わせ処理部101は変換データ記憶部203に格納されているKVデータ群に対して更新を行うようになる。このため、ステップS109でデータ構造変換部103が差分データ記憶部202から取得したデータが最新のデータであるとは限らず、バリュー部変更部123は、差分データ記憶部202から取得したデータのうち、どのデータをデータ更新に適用すべきかの判断ができない。上記の問題を解決するため問い合わせ処理部101は、更新データを構成するレコードデータ部分に更新時間を付加する。
【０１１２】
図４で示されるKVデータ群の例では、リーフノードのバリュー部分にレコードデータを表すデータが多く存在するが、問い合わせ処理部101はこれら1つ1つに更新時間を付加する。この更新時間は、問い合わせ処理部101が更新処理を行う際に付加する。
【０１１３】
バリュー部変更部123は、差分データ記憶部202から取得したデータに含まれる処理が実行された時間と、変換データ記憶部203に格納されるKVデータ内のレコード部分の更新時間とを比較する。そして、差分データ記憶部202から取得したデータに含まれる処理が実行された時間のほうが新しい場合に、バリュー部変更部123は、当該データで変換データ記憶部203内のデータを更新する。
【０１１４】
次に、システムカタログ205更新のステップS110では、データ構造変換部103がシステムカタログ205に格納されている情報を更新する。具体的には、データ構造変換部103が、変換対象となったKVデータ群に対するレンジキー列の値とKV構造が変換された時間を更新する。
【０１１５】
次に、第2フェーズ終了通知のステップS111では、データ構造変換部103が、問い合わせ処理部101に対して、ステップS104で通知したKVデータ群に対するKVデータ構造の変換が終了したことを通知する。問い合わせ処理部101は通知を受け取ると、KVデータの構造変換が完了したKVデータ群に対する参照処理に関して、変換データ記憶部203だけからデータを取得するようになる。
【０１１６】
最後に、KVデータ削除のステップS112では、データ構造変換部103がKVデータ構造変換済みのKVデータ群の情報をKVデータ削除部104に通知する。KVデータ削除部104は削除の通知を受け取ると、対象のKVデータ群に関する構造変換前のKVデータをKVデータ記憶部201から、更新データを差分データ記憶部202から削除する。
【０１１７】
図１０は、図４で示したログID列がレンジキー列であるKVデータ群を、ログ発生時間列をレンジキー列とするKVデータ群に変換した例を示す。リーフノードのバリュー部が、図４ではログID列の値でソートされているのに対し、図１０ではログ発生時間列の値でソートされている。また、ルートノードや中間ノードのバリュー部に含まれるデータ範囲も、ログID列の値の範囲を表すデータではなく、新しくレンジキー列になったログ発生時間列の値の範囲を表すデータに変更されている。
【０１１８】
次に、KVデータ記憶部201に格納されているKVデータのデータ構造を変換中に、データ構造変換対象のKVデータに対してクエリが入力された場合のクエリ処理の動作を図２のフローチャートを基に説明する。
【０１１９】
まず、クエリ入力のステップS001でクライアント300がKVデータ構造変換装置100に対してクエリを入力する。このとき入力されるクエリが処理対象とするデータはデータ構造変換中のデータである。
【０１２０】
次に、KVデータ取得のステップS002で、問い合わせ処理部101は、入力されたクエリを解析した結果と、システムカタログ205から取得した情報を基に、アクセス対象のKVデータを特定する。この時、アクセス対象のKVデータ群が第1フェーズの変換処理中である場合、問い合わせ処理部101は、KVデータ記憶部201と差分データ記憶部202からデータを取得する。また、第2フェーズの変換処理中である場合は、問い合わせ処理部101は、変換データ記憶部203と差分データ記憶部202からデータを取得する。
【０１２１】
次に、問い合わせ処理部101は、クエリの解析結果から、入力されたクエリが挿入処理を行うクエリであるかどうかを判断する（ステップS003）。挿入処理を行うクエリである場合、問い合わせ処理部101はクエリを解析した結果とシステムカタログ205から取得した情報を基にデータの挿入処理を行う（ステップS004）。
【０１２２】
この時、処理対象のKVデータ群が第1フェーズの変換処理中である場合、問い合わせ処理部101はKVデータ記憶部201ではなく、差分データ記憶部202にデータを書き込む。また、第2フェーズの変換処理中である場合は、問い合わせ処理部101はKVデータ記憶部201ではなく、変換データ記憶部203にデータを書き込む。
【０１２３】
問い合わせ処理部101は挿入処理が完了すると、結果をクライアント300に返却する（ステップS005）。また、問い合わせ処理部101は前述したように必要に応じてシステムカタログ205の情報更新も行う。
【０１２４】
次に、挿入クエリではなかった場合、統計情報収集のステップS006で、問い合わせ処理部101が統計情報収集部102に対して統計情報を入力する。この処理はデータ構造変換前の動作と変わらないため説明を省略する。
【０１２５】
次に、問い合わせ処理部101は、入力されたクエリが更新処理を行うクエリであるか、参照処理を行うクエリであるかを判断する（ステップS007）。更新処理を行うクエリである場合、問い合わせ処理部101はデータの更新処理を行うが（ステップS008）、この時、処理対象のKVデータ群が第1フェーズの変換処理中である場合は、KVデータ記憶部201ではなく、差分データ記憶部202にデータを書き込む。また、第2フェーズの変換処理中である場合、問い合わせ処理部101はKVデータ記憶部201ではなく、変換データ記憶部203にデータを書き込む。問い合わせ処理部101は更新処理が完了すると、結果をクライアント300に返却する（ステップS009）。
【０１２６】
入力されたクエリが参照処理を行うクエリである場合、問い合わせ処理部101は、ステップS002で取得したKVデータを参照処理結果としてクライアント300に返却する（ステップS010）。
【０１２７】
なお、データ構造変換部103が第2フェーズの変換処理を実行している間は、問い合わせ処理部101は変換データ記憶部203と差分データ記憶部202からデータを取得するが、それぞれに同じレコードのデータが含まれる可能性がある。この場合、問い合わせ処理部101は変換データ記憶部203と差分データ記憶部202のそれぞれから取得したデータに含まれる更新時間情報を基に最新のデータを特定して取得する。
【０１２８】
＜効果＞
本実施の形態にかかるKVデータ構造変換装置100は、ユーザが実行するクエリによるデータへのアクセス傾向が変わっても性能低下を抑制する。その理由は、データ構造変換部103が、ユーザが実行するクエリによる、KVデータへのアクセス傾向に合わせて、格納しているKVデータの構造を変換するからである。すなわち、データ構造変換部103は、使用頻度が高い列がレンジキー列となるようにKVデータの構造変換を行う。
【０１２９】
これにより、クエリを実行する問い合わせ処理部101は、KVデータへのアクセスを減らすことができ、クエリの処理性能（TAT、スループット）を向上させることができる。
【０１３０】
＜第2の実施形態＞
次に、本発明の第2の実施形態について説明する。
【０１３１】
図１１は、本実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。図１１に示すように、本実施形態のKVデータ構造変換装置100は、図１に示した第1の実施形態のKVデータ構造変換装置100の構成要素に加えて、リソース負荷監視部105を備える点で異なる。
【０１３２】
本実施形態のKVデータ構造変換装置100は、データ構造変換部103はユーザからの指示やタイマーによって動作するのではなく、リソース負荷監視部105からの動作指示によって動作を開始する。
【０１３３】
リソース負荷監視部105は、KVデータ構造変換装置100のリソースの使用量を定期的に監視する。監視されるリソースの使用量は、例えば、CPU使用率、ディスク入出力量である。リソース負荷監視部105は、KVデータ構造変換装置100のリソースの使用量が設定された閾値より少ない場合にデータ構造変換部103に動作を指示する。
【０１３４】
変換するデータの量が多い場合、データ構造変換処理は高負荷な処理となる可能性がある。データ構造変換処理中もクライアント300からのクエリ処理は実行可能であるが、データ構造変換処理に多くのリソースが割かれている場合、クライアント300からのクエリ処理の性能が劣化することが考えられる。
【０１３５】
このように、本実施の形態のKVデータ構造変換装置100は、リソースの負荷が低い時にデータ構造変換処理を行うことによってリソースを有効に利用することができ、クライアント300が要求するクエリ処理の性能劣化を抑えることができる。
【０１３６】
＜第3の実施形態＞
次に、本発明の第3の実施形態について説明する。
【０１３７】
図１２は、本実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。図１２に示すように、本実施形態のKVデータ構造変換装置100は、図１に示した第1の実施形態のKVデータ構造変換装置100の構成要素に加えて、統計情報管理部106を備える点で異なる。
【０１３８】
本実施形態のKVデータ構造変換装置100では、統計情報管理部106が、統計情報記憶部204に格納されている統計情報を定期的に削除する。削除対象の統計情報は、例えば、現在より一定時間以上過去のものとする。「一定時間」を示す値は、ユーザが予め統計情報管理部106に設定しておけば良い。この値は、システム運用中に変更することも可能である。
【０１３９】
統計情報管理部106が、定期的に統計情報記憶部204に格納されている古い統計情報を削除することによって、統計情報記憶部204に格納されている統計情報を最新のものだけにすることができる。構造変換判断部113が、KVデータ構造を変換するかどうかを判断する場合、一定時間以上過去の統計情報を基に判断するよりも、現在の時間に近い統計情報を基に判断した方が、精度が高くなる。これは、過去のアクセス傾向よりも現在のアクセス傾向の方が、重要度が高い場合があるためである。
【０１４０】
このように、本実施形態のKVデータ構造変換装置100は、最近の統計情報だけを利用してデータ構造を変換するかどうかを判断することができ、データ構造変換の判断をより正確に行うことができる。
【０１４１】
＜第4の実施形態＞
次に、本発明の第4の実施形態について説明する。
【０１４２】
図１３は、本実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。図１３に示すように、本実施形態のKVデータ構造変換装置100は、図１に示した第1の実施形態のKVデータ構造変換装置100の構成要素に加えて、構造変換計画作成部107を備える点で異なる。
【０１４３】
本実施形態のKVデータ構造変換装置100では、データ構造変換部103がユーザからの指示やタイマーによって定期的に、統計情報記憶部204に記憶されている統計情報を取得して構造変換するかどうかを判断するのではない。構造変換計画作成部107が、定期的に統計情報記憶部204に記憶されている統計情報を取得し、構造変換を実施する計画を作成して、データ構造変換部103に構造変換の指示を出す。
【０１４４】
データベースシステムに対する問い合わせの傾向は、日付や時間帯によってある程度パターンが決まっている場合がある。例えば、週末には特定の属性値による検索が多く行われるといったパターンである。このような場合に、構造変換計画作成部107が予め特定のパターンに従った構造変換計画を作成し、その計画に基づいて構造変換処理が実行されることで、より効率的な構造変換を実施することができる。
【０１４５】
図１４は、本実施形態における構造変換計画作成部107の動作を示すフローチャートである。
【０１４６】
まず、統計情報取得のステップS201で、構造変換計画作成部107は統計情報記憶部204に記憶されている統計情報を取得する。
【０１４７】
次に、システムカタログ205取得のステップS202で、構造変換計画作成部107はシステムカタログ205に格納されている変換履歴を取得する。本実施の形態においてシステムカタログ205は、システム運用開始時からの構造変換履歴を格納している。
【０１４８】
図１５は、システムカタログ205に格納されている変換履歴の構成を示す。データ構造変換部103は、KVデータの構造変換をする都度、変換の対象となったKVデータのテーブル名とクラスタキー値、変換後のレンジキー列、および、構造変換実施時間の履歴をシステムカタログ205に格納する。例えば、図１５の例は、テーブルAの機器Aをクラスタキー値とするKVデータ群のレンジキー列は2016/07/04 00:00から2016/07/29 00:00まではログID列であり、2016/07/29 00:00からはログ発生時間列であることを示す。
【０１４９】
次に、構造変換計画作成のステップS203で、構造変換計画作成部107は取得した統計情報とシステムカタログ205の情報から構造変換計画を作成する。
【０１５０】
計画を作成するパターンとしては、例えば、時間帯、曜日、日付、月などが考えられる。構造変換計画作成部107は、統計情報記憶部204に格納されている統計情報、システムカタログ205に格納されている情報、またはその両者から時間帯、曜日、日付、月ごとのアクセスパターンを解析し、構造変換計画を作成する。
【０１５１】
構造変換計画作成部107は、例えば、システムカタログ205に格納されている構造変換履歴から、年月日、曜日、および、時間帯の何れか１つまたはその組み合わせに基づいて周期的に発生する期間と当該期間に変換されたKVデータの新しいレンジキー列を特定する。構造変換計画作成部107は、クラスタキー、特定した期間とレンジキー列の組み合わせを構造変更計画として登録する。
【０１５２】
登録される構造変換計画は、例えば、「機器Aをクラスタキー値とするKVデータ群は土曜日の12:00から日曜日の12:00まではログ発生時間列をレンジキー列とするKVデータ構造に変換する」といったものである。あるいは、構造変換計画は、「機器Bをクラスタキー値とするKVデータ群は月末日の15:00から翌月初日の15:00まではポート番号列をレンジキー列とするKVデータ構造に変換する」といったものでも良い。
【０１５３】
構造変換計画作成部107は、統計情報記憶部204に格納されている統計情報から、年月日、曜日、および、時間帯の何れか１つまたはその組み合わせに基づいて周期的に発生する期間と当該期間に最も多くのクエリで使用されたレンジキー列を特定しても良い。
【０１５４】
次に、構造変換計画作成部107は、既存の計画と比較して構造変換計画を更新（まだ作成されていない場合は新規に作成）するかどうかを判断する（ステップS204）。
【０１５５】
構造変換計画を更新（作成）するKVデータ群が存在する場合は、構造変換計画更新のステップS205で、構造変換計画作成部107は自身が保存している構造変換計画を、ステップS203で作成した構造変換計画で更新する。
【０１５６】
構造変換計画作成部107は、自身が保存している構造変換計画に従って、登録されている周期的に発生する期間の初めに、データ構造変換部103に構造変換の指示を出す。この指示は、構造変換後に使用するレンジキー列が指定されている。データ構造変換部103は、構造変換計画作成部107からの指示に基づいてデータ構造の変換を行う。
【０１５７】
構造変換計画作成部107は、定期的に、構造変換計画更新処理を実行すれば良い。また、構造変換計画作成部107が動作するタイミングに関しては、ユーザが構造変換計画作成部107に予め設定しておけば良い。
【０１５８】
なお、本実施の形態にかかるKVデータ構造変換装置100において、データ構造変換部103は、構造変換計画作成部107から起動されたとき以外は、第1の実施の形態と同じ動作をする。すなわち、構造変換計画作成部107が、固定的なパターンを特定できなかった期間については、データ構造変換部103は、第１の実施形態で説明したように、直近一定期間の統計情報に基づいた構造変換を実行する。
【０１５９】
このように、本実施の形態にかかるKVデータ構造変換装置100は、表形式のデータに対する問い合わせの傾向が固定的なパターンを持っている場合に、予めパターンに従った構造変換計画を作成し、その計画に基づいて構造変換処理を実行する。このことによって、本実施の形態にかかるKVデータ構造変換装置100は、より効果的な構造変換を実施することができる。
【０１６０】
＜第５の実施形態＞
図１７は、第5の実施の形態にかかるKVデータ構造変換装置100の構成を示す図である。KVデータ構造変換装置100は、問い合わせ処理部101、統計情報収集部102、データ構造変換部103、および、KVデータ記憶部201を備える。
【０１６１】
本実施の形態において、データ構造変換部103は、第1の実施の形態における、KVデータ削除部104、構造変換判断部113、および、バリュー部変更部123を包含し、一体に構成されている。
【０１６２】
さらに、データ構造変換部103は、第1の実施の形態と同様に動作しても良いが、KVデータ記憶部201からKVデータを得て構造変換を実施し、変換結果をKVデータ記憶部201に書き戻しても良い。すなわち、KVデータ記憶部201は、構造変換中は、変換前後の2世代のKVデータを格納しても良い。この場合、データ構造変換部103は、構造変換終了後、KVデータ記憶部201内の変換前のKVデータを削除する。
【０１６３】
また、本実施の形態においては、問い合わせ処理部101は、第1の実施の形態と同様に動作しても良いが、構造変換中は、新たなクエリの実行を待ち合わせても良い。あるいは、クエリが実行されない時間帯、例えば深夜に、データ構造変換部103が、構造変換を実施しても良い。このような場合、KVデータ構造変換装置100は、差分データに関する処理を行わなくて良い。
【０１６４】
本実施の形態において、KVデータ記憶部201は、表の行に含まれるデータであるレコードデータの各々が、当該表の第１の列の値をレンジキーとして、レンジキーの値順に所定数ずつ平衡木の各葉ノードに格納されているKVデータを記憶する。問い合わせ処理部101は、クエリで指定された表の列の値が指定された範囲にあるレコードデータを、KVデータから検索して更新または参照処理を実行する。
【０１６５】
統計情報収集部102は、列対応に、当該列がクエリで指定された回数を含む統計情報を蓄積する。データ構造変換部103は、回数が最大の列（以降、第２の列）を選択し、KVデータ記憶部201内のKVデータを、第２の列の値をレンジキーとするKVデータへ変換する。
【０１６６】
本実施の形態にかかるKVデータ構造変換装置100は、ユーザが実行するクエリによるデータへのアクセス傾向が変わっても性能低下を抑制する。その理由は、データ構造変換部103が、ユーザが実行するクエリによる、KVデータへのアクセス傾向に合わせて、格納しているKVデータの構造を変換するからである。すなわち、データ構造変換部103は、使用頻度が高い列がレンジキー列となるようにKVデータの構造変換を行う。
【０１６７】
これにより、クエリを実行する問い合わせ処理部101は、KVデータへのアクセスを減らすことができ、クエリの処理性能（TAT、スループット）を向上させることができる。
【０１６８】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【０１６９】
100    KVデータ構造変換装置
101    問い合わせ処理部
102    統計情報収集部
103    データ構造変換部
104    KVデータ削除部
105    リソース負荷監視部
106    統計情報管理部
107    構造変換計画作成部
113    構造変換判断部
123    バリュー部変更部
201    KVデータ記憶部
202    差分データ記憶部
203    変換データ記憶部
204    統計情報記憶部
205    システムカタログ
300    クライアント
600    コンピュータ装置
610    プロセッサ
620    外部記憶装置
630    主記憶部
640    バス
650    プログラム
【図１】
2018081603.tif 000003
【図２】
2018081603.tif 000004
【図３】
2018081603.tif 000005
【図４】
2018081603.tif 000006
【図５】
2018081603.tif 000007
【図６】
2018081603.tif 000008
【図７】
2018081603.tif 000009
【図８】
2018081603.tif 000010
【図９】
2018081603.tif 000011
【図１０】
2018081603.tif 000012
【図１１】
2018081603.tif 000013
【図１２】
2018081603.tif 000014
【図１３】
2018081603.tif 000015
【図１４】
2018081603.tif 000016
【図１５】
2018081603.tif 000017
【図１６】
2018081603.tif 000018
【図１７】
2018081603.tif 000019