(57)【要約】【課題】列指向のデータベースにおいて、サーバ・クライアント間のネットワークトラフィックの増大を防ぐことが難しい、という問題を解決すること。【解決手段】データベースサーバに対して問合せを実行するクライアントと、クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバと、を有するデータベースシステムであって、データベースサーバは、複数の列を有する実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する。【選択図】図２
2016177347.tif 000002
【特許請求の範囲】
【請求項１】
データベースサーバに対して問合せを実行するクライアントと、前記クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバと、を有するデータベースシステムであって、
前記データベースサーバは、複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
データベースシステム。
【請求項２】
請求項１に記載のデータベースシステムであって、
前記データ送信部は、前記複数のデータ構造のそれぞれを用いた際のデータを前記クライアントに転送する際のデータ転送量に基づいて選択されたデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースシステム。
【請求項３】
請求項２に記載のデータベースシステムであって、
前記データ送信部は、前記複数のデータ構造のうちの前記データ転送量が最も小さくなるデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースシステム。
【請求項４】
請求項１乃至３のいずれかに記載のデータベースシステムであって、
前記実行結果の表の各列に対して、複数のデータ構造におけるデータ転送量を示す転送コストをそれぞれ算出し、当該算出した転送コストに基づいてデータを転送する際のデータ構造を列ごとに選択するデータ構造選択部を有し、
前記データ送信部は、前記データ構造選択部が列ごとに選択したデータ構造を用いて、列ごとにデータを送信する
を有する
データベースシステム。
【請求項５】
請求項４に記載のデータベースシステムであって、
前記データ構造選択部は、データを値の一覧である値リストと前記値リストのうちの該当する位置を示す値番号との組み合わせで表現するデータ構造と、行番号に対応する値の配列で構成されるデータ構造と、の前記転送コストを算出し、当該算出した転送コストに基づいてデータを転送する際のデータ構造を列ごとに選択する
データベースシステム。
【請求項６】
請求項１乃至５に記載のデータベースシステムであって、
前記クライアントは、前記データベースサーバから送信されたデータを一時的に記憶する一時データ記憶部を有し、
前記データベースサーバの前記データ送信部は、前記一時データ記憶部が記憶するデータに基づいて選択された前記複数のデータ構造のうちのいずれかを用いて送信する
データベースシステム。
【請求項７】
請求項５に記載のデータベースシステムであって、
前記クライアントは、前記一時データ記憶部に記憶されたデータが所定の条件を満たす場合に、当該一時データ記憶部が記憶するデータをストレージ装置に移動させる
データベースシステム。
【請求項８】
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバであって、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
データベースサーバ。
【請求項９】
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含み複数の列項目を有する問合せの実行結果の表を送信する際に、
前記実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信する
情報処理方法。
【請求項１０】
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバに、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信手段を実現させるための
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、列指向のデータベースシステム、データベースサーバ、情報処理方法、プログラムに関する。
【背景技術】
【０００２】
表の１列１列を一つのかたまりとしてデータを格納する列指向データベースが知られている。列指向データベースでは、列方向にデータをまとめている。そのため、列指向データベースは集計などの処理を高速に行うことに優れており、大量データの一括更新を行うようなバッチ処理や大量データの集計や分析などを行う場合に活用されている。
【０００３】
また、列指向データベースの中にはＦＡＳＴ（Ｆｉｌｔｅｒ  Ａｒｒａｙ  Ｓｔｒｕｃｔｕｒｅ）構造を持つものがあることが知られている。ＦＡＳＴ構造は、データを順序、位置、値などに分解して管理しており、サーバ内の処理性能に優れている。
【０００４】
ＦＡＳＴ構造を有する列指向データベースについての技術としては、例えば、特許文献１が知られている。特許文献１には、テーブル抽出部と値リスト変換部とポインタ処理部と情報ブロック管理部とを備えたＣＰＵが記載されている。特許文献１によると、情報ブロック管理部が取り出した情報ブロックの値リストをテーブル抽出部が参照して、共有化すべき値リストを抽出する。続いて、値リスト変換部が、項目値の変換が必要となる値リストに項目値を挿入する。その後、ポインタ処理部がポインタ値を変換するとともに、必要な他のポインタ配列を生成する。特許文献１によると、このような処理により、ＦＡＳＴ構造で表された複数の表を結合することが出来る。
【０００５】
また、データベースにおいては、複数のデータノードにデータを分散して格納する分散ストレージシステムが知られている。分散ストレージシステムを利用とした技術としては、例えば、特許文献２がある。特許文献２には、論理的には同一であるが物理的には異なるデータ構造を有する少なくとも２つのデータノードを含む分散ストレージシステムが記載されている。特許文献２によると、このように構成することで、データの利用形態の特性が異なるアプリケーションなどに対しても迅速に応答することが可能となり、応答性能の低下などを回避することが可能となる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許第４４２８４８８号
【特許文献２】ＷＯ２０１２／１２１３１６号
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１に記載のようなＦＡＳＴ構造を利用している場合、データの整合性を確保するために膨大な値リストを送信する必要がある場合があり、その結果、ネットワークトラフィックが増加してしまうことがある、という問題が生じていた。また、特許文献２でも、同様の問題が生じる可能性があった。
【０００８】
この問題に対しては、ＦＡＳＴ構造から行指向のデータ構造へ変換してからクライアントに送信することで不必要なデータの送信を防ぐ、という対処法が知られている。しかしながら、行指向のデータ構造に変換した場合、重複するデータを送ってしまう場合がある。このように、行指向のデータ構造へ変換したとしても、ネットワークトラフィックの増大を防ぐことが難しい場合があった。
【０００９】
以上のように、列指向のデータベースにおいては、サーバ・クライアント間のネットワークトラフィックの増大を防ぐことが難しい、という問題が生じていた。
【００１０】
そこで、本発明の目的は、列指向のデータベースにおいて、サーバ・クライアント間のネットワークトラフィックの増大を防ぐことが難しい、という問題を解決するデータベースシステムを提供することにある。
【課題を解決するための手段】
【００１１】
かかる目的を達成するため本発明の一形態であるデータベースシステムは、
データベースサーバに対して問合せを実行するクライアントと、前記クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバと、を有するデータベースシステムであって、
前記データベースサーバは、複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
という構成を採る。
【００１２】
また、本発明の他の形態であるデータベースサーバは、
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバであって、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
という構成を採る。
【００１３】
また、本発明の他の形態である情報処理方法は、
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含み複数の列項目を有する問合せの実行結果の表を送信する際に、
前記実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信する
という構成を採る。
【００１４】
また、本発明の他の形態であるプログラムは、
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバに、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信手段を実現させるためのプログラムである。
【発明の効果】
【００１５】
本発明は、以上のように構成されることにより、列指向のデータベースにおいて、サーバ・クライアント間のネットワークトラフィックの増大を防ぐことが難しい、という問題を解決するデータベースシステムを提供することが可能となる。
【図面の簡単な説明】
【００１６】
【図１】本発明の第１の実施形態に係るデータベースシステムの全体の構成を示すブロック図である。
【図２】本発明の第１の実施形態に係るクライアントとデータベースサーバとの構成を示すブロック図である。
【図３】ＦＡＳＴ構造を説明するための図である。
【図４】結果セットデータ構造判定部が値番号／値リストのデータ構造を選択した場合に行う値番号の再計算処理を説明するための図である。
【図５】結果セットデータ構造判定部が値配列のデータ構造を選択した場合に行う値配列の作成処理を説明するための図である。
【図６】データベースシステムの全体的な動作を説明するためのフローチャートである。
【図７】データベースサーバに格納されている表の一例を示す図である。
【図８】クエリの実行結果の表の一例を示す図である。
【図９】結果セットデータ構造判定部が行う転送コストの算出及びデータ構造の選択を説明するための図である。
【図１０】結果セットデータ構造判定部が行う転送コストの算出及びデータ構造の選択を説明するための図である。
【図１１】結果セット取得部が付加するヘッダ情報を説明するための図である。
【図１２】結果セット取得部が付加するヘッダ情報を説明するための図である。
【図１３】結果セット取得部が付加するヘッダ情報を説明するための図である。
【図１４】データ読取部により行われるデータへのアクセスの仕方を説明するための図である。
【図１５】データ読取部により行われるデータへのアクセスの仕方を説明するための図である。
【図１６】データベースシステムがクエリの実行を行う際の動作の一例を示すシーケンス図である。
【図１７】クライアントが結果セットの取得を行う際の動作の一例を示すシーケンス図である。
【図１８】データベースシステムがクエリを終了する際の動作の一例を示すシーケンス図である。
【図１９】本発明の第２の実施形態に係るデータベースシステムの概要を説明するための図である。
【図２０】本発明の第２の実施形態に係るクライアントとデータベースサーバとの構成を示すブロック図である。
【図２１】結果セット取得部が付加するヘッダ情報を説明するための図である。
【図２２】本発明の第２の実施形態に係るデータベースシステムの動作の一例を示すシーケンス図である。
【図２３】本発明の第２の実施形態に係る結果セットデータ構造判定部が値リストＩＤの確認結果に応じた処理を行う際の動作の一例を示すフローチャートである。
【図２４】本発明の第３の実施形態に係るクライアントとデータベースサーバとの構成を示すブロック図である。
【図２５】値リスト永続化表の構成の一例を示す図である。
【図２６】本発明の第４の実施形態に係るデータベースシステムの構成の概要を示す概略ブロック図である。
【発明を実施するための形態】
【００１７】
［第１の実施形態］
図１は、データベースシステム３の全体の構成を示すブロック図である。図２は、クライアント１とデータベースサーバ２との構成を示すブロック図である。図３は、ＦＡＳＴ構造（順序集合２４１１と値番号／値リスト２４１２）を説明するための図である。図４は、結果セットデータ構造判定部２５が値番号／値リスト２４１２のデータ構造を選択した場合に行う値番号の再計算処理を説明するための図である。図５は、結果セットデータ構造判定部２５が値配列２４２のデータ構造を選択した場合に行う値配列２４２の作成処理を説明するための図である。図６は、データベースシステム３の全体的な動作を説明するためのフローチャートである。図７は、データベースサーバ２のデータ領域２４に格納されている表の一例を示す図である。図８は、クエリの実行結果の表の一例を示す図である。図９、１０は、結果セットデータ構造判定部２５が行う転送コストの算出及びデータ構造の選択を説明するための図である。図１１〜１３は、結果セット取得部２６が付加するヘッダ情報を説明するための図である。図１４、１５は、データ読取部１２１により行われるデータへのアクセスの仕方を説明するための図である。図１６は、データベースシステム３がクエリの実行を行う際の動作の一例を示すシーケンス図である。図１７は、クライアント１が結果セットの取得を行う際の動作の一例を示すシーケンス図である。図１８は、データベースシステムがクエリを終了する際の動作の一例を示すシーケンス図である。
【００１８】
図１で示すように、本発明の第１の実施形態では、クライアント１とデータベースサーバ２とを有するデータベースシステム３について説明する。クライアント１は、データベースサーバ２に対してクエリ（問合せ、処理要求）を送信する。データベースサーバ２は、クライアント１からクエリを受信すると、クエリを実行して、各問合せに対する回答をレコード（各行）で表すクエリの実行結果の表をＦＡＳＴ（Ｆｉｌｔｅｒ  Ａｒｒａｙ  Ｓｔｒｕｃｔｕｒｅ）構造で生成する。そして、データベースサーバ２は、クエリの実行結果の表をクライアント１に対して送信する。後述するように、本実施形態におけるデータベースサーバ２は、複数の列を有するクエリの実行結果の表を送信する際に、実行結果の表の各列に対して複数のデータ構造における転送コストをそれぞれ算出する。そして、データベースサーバ２は、算出結果に基づいて列ごとにデータ構造を選択し、当該選択したデータ構造で列ごとにクエリの実行結果の表を送信する。
【００１９】
なお、クライアント１とデータベースサーバ２とは、例えばネットワークを介して接続されており、互いに通信可能なよう構成されている。また、データベースサーバ２と接続されたクライアント１の数は、１つでも構わないし、２つ以上の複数でも構わない。
【００２０】
クライアント１は、情報処理装置である。クライアント１は、図示しない演算装置（ＣＰＵ：Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）と、記憶装置と、を有している。クライアント１は、記憶装置が有するプログラムをＣＰＵが実行することで、後述するアプリケーション１１とクライアントドライバ１２とを実現するよう構成されている。
【００２１】
図２を参照すると、本実施形態におけるクライアント１は、アプリケーション１１とクライアントドライバ１２とを有している。
【００２２】
アプリケーション１１は、データベースサーバ２を利用する任意のアプリケーションである。アプリケーション１１は、例えば、Ｊａｖａ（登録商標）アプリケーションである。なお、アプリケーション１１は、Ｊａｖａアプリケーション以外であっても構わない。
【００２３】
クライアントドライバ１２は、アプリケーション１１とデータベースサーバ２との間のインターフェースである。クライアントドライバ１２は、例えば、アプリケーション１１からの要求に応じてデータベースサーバ２に対してクエリを送信したり、結果セット取得要求を送信したりする。また、クライアントドライバ１２は、例えば、データベースサーバ２からクエリの結果の表を受信して、アプリケーション１１に渡す。このように、クライアントドライバ１２は、アプリケーション１１がデータベースサーバ２を利用する際に利用される。クライアントドライバ１２は、例えば、ＪＤＢＣ／ＯＤＢＣ（Ｏｐｅｎ  Ｄａｔａｂａｓｅ  Ｃｏｎｎｅｃｔｉｖｉｔｙ）ブリッジドライバである。なお、クライアントドライバ１２は、ＪＤＢＣ／ＯＤＢＣ以外のドライバであっても構わない。
【００２４】
図２で示すように、クライアントドライバ１２は、データ読取部１２１とデータ領域１２２とを有している。
【００２５】
データ読取部１２１は、データベースサーバ２から、クエリの実行結果の表を列ごとに受信する。例えば、データ受取部１２１は、データベースサーバ２からＴＣＰ／ＩＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ／Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）で転送されたデータを受信する。すると、データ受取部１２１は、当該受信したデータのヘッダ情報を参照して、受信したデータのデータ構造を識別する。そして、データ受取部１２１は、受信したデータをデータ領域１２２（の後述する結果セット格納領域１２２１）に格納する。
【００２６】
データ領域１２２は、半導体メモリなどの記憶装置である。データ領域１２２には、結果セット格納領域１２２１が設けられている。上記のように、結果セット格納領域１２２１には、データ読取部１２１がデータベースサーバ２から受信したデータが記憶される。結果セット格納領域１２２１は、例えば、クライアントドライバ１２により問合せ（クエリ）ごとに生成され、クライアントドライバ１２により問合せの終了と同時に破棄される。
【００２７】
データベースサーバ２は、情報処理装置である。データベースサーバ２は、図示しない演算装置（ＣＰＵ）と、記憶装置と、を有している。データベースサーバ２は、記憶装置が有するプログラムをＣＰＵが実行することで、後述する各機能（各部）を実現するよう構成されている。
【００２８】
図２を参照すると、データベースサーバ２は、クエリ解析部２１と、実行計画部２２と、クエリ実行部２３と、データ領域２４と、結果セットデータ構造判定部２５と、結果セット取得部２６と、を有している。
【００２９】
クエリ解析部２１は、クライアントドライバ１２から送信されたクエリを構文解析する。つまり、クエリ解析部２１は、クライアントドライバ１２からクエリを受信する。そして、クエリ解析部２１は、受信したクエリの構文解析を実行する。その後、クエリ解析部２１は、解析結果を実行計画部２２へ送信する。
【００３０】
実行計画部２２は、クエリ解析部２１が構文解析したクエリをどのような順序、方法で行えば効率的であるかを判定し、その実行計画を作成する。そして、実行計画部２２は、作成した実行計画をクエリ実行部２３に送信する。
【００３１】
クエリ実行部２３は、実行計画部２２で作成した実行計画に従って、データ領域２４に対してデータ操作を行う。クエリ実行部２３は、クエリの実行結果の表をデータ領域２４に記憶することになる。
【００３２】
データ領域２４は、半導体メモリやディスク装置などの記憶装置である。データ領域２４には、データベースサーバ２のデータベースに登録されている表や、データベースサーバ２に対する問合せの結果（クエリ実行部２３によるクエリの実行結果の表）が、表データ２４１として格納されている。
【００３３】
表データ２４１は、順序集合２４１１と複数の値番号／値リスト２４１２とから構成されている。このように、本実施形態におけるデータベースサーバ２は、表データをＦＡＳＴ構造で保管している。
【００３４】
順序集合２４１１は、値番号／値リスト２４１２のうちの参照する値番号の位置を示している。例えば、図３で示す順序集合２４１１のうちの添え字（ｉｄｘ）「０」の順序集合「１」は、値番号／値リスト２４１２のうちの添え字「１」を参照することを示している。つまり、行番号（順序集合の添え字）に対応する順序集合２４１１の要素は、値番号の添え字に該当することになる。
【００３５】
値番号／値リスト２４１２は、データを値の一覧である値リストと前記値リストのうちの該当する位置を示す値番号との組み合わせで表現している。例えば、図３で示す値番号／値リスト２４１２のうちの添え字「１」の値番号「２」は、値番号／値リスト２４１２のうちの値リストの添え字「２」を参照する（値リスト＝Ｚ）ことを示している。このように、値番号の要素は値リストの添え字を示している。
【００３６】
なお、図２では１つの順序集合２４１１を示したが、順序集合２４１１は複数あっても構わない。
【００３７】
また、データ領域２４には、値配列２４２を格納することが出来る。値配列２４２は、行番号に対応する値の配列で構成されるデータである。値配列２４２は、結果セットデータ構造判定部２５により順序集合２４１１と値番号／値リスト２４１２から生成される。値配列２４２の詳細については後述する。
【００３８】
結果セットデータ構造判定部２５は、結果セット（クエリ実行部２３により実行されたクエリの実行結果の表）の各列に対して、複数のデータ構造のそれぞれを用いた場合のデータ転送量を示す転送コストをそれぞれ算出する。そして、結果セットデータ構造判定部２５は、算出した転送コストに基づいて、結果セットの各列に対してどのデータ構造で転送するかをそれぞれ判定する。
【００３９】
具体的には、結果セットデータ構造判定部２５は、結果セットの各列に対して、値番号／値リスト２４１２及び値配列２４２の総バイト数を見積もり、その値を転送コストとする。つまり、結果セットデータ構造判定部２５は、データ構造として値番号／値リスト２４１２を用いた場合の転送コストと、データ構造として値配列２４２を用いた場合の転送コストと、を算出する。そして、結果セットデータ構造判定部２５は、転送コストの少ない方のデータ構造を選択する。
【００４０】
また、結果セットデータ構造判定部２５は、転送する際に用いるデータ構造を選択すると、当該選択したデータ構造に応じた処理を行う。
【００４１】
例えば、結果セットデータ構造判定部２５は、値番号／値リスト２４１２を選択した場合、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。つまり、結果セットデータ構造判定部２５は、図４で示すように、順序集合２４１１の要素を添え字としたときの値番号の要素を、新しい値番号（新値番号）の要素となるように、再計算する。例えば、図４を参照すると、添え字「０」の順序集合２４１１の要素「５」を添え字としたときの値番号の要素は「１」である。そこで、結果セットデータ構造判定部２５は、添え字「０」の新値番号の要素を「１」に再計算する。このような処理を繰り返して、結果セットデータ構造判定部２５は、値番号の添え字を行番号に対応させる。
【００４２】
このように、結果セットデータ構造判定部２５は、値番号／値リスト２４１２を選択した場合、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。このような処理を行うことで、転送する結果セットに順序集合２４１１を含める必要がなくなることになる。
【００４３】
また、結果セットデータ構造判定部２５は、値配列２４２を選択した場合、対応する値番号／値リスト２４１２に基づいて、値配列２４２を作成する。例えば、図５を参照すると、結果セットデータ構造判定部２５は、行番号に対応する順序集合２４１１の要素を値番号の添え字としたときの値番号の要素を求める。次に、求めた値番号を値リストの添え字としたときの値リストの要素を求める。ここで、値リストの各要素は実際のデータを意味している。そのため、結果セットデータ構造判定部２５は、上記求めた値リストの要素を値配列２４２に追加していくことで、値配列２４２を作成する。
【００４４】
このように、結果セットデータ構造判定部２５は、値配列２４２を選択した場合、行番号が添え字に対応するように値リストの各要素を追加することで、値配列２４２を作成する。
【００４５】
結果セット取得部２６は、クライアントドライバ１２から結果セット取得要求を受け付ける。また、結果セット取得部２６は、クライアントドライバ１２から受け付けた結果セット取得要求に応じて、クライアントドライバ１２に対して結果セットを転送する。
【００４６】
具体的には、結果セット取得部２６は、結果セット取得要求に応じて、結果セットを列ごとに送信する。また、結果セット取得部２６は、結果セットを列ごとに送信する際に、結果セットデータ構造判定部２５が選択したデータ構造の識別情報を含むヘッダ情報を付加する。
【００４７】
以上が、本実施形態におけるデータベースシステム３の構成についての説明である。次に、上記構成のデータベースシステム３が行う処理について具体例を挙げて説明する。
【００４８】
図６で示すように、データベースシステム３の処理は、大きく、クエリの実行（ステップＳ００１）、結果セットの取得（ステップＳ００２）、クエリの終了（ステップＳ００３）の３つの部分に分けることが出来る。以下、各部分の処理について説明する。
【００４９】
まず、クエリの実行について説明する。この処理は、一般的なリレーショナルデータベースシステムと同様の処理となる。
【００５０】
つまり、クライアントドライバ１２が送信したクエリをクエリ解析部２１が受信すると、クエリ解析部２１は、受信したクエリの構文解析を実行する。その後、クエリ解析部２１は、解析結果を実行計画部２２へ送信する。続いて、実行計画部２２は、クエリ解析部２１が構文解析したクエリをどのような順序、方法で行えば効率的であるかを判定し、その実行計画を作成する。そして、実行計画部２２は、作成した実行計画をクエリ実行部２３に送信する。その後、クエリ実行部２３は、実行計画部２２で作成した実行計画に従ってクエリを実行する。これにより、クエリ実行部２３は、クエリに対する実行結果の表を作成してデータ領域２４の表データ２４１に格納する。なお、クエリ実行部２３が作成する実行結果の表は、ＦＡＳＴ構造である。
【００５１】
具体的に、例えば、データベースサーバ２の表データ２４１に図７で示す「顧客表」が格納されているとする。つまり、図７で示すように、顧客ＩＤ、姓、名、都道府県、登録日、更新日、などの列を有する表が１００万件登録されていたとする。そして、この時に、下記式で示すクエリを実行したとする。
SELECT 顧客ID, 都道府県 FROM 顧客表 WHERE 登録日<’2009-01-01’;
【００５２】
その結果、クエリ実行部２３は、例えば、図８で示すような実行結果の表をデータ領域２４の表データ２４１にＦＡＳＴ構造で格納する。つまり、例えば、「顧客表」に登録日が２００９年１月１日よりも前のデータが５０００件ある場合、クエリ実行部２３は、０から４９９９までを示す順序集合を格納する。この際、顧客ＩＤ列と、都道府県列とは、元の表のままであるため、元の顧客表のデータを参照することになる。
【００５３】
次に、結果セットの取得について説明する。
【００５４】
結果セット取得部２６がクライアントドライバ１２から結果セット取得要求を受信すると、結果セット取得部２６は、クライアントドライバ１２から受け付けたクエリに対する実行結果の表を取得する。
【００５５】
結果セットデータ構造判定部２５は、結果セット取得部２６が取得した実行結果の表の各列に対して、値番号／値リスト２４１２の転送コストと、値配列２４２の転送コストと、の算出を行う。そして、結果セットデータ構造判定部２５は、転送コストが小さいデータ構造を選択して、当該選択したデータ構造に応じた処理を行う。
【００５６】
例えば、結果セットデータ構造判定部２５は、下記式を用いて値番号／値リスト２４１２の転送コストと、値配列２４２の転送コストと、を算出する。
［値番号／値リストのデータ構造の転送コスト］
値番号の型のバイト数×順序集合の要素数＋値リストの総バイト数
［値配列のデータ構造の転送コスト］
順序集合の要素数×値リストの総バイト数／値リストの要素数
【００５７】
そして、結果セットデータ構造判定部２５は、転送コストが小さいデータ構造を選択して、選択したデータ構造に応じた処理を行う。
【００５８】
例えば、値番号／値リスト２４１２を選択した場合、結果セットデータ構造判定部２５は、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。つまり、結果セットデータ構造判定部２５は、図４で示すように、順序集合２４１１の要素を添え字としたときの値番号の要素を、新しい値番号（新値番号）の要素となるように、再計算する。また、値配列２４２を選択した場合、結果セットデータ構造判定部２５は、対応する値番号／値リスト２４１２に基づいて、値配列２４２を作成する。つまり、結果セットデータ構造判定部２５は、図５で示すように、行番号が添え字に対応するように値リストの各要素を追加することで、値配列２４２を作成する。
【００５９】
このようにして、結果セットデータ構造判定部２５は、転送コストが小さいデータ構造を選択するとともに所定の処理を行う。
【００６０】
そして、結果セット取得部２６は、値番号／値リスト２４１２として選択された列の値リストをクライアントドライバ１２に送信する。この際、結果セット取得部２６は、転送するデータが値リストであるという値リスト識別子及び参照元の表の値リストが一意に識別できる値リストＩＤをヘッダ情報として付加してクライアントドライバ１２に値リストを転送する（図１１参照）。
【００６１】
その後、クライアントドライバ１２のデータ読取部１２１は、データベースサーバ２から転送されたデータのヘッダ情報を読み取り、値リストと識別したものをデータ領域１２２の結果セット格納領域１２２１に格納する。
【００６２】
上記処理を、実行結果の表の一例として図８で示す実行結果の表がある場合について、より具体的に説明する。この場合、結果セットデータ構造判定部２５は、顧客ＩＤの列に対して、例えば下記のような転送コストの算出を行う（図９参照）。
［値番号／値リストのデータ構造の転送コスト］
値番号の型のバイト数×順序集合の要素数＋値リストの総バイト数
＝５０００×４＋８００万＝８０２万
［値配列のデータ構造の転送コスト］
順序集合の要素数×値リストの総バイト数／値リストの要素数
＝５０００×８００万／１００万＝４万
【００６３】
上記転送コストの算出結果からすると、値配列２４２のデータ構造の転送コストの方が値番号／値リスト２４１２のデータ構造の転送コストよりも転送コストが小さい。そのため、結果セットデータ構造判定部２５は、図９で示すように、値配列２４２のデータ構造を選択して、値番号／値リスト２４１２に基づいて値配列２４２にデータ構造の変換を行う。そして、結果セットデータ構造判定部２５は、変換した値配列２４２をデータ領域２４２に格納する。
【００６４】
一方、図８で示す実行結果の表の場合、結果セットデータ構造判定部２５は、都道府県の列に対して、例えば下記のような転送コストの算出を行う（図１０参照）。
［値番号／値リストのデータ構造の転送コスト］
値番号の型のバイト数×順序集合の要素数＋値リストの総バイト数
＝５０００×１＋３３７＝約５０００
［値配列のデータ構造の転送コスト］
順序集合の要素数×値リストの総バイト数／値リストの要素数
＝５０００×３３７／４７＝約３．６万
【００６５】
この場合、値番号／値リスト２４１２のデータ構造の転送コストの方が値配列２４２のデータ構造の転送コストよりも転送コストが小さい。そのため、結果セットデータ構造判定部２５は、図１０で示すように、値番号／値リスト２４１２のデータ構造を選択して、値番号の再計算（新値番号の算出）を行う。
【００６６】
そして、結果セットデータ構造判定部２５による再計算の終了後、結果セット取得部２６は、図１１で示すように、値リストにヘッダ情報を付加してクライアントドライバ１２に送信する。つまり、結果セット取得部２６は、転送するデータが値リストであるという値リスト識別子及び参照元の表の値リストが一意に識別できる値リストＩＤをヘッダ情報として付加してクライアントドライバ１２に値リストを転送する。
【００６７】
その後、クライアントドライバ１２のデータ読取部１２１は、受け取ったデータのヘッダ情報から都道府県の列の値リストが転送されたことを確認する。そして、データ読取部１２１は、都道府県の列の値リストを結果セット格納領域１２２１に格納する。
【００６８】
上記のようにして値リストの転送が終わった後、実際にデータを取得するフェーズに入る。つまり、クライアントドライバ１２は、任意の数であるｎの値を動かしながら、ｎ件目のデータをデータベースサーバ２から取得する。言い換えると、結果セット取得部２６は、クライアントドライバ１２からの要求に応じて、値配列２４２又は値番号／値リスト２４１２の値番号の要素の転送を行う。
【００６９】
例えば、クライアントドライバ１２は、データベースサーバ２に対して、結果セットのｎ件目からｍ件分のデータを要求したとする。
【００７０】
このとき、値配列２４２を選択した列に対しては、結果セット取得部２６は、値配列２４２のｎ番目からｎ＋ｍ−１番目までの配列データをクライアントドライバ１２に送信する。また、この際、結果セット取得部２６は、図１２で示すように、値配列であることを示す識別子である値配列識別子を含んだヘッダ情報を付加して、クライアントドライバ１２に対して、値配列２４２のｎ番目からｎ＋ｍ−１番目までの配列データを転送する。
【００７１】
一方、値番号／値リスト２４１２を選択した列の場合、既に値リストは転送済みである。そのため、結果セット取得部２６は、値番号のｎ番目からｎ＋ｍ−１番目までの要素をクライアントドライバ１２に転送する。また、この際、結果セット取得部２６は、図１３で示すように、値番号であることを示す識別子である値番号識別子と、参照している値リストのＩＤ（値リストを送信する際にヘッダに付加した値リストＩＤ）と、を含んだヘッダ情報を付加して、クライアントドライバ１２に対して、値番号のｎ番目からｎ＋ｍ−１番目までの要素を転送する。
【００７２】
データ読取部１２１は、受け取ったデータのヘッダ情報を参照して、値番号と値配列２４２のどちらが転送されたのかを判断する。そして、データ読取部１２１は、受け取ったデータを結果セット格納領域１２２１に格納する。
【００７３】
このような一連の処理において、クライアントドライバ１２は、ｎもしくはｍの値を変えることで、必要な行番号のデータを取得することになる。
【００７４】
図８に示す例の場合では、データ読取部１２１は、受け取ったデータのヘッダ情報から、顧客ＩＤの列のデータ構造が値配列２４２であることを識別することが出来る。また、データ読取部１２１は、データのヘッダ情報から、都道府県の列のデータ構造が値番号／値リスト２４１２であることを識別することが出来る。
【００７５】
また、値配列２４２のデータ構造を有する顧客ＩＤの列にアクセスする際には、図１４に示すように、データ読取部１２１は、受け取った値配列２４２にそのままアクセスすればよいことになる。また、値番号／値リスト２４１２のデータ構造を有する都道府県の列にアクセスする際には、データ読取部１２１は、受け取った値番号が利用している値リストＩＤと同じＩＤをもつ値リストを結果セット格納領域１２２１から取得する。そして、データ読取部１２１は、ｎ番目からｎ＋ｍ−１番目だけ受け取った値番号（新値番号）を値リストの添え字として、図１５で示すように、値リストにアクセスすることができる。
【００７６】
次に、クエリの終了について説明する。
【００７７】
クライアントドライバ１２からクエリの終了を指示されると、データベースサーバ２の結果セット取得部２６は、再計算された値番号（新値番号）、値配列２４２、実行結果の表を削除する。また、クライアント１のクライアントドライバ１２は、結果セット格納領域１２２１に格納された値番号、値リスト、値配列２４２を削除する。
【００７８】
このように、クエリの終了とともに、クエリの実行により作成された各種データは削除されることになる。
【００７９】
次に、図１６乃至図１８を参照して、データベースシステム３の動作について説明する。
【００８０】
まず、図１６を参照して、クエリの実行を行う際のデータベースシステム３の動作について説明する。
【００８１】
図１６を参照すると、クライアントドライバ１２は、アプリケーション１１からの要求に応じて、データベースサーバ２に対してクエリを送信する（ステップＳ１０１）。
【００８２】
クライアントドライバ１２が送信したクエリをクエリ解析部２１が受信する。すると、クエリ解析部２１は、受信したクエリの構文解析を実行する（ステップＳ２０１）。その後、クエリ解析部２１は、解析結果を実行計画部２２へ送信する。
【００８３】
続いて、実行計画部２２は、クエリ解析部２１が構文解析したクエリをどのような順序、方法で行えば効率的であるかを判定し、その実行計画を作成する（ステップＳ２０２）。そして、実行計画部２２は、作成した実行計画をクエリ実行部２３に送信する。
【００８４】
その後、クエリ実行部２３は、実行計画部２２で作成した実行計画に従ってクエリを実行する（ステップＳ２０３）。これにより、クエリ実行部２３は、クエリに対する実行結果の表を作成して、当該作成した実行結果の表をデータ領域２４の表データ２４１に格納する（ステップＳ２０４）。なお、クエリ実行部２３が作成する実行結果の表は、ＦＡＳＴ構造である。
【００８５】
データベースシステム３は、例えば上記動作によりクエリの実行を行う。次に、図１７を参照して、結果セットの取得を行う際のデータベースシステム３の動作について説明する。
【００８６】
図１７を参照すると、クライアントドライバ１２は、アプリケーション１１からの要求に応じて、データベースサーバ２の結果セット取得部２６に対して結果セット取得要求を送信する（ステップＳ１０２）。
【００８７】
クライアントドライバ１２から結果セット取得要求を受信すると、結果セット取得部２６は、データ領域２４を参照してクライアントドライバ１２から受け付けたクエリに対する実行結果の表を取得する（ステップＳ３０１）。
【００８８】
続いて、結果セットデータ構造判定部２５は、結果セット取得部２６が取得した実行結果の表の各列に対して、値番号／値リスト２４１２の転送コストと、値配列２４２の転送コストと、の算出を行う。そして、結果セットデータ構造判定部２５は、転送コストが小さいデータ構造を選択する（ステップＳ４０１）。その後、結果セットデータ構造判定部２５は、選択したデータ構造に応じた処理を行う（ステップＳ４０２）。
【００８９】
具体的には、結果セットデータ構造判定部２５は、値番号／値リスト２４１２を選択した場合、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。つまり、結果セットデータ構造判定部２５は、図４で示すように、順序集合２４１１の要素を添え字としたときの値番号の要素を、新しい値番号（新値番号）の要素となるように、再計算する。また、値配列２４２を選択した場合、結果セットデータ構造判定部２５は、対応する値番号／値リスト２４１２に基づいて、値配列２４２を作成する。つまり、結果セットデータ構造判定部２５は、図５で示すように、行番号が添え字に対応するように値リストの各要素を追加することで、値配列２４２を作成する。
【００９０】
そして、結果セット取得部２６は、値番号／値リスト２４１２として選択された列の値リストをクライアントドライバ１２に送信する（ステップＳ３０２）。この際、結果セット取得部２６は、転送するデータが値リストであるという値リスト識別子及び参照元の表の値リストが一意に識別できる値リストＩＤをヘッダ情報として付加してクライアントドライバ１２に値リストを転送する。
【００９１】
その後、クライアントドライバ１２のデータ読取部１２１は、データベースサーバ２から転送されたデータのヘッダ情報を読み取り、値リストと識別したものをデータ領域１２２の結果セット格納領域１２２１に格納する（ステップＳ１０３）。
【００９２】
上記動作により値リストが転送されると、クライアントドライバ１２は、データベースサーバ２に対して、結果セットのｎ件目からｍ件分のデータを要求する（ステップＳ１０４）。つまり、クライアントドライバ１２は、実際のデータの取得を要求する。
【００９３】
クライアントドライバ１２からデータの要求を受けると、結果セット取得部２６は、当該要求に応じたデータをデータ領域２４から取得して（ステップＳ３０３）、転送する（ステップＳ３０４）。
【００９４】
結果セット取得部２６が行うこの動作は、対象の列のデータ構造に応じて行われることになる。つまり、結果セット取得部２６は、値配列２４２を選択した列に対して、値配列２４２のｎ番目からｎ＋ｍ−１番目までの配列データをクライアントドライバ１２に送信する。一方、値番号／値リスト２４１２を選択した列の場合、既に値リストは転送済みであるため、結果セット取得部２６は、値番号のｎ番目からｎ＋ｍ−１番目までの要素をクライアントドライバ１２に転送する。
【００９５】
その後、データ読取部１２１は、受け取ったデータのヘッダ情報を参照して、値番号と値配列２４２のどちらが転送されたのかを判断する。そして、データ読取部１２１は、受け取ったデータを結果セット格納領域１２２１に格納する（ステップＳ１０５）。
【００９６】
データベースシステム３は、例えば上記動作により結果セットの取得を行う。次に、図１８を参照して、クエリを終了する際のデータベースシステム３の動作について説明する。
【００９７】
図１８を参照すると、クライアントドライバ１２は、アプリケーション１１からの要求に応じて、クエリの終了の指示をデータベースサーバ２の結果セット取得２６に対して送信する（ステップＳ１０６）。
【００９８】
上記指示を受信すると、結果セット取得部２６は、データ領域２４に格納された、再計算された値番号である新値番号と、値配列２４２と、を削除する（ステップＳ３０５）。また、結果セット取得部２６は、データ領域２４から実行結果の表（表データ２４１）を削除する（ステップＳ３０６）。
【００９９】
また、クライアントドライバ１２は、データ領域１２２の結果セット格納領域１２２１に格納された値番号、値リスト、値配列を削除する（ステップＳ１０７）。
【０１００】
データベースシステム３は、例えば上記動作によりクエリを終了する。
【０１０１】
このように、本実施形態におけるデータベースサーバ２は、結果セットデータ構造判定部２５を有している。このような構成により、結果セットデータ構造判定部２５は、結果セット（クエリ実行部２３により実行されたクエリの実行結果の表）の各列に対して、値番号／値リスト２４１２のデータ構造を用いた場合と値配列２４２のデータ構造を用いた場合との転送コストを算出することが出来る。また、結果セットデータ構造判定部２５は、転送コストの算出結果に基づいて、列ごとに転送する際のデータ構造を選択することが出来る。その結果、データベースサーバ２は、列ごとにデータ転送量の少ないデータ構造を選択してデータを転送することが可能となる。これにより、データベースサーバ２は、サーバ・クライアント間のネットワークトラフィックの増大を抑制することが可能となる。
【０１０２】
［第２の実施形態］
本発明の第２の実施形態では、接続単位で値リストを再利用するデータベースシステム５について説明する。図１９で示すように、１回の接続で複数の問合せがある場合などにおいて、異なる問い合わせで同一の値リストを参照することがある。例えば、図１９の場合では、問合せ１と問合せ２とで、どちらも同一の表の都道府県の列の値リストを参照している。このような場合には、クライアントに対象となる値リストを記憶させておくことで、後の問合せに対する結果を送信する際に再度データベースサーバ２から値リストを転送する必要がなくなるものと考えられる。そこで、本実施形態においては、重複して値リストを送信することを防ぐことが出来るよう構成された、データベースシステム５について説明する。なお、以下においては、第１の実施形態で説明した構成と同様の構成については、同じ符号を付すものとする。
【０１０３】
図２０を参照すると、本実施形態におけるデータベースシステム５は、クライアント４と、データベースサーバ２と、を有している。本実施形態におけるデータベースシステム５は、第１の実施形態で説明したデータベースシステム３とほぼ同様の構成を有している。
【０１０４】
つまり、データベースサーバ２は、クエリ解析部２１と実行計画部２２と、クエリ実行部２３と、データ領域２４と、結果セットデータ構造判定部２５と、結果セット取得部２６と、を有している。また、クライアント４は、アプリケーション１１とデータ読取部１２１と、データ領域１２２とを有しており、データ領域１２２は、結果セット格納領域１２２１を有している。
【０１０５】
さらに、本実施形態におけるクライアント４は、値リスト一時記憶領域４２２２を有している。以下においては、データベースシステム５の特徴的な構成について説明する。
【０１０６】
値リスト一時記憶領域４２２２は、データベースサーバ２の結果セット取得部２６から転送された値リストのうち、データベースサーバ２が保有する既存の表から参照されているものを格納する領域である。つまり、値リスト一時記憶領域４２２２には、データベースサーバ２から転送された値リストのうち、クエリに応じた処理の途中で生成された値リストでなく既存の表を参照している値リストが格納されることになる。
【０１０７】
値リスト一時記憶領域４２２２に格納された内容は、結果セット格納領域１２２１のデータが破棄されても影響を受けないよう構成されている。つまり、値リスト一時記憶領域４２２２に格納された内容は、クエリが終了するごとに破棄されないことになる。値リスト一時記憶領域４２２２に格納された内容は、例えば、クライアント４とデータベースサーバ２との接続が切れた時に、クライアントドライバ１２により削除される。
【０１０８】
なお、値リスト一時記憶領域４２２２が値リストを格納するか否か（値リストが既存の表から参照されているものであるか否か）は、例えば、結果セット取得部２６が値リストを送信する際に付加するヘッダ情報を参照して、クライアントドライバ１２により確認されることになる。
【０１０９】
本実施形態におけるクライアントドライバ１２は、結果セット取得部２６から対象の列の値リストが既に送信されているか否かの確認を受け取る。例えば、クライアントドライバ１２は、結果セット取得部２６から対象の列の値リストの値リストＩＤを受け取る。すると、クライアントドライバ１２は、値リスト一時記憶領域４２２２を参照して、対象の列の値リストが値リスト一時記憶領域４２２２に記憶されているか否かを確認する。つまり、クライアントドライバ１２は、結果セット取得部２６から取得した値リストＩＤと等しいＩＤをもつ値リストが値リスト一時記憶領域４２２２に格納されているかを調べる。そして、クライアントドライバ１２は、確認結果を結果セット取得部２６に送信する。
【０１１０】
また、クライアントドライバ１２は、結果セット取得部２６から値リストを受け取った場合、値リストのヘッダ情報を参照して当該受け取った値リストを結果セット格納領域１２２１に格納するか、値リスト一時記憶領域４２２２に格納するかを決定する。例えば、クライアントドライバ１２は、値リストが既存の表を参照しているものの場合、当該値リストを値リスト一時記憶領域４２２２に格納する。一方、クライアントドライバ１２は、値リストが処理の途中で生成されたものの場合、当該値リストを結果セット格納領域１２２１に格納する。
【０１１１】
本実施形態における結果セットデータ構造判定部２５は、クライアントドライバ１２に既に転送されている値リストを加味した上で、結果セットの各列に対して値番号／値リスト２４１２と値配列２４２を用いた場合の転送コストをそれぞれ算出する。そして、結果セットデータ構造判定部２５は、結果セットの各列に対してどのデータ構造で転送するかを判定する。
【０１１２】
例えば、結果セットデータ構造判定部２５は、クライアントドライバ１２から受け取った値リストＩＤの確認結果により対象の列の値リストが既にクライアントドライバ１２に転送されていると判断した場合、値番号／値リスト２４１２のデータ構造を選択する。そして、結果セットデータ構造判定部２５は、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。
【０１１３】
なお、この場合、対象の値リストは既にクライアントドライバ１２の値リスト一時記憶領域４２２２に格納されている。そのため、結果セット取得部２６による値リストの転送は省略されることになる。
【０１１４】
また、例えば、結果セットデータ構造判定部２５は、対象の列の値リストがクライアントドライバ１２に転送されていないと判断した場合、値番号／値リスト２４１２のデータ構造と値配列２４２のデータ構造との転送コストを算出する。そして、算出した転送コストに基づいて、転送コストの少ない方のデータ構造を選択する。
【０１１５】
なお、本実施形態における結果セットデータ構造判定部２５は、値番号／値リスト２４１２の転送コストを算出する際に、対象の列に対して単一の接続でのアクセス回数が増えれば増えるほどコストが下がるように転送コストを算出することが出来る。例えば、結果セットデータ構造判定部２５は、下記式を用いて値番号／値リスト２４１２の転送コストを算出する。
［値番号／値リストのデータ構造の転送コスト］
値番号の型のバイト数×順序集合の要素数＋値リストの総バイト数／（１＋値リストのアクセス数）
なお、結果セットデータ構造判定部２５は、値配列２４２の転送コストを算出する際は、例えば、第１の実施形態で説明した式と同じ式を用いて転送コストを算出する。
【０１１６】
その後、結果セットデータ構造判定部２５は、選択したデータ構造に応じた処理を行う。
【０１１７】
例えば、結果セットデータ構造判定部２５は、値番号／値リスト２４１２を選択した場合、値番号の添え字（ｉｄｘ）を行番号に対応させる処理を行う。また、結果セットデータ構造判定部２５は、値配列２４２を選択した場合、行番号が添え字に対応するように値リストの各要素を追加することで、値配列２４２を作成する。
【０１１８】
結果セット取得部２６は、クライアントドライバ１２から結果セット取得要求を受け取ると、当該結果セット取得要求に応じた値リストＩＤをクライアントドライバ１２に送信する。これにより、結果セット取得部２６は、対象の列の値リストがクライアントドライバ１２に既に送信されているか（値リスト一時記憶領域４２２２に記憶されているか）を確認する。
【０１１９】
また、結果セット取得部２６は、値リストをクライアントドライバ１２に対して送信する際に、転送される値リストのヘッダ情報に、その値リストが既存の表を参照しているものであるか否かを確認するためのフラグを付加する。つまり、結果セット取得部２６は、例えば図２１で示すように、値リストのヘッダ情報に、値リストを一意に特定するＩＤの他に、その値リストが既存の表を参照しているものか、処理の途中で生成された値リストであるかを判別できるフラグを付加して転送を行う。例えば、結果セット取得部２６は、サーバ内の既存の評価から作成された値リストである場合は「真」の既存表参照フラグを、処理の途中で生成された値リストの場合は「偽」の既存表参照フラグと、値リストのヘッダ情報に付加して転送する。
【０１２０】
次に、図２２、図２３を参照して、データベースシステム５の特徴的な動作について説明する。
【０１２１】
図２２を参照すると、クライアントドライバ１２が送信した結果セット取得要求（ステップＳ１０２）に応じて、結果セット取得部２６は、実行結果の表を取得する（ステップＳ３０１）。
【０１２２】
続いて、結果セットデータ構造判定部２５は、対象の列の値リストの値リストＩＤをクライアントドライバ１２に対して送信する（ステップＳ３１１）。
【０１２３】
上記値リストＩＤを受け取ると、クライアントドライバ１２は、値リスト一時記憶領域４２２２を参照して、受け取った値リストＩＤと等しいＩＤをもつ値リストが値リスト一時記憶領域４２２２に格納されているかを確認する（ステップＳ１１１）。そして、クライアントドライバ１２は、確認結果を結果セット取得部２６に送信する（ステップＳ１１２）。
【０１２４】
結果セットデータ構造判定部２５では、クライアントドライバ１２での確認結果に応じて、転送する際のデータ構造を選択する。そして、結果セットデータ構造判定部２５は、選択したデータ構造に応じた処理を行う（ステップＳ４１１）。
【０１２５】
その後、結果セット取得部２６は、転送コストの算出結果に基づいて選択された値番号／値リスト２４１２の値リストをクライアントドライバ１２に対して転送する（ステップＳ３１２）。この際、結果セット取得部２６は、値リストが既存の表を参照しているものであるか否かを確認するためのフラグをヘッダ情報に付加して値リストをクライアントドライバ１２に対して転送する。
【０１２６】
そして、クライアントドライバ１２は、転送された値リストを、当該値リストのヘッダ情報のフラグに応じた位置に格納する（ステップＳ１１３）。例えば、クライアントドライバ１２は、値リストが既存の表を参照しているものの場合、当該値リストを値リスト一時記憶領域４２２２に格納する。一方、クライアントドライバ１２は、値リストが処理の途中で生成されたものの場合、当該値リストを結果セット格納領域１２２１に格納する。
【０１２７】
次に、ステップＳ４１１の動作について、図２３を参照してより詳細に説明する。
【０１２８】
結果セットデータ構造判定部２５は、クライアントドライバ１２から送信された値リストの確認結果を受け取ると、当該確認結果に基づいて、対象の列の値リストが既にクライアントドライバ１２に転送されているか否かを判断する（ステップＳ４２１）。
【０１２９】
そして、対象の列の値リストが既にクライアントドライバ１２に転送（値リストが値リスト一時記憶領域４２２２に格納）されている場合（ステップＳ４２１、Ｙｅｓ）、結果セットデータ構造判定部２５は、値番号／値リスト２４１２のデータ構造を選択する。そして、結果セットデータ構造判定部２５は、値番号の添え字（ｉｄｘ）を行番号に対応させる、値番号の再計算処理を行う（ステップＳ４２２）。
【０１３０】
一方、対象の列の値リストがクライアントドライバ１２に転送されていない場合（ステップＳ４２１、Ｎｏ）、結果セットデータ構造判定部２５は、値番号／値リスト２４１２と値配列２４２を用いた場合の転送コストをそれぞれ算出する（ステップＳ４２３）。そして、結果セットデータ構造判定部２５は、値番号／値リスト２４１２の転送コストと値配列２４２の転送コストとのどちらの転送コストが小さいかを判断する（ステップＳ４２４）。
【０１３１】
値番号／値リスト２４１２の転送コストの方が値配列２４２の転送コストよりも小さい場合、結果セットデータ構造判定部２５は、データ構造として値番号／値リスト２４１２を選択する（ステップＳ４２４、値番号／値リスト）。そして、結果セットデータ構造判定部２５は、値番号の添え字（ｉｄｘ）を行番号に対応させる、値番号の再計算処理を行う（ステップＳ４２５）。その後、結果セットデータ構造判定部２５は結果セット取得部２６に対して値リストを転送するよう指示する（ステップＳ４２６）。その結果、結果セット取得部２６は、値リストが既存の表を参照しているものであるか否かを確認するためのフラグをヘッダ情報に付加して、値リストをクライアントドライバ１２に対して転送することになる。
【０１３２】
また、値配列２４２の転送コストの方が値番号／値リスト２４１２の転送コストよりも小さい場合、結果セットデータ構造判定部２５は、データ構造として値配列２４２を選択する（ステップＳ４２４、値配列）。そして、結果セットデータ構造判定部２５は、行番号が添え字に対応するように値リストの各要素を追加することで、値配列２４２を作成する。
【０１３３】
このように、本実施形態におけるクライアントドライバ１２は、値リスト一時記憶領域４２２２を有している。このような構成により、クライアントドライバ１２は、結果セット格納領域１２２１のデータが破棄されても影響を受けない値リスト一時記憶領域４２２２に、必要な値リストを格納することが出来る。また、データベースサーバ２は、クライアントドライバ１２の値リスト一時記憶領域４２２２に格納されている値リストを加味した上でデータ構造を選択することが出来る。ここで、結果セット格納領域１２２１に格納されたデータはクエリの終了とともに破棄される一方で、値リスト一時記憶領域４２２２に格納されたデータはクライアント４とデータベースサーバ２との接続が切れるまで破棄されない。そのため、データベースサーバ２は、クライアント４との接続が維持されている間、既に転送した値リストを再利用することが出来る。その結果、サーバ・クライアント間のネットワークトラフィックの増大をさらに抑制することが可能となる。
【０１３４】
また、結果セットデータ構造判定部２５は、対象の列に対して単一の接続でのアクセス回数が増えれば増えるほどコストが下がるように値番号／値リスト２４１２の転送コストを算出する。このような仕組みをとることで、頻繁にアクセスされる場合は値番号／値リスト２４１２が選択されやすくなることになる。その結果、サーバ・クライアント間のネットワークトラフィックの増大をさらに抑制することが期待できる。
【０１３５】
［第３の実施形態］
本発明の第３の実施形態では、値リスト一時記憶領域４２２２に格納された値リストが所定の条件を満たす場合、当該値リストをクライアントのストレージ装置に書き出すよう構成されたデータベースシステム７について説明する。つまり、本実施形態におけるデータベースシステム７では、接続単位ではなくクライアント単位で値リストを再利用可能なよう構成されている。なお、以下においては、第１の実施形態及び第２の実施形態で説明した構成と同様の構成については、同じ符号を付すものとする。
【０１３６】
図２４を参照すると、本実施形態におけるデータベースシステム７は、クライアント６と、データベースサーバ２と、を有している。本実施形態におけるデータベースシステム７は、第１の実施形態で説明したデータベースシステム３、第２の実施形態で説明したデータベースシステム５と、ほぼ同様の構成を有している。
【０１３７】
つまり、データベースサーバ２は、クエリ解析部２１と実行計画部２２と、クエリ実行部２３と、データ領域２４と、結果セットデータ構造判定部２５と、結果セット取得部２６と、を有している。また、クライアント４は、アプリケーション１１とデータ読取部１２１と、データ領域１２２とを有しており、データ領域１２２は、結果セット格納領域１２２１と値リスト一時記憶領域４２２２とを有している。
【０１３８】
さらに、本実施形態におけるクライアント４は、クライアントストレージ６３を有している。また、クライアントストレージ６３は、値リスト永続化表６３１と、値リスト永続記憶領域６３２と、を有している。また、クライアントドライバ１２は、永続記憶判定部６２３を有している。以下においては、データベースシステム７の特徴的な構成について説明する。
【０１３９】
永続記憶判定部６２３は、同一の値リストが値リスト一時記憶領域４２２２に格納される回数を、値リスト永続化表６３１を用いて監視する。また、永続記憶判定部６２３は、同一の値リストが値リスト一時記憶領域４２２２に格納された回数と予め定められた永続化閾値との比較を行う。そして、永続記憶判定部６２３は、同じ値リストが値リスト一時記憶領域４２２２に格納された回数が永続化閾値以上になった場合、値リスト永続記憶領域６３２に値リストを書き出す処理を行う。
【０１４０】
また、永続記憶判定部６２３は値リスト永続記憶領域６３２に格納されている値リストが必要になった場合に、値リスト永続記憶領域６３２から値リスト一時記憶領域４２２２に値リストをアップロードする。例えば、永続記憶判定部６２３は、結果セット取得部２６から送信された値リストのＩＤに応じて、当該値リストＩＤに応じた値リストが値リスト永続記憶領域６３２に記憶されているか否かを判断する。そして、永続記憶判定部６２３は、値リストが値リスト永続記憶領域６３２に記憶されている場合、値リスト永続記憶領域６３２から値リスト一時記憶領域４２２２に値リストをアップロードする。
【０１４１】
クライアントドライバ１２は、値リスト永続記憶領域６２３に記憶されている値リストも加味して、対象の列の値リストが既に送信されているか否かの確認を行うことになる。
【０１４２】
クライアントストレージ６３は、ディスク装置などの記憶装置である。クライアントストレージ６３は、値リスト永続化表６３１と、値リスト永続記憶領域６３２と、を有している。
【０１４３】
値リスト永続化表６３１は、同一の値リストが値リスト一時記憶領域４２２２に格納された回数を数える際に、永続記憶判定部６２３により利用される。
【０１４４】
図２５は、値リスト永続化表６３１の構成の一例である。図２５を参照すると、値リスト永続化表６３１は、例えば、値リストＩＤと参照回数と、永続化フラグと、値リストの格納場所と、を有している。
【０１４５】
値リストＩＤは、値リストのＩＤを示している。永続記憶判定部６２３は、値リストＩＤを利用して、値リスト永続化表の参照回数を更新することになる。
【０１４６】
参照回数は、異なる接続で同一の値リストが値リスト一時記憶領域４２２２に格納されるごとに、永続記憶判定部６２３により１加算される。従って、永続記憶判定部６２３は、例えば、結果セット取得部２６から転送された値リストが値リスト一時記憶領域４２２２に格納されるごとに、参照回数を１加算する。また、永続記憶判定部６２３は、値リスト永続記憶領域６３２から値リストを値リスト一時記憶領域４２２２にアップロードするごとに、参照回数を１加算する。例えば、図２５の１行目（値リストＩＤ「ＡＦ６ＣＤ５４２…」）は、対象の値リストが値リスト一時記憶領域４２２２に格納された回数が１回であることを示している。
【０１４７】
永続化フラグは、同じ値リストが値リスト一時記憶領域４２２２に格納された回数が永続化閾値以上になった場合に真となるフラグである。上述したように、永続化フラグは、永続記憶判定部６２３により操作される。例えば、図２５では、値リストＩＤ「９７２ＢＣ７３５…」の永続化フラグが真であり、値リストＩＤ「Ｄ２６９０Ｂ４３…」の永続化フラグが偽であることを示している。このように、図２５では、永続化閾値が３である場合を示している。なお、永続化閾値は任意の数で構わない。永続化閾値は、予め定められていても構わないし、ユーザにより選択されるように構成しても構わない。
【０１４８】
値リストの格納場所は、値リスト永続記憶領域６３２のうちの対象の値リストが書き込まれた位置を示している。上記のように、永続記憶判定部６２３は、永続化フラグが真になった値リストを値リスト永続記憶領域６３２に書き出すとともに、その格納パスを値リスト永続化表６３１に記録する。そのため、永続化フラグが偽である値リストの格納場所は、空欄になっている。
【０１４９】
値リスト永続記憶領域６３２には、永続記憶判定部６２３により、値リスト永続化表６３１の永続化フラグが真になった値リストが格納される。値リスト永続記憶領域６３２に格納された値リストは、必要に応じて、永続記憶判定部６２３により値リスト一時記憶領域４２２２に書き出される。
【０１５０】
このように、本実施形態におけるクライアント６は、永続記憶判定部６２３と値リスト永続化表６３１と値リスト永続記憶領域６３２とを有している。このような構成により、クライアント６の永続記憶判定部６２３は、値リスト一時記憶領域４２２２に格納された値リストの格納回数を、値リスト永続化表６３１を利用して数えることが出来る。また、値リストの格納回数により当該値リストの利用回数が多いと判断される場合、永続記憶判定部６２３は、値リスト一時記憶領域４２２２に格納された値リストを値リスト永続記憶領域６３２に書き出すことが出来る。その結果、値リスト永続記憶領域６３２に書き出された値リストは、例えば、クエリが終了しても、クライアント６とデータベースサーバ２との接続が終了しても削除されず、クライアント６に記憶され続けることになる。これにより、同一クライアントであれば異なる接続であっても値リストを共有することが可能となり、その結果、サーバ・クライアント間のネットワークトラフィックの増大をさらに抑制することが可能となる。
【０１５１】
［第４の実施形態］
本発明の第４の実施形態では、データベースサーバ８２に対して問合せを実行するクライアント８１と、クライアント８１からの問合せに応じて、各問合せに対する回答をレコードで表す問合せの実行結果の表を送信するデータベースサーバ８２と、を有するデータベースシステム８について説明する。なお、本実施形態では、データベースシステム８の構成の概要について説明する。
【０１５２】
図２６を参照すると、データベースシステム８は、クライアント８１とデータベースサーバ８２とを有している。
【０１５３】
クライアント８１は、データベースサーバ８２に対して問合せを実行する。
【０１５４】
データベースサーバ８２は、データ送信部８２１を有している。
【０１５５】
データ送信部８２１は、複数の列を有する実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表す予め定められた複数のデータ構造のうちのいずれかを用いて送信する。
【０１５６】
このように、本実施形態におけるデータベースシステム８のデータベースサーバ８２は、データ送信部８２１を有している。このような構成により、データ送信部８２１は、複数の列を有する実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表す予め定められた複数のデータ構造のうちのいずれかを用いて送信することが出来る。その結果、データベースサーバ８２は、実行結果の表の列ごとにデータ転送量などの点から望ましいデータ構造を選択して、列ごとに実行結果の表を転送することが可能となる。これにより、データベースシステム８は、サーバ・クライアント間のネットワークトラフィックの増大を抑制することが可能となる。
【０１５７】
また、上述したデータベースシステム８と同様の効果は、データベースサーバ８２単独でも実現することが出来る。具体的に、本発明の他の形態であるデータベースサーバ８２は、クライアントからの問合せに応じて、各問合せに対する回答をレコードで表す問合せの実行結果の表を送信するデータベースサーバ８２であって、複数の列を有する実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表す予め定められた複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する、という構成を有する。
【０１５８】
また、上記データベースサーバ８２は、当該データベースサーバ８２に所定のプログラムが組み込まれることで実現できる。具体的に、本発明の他の形態であるプログラムは、クライアントからの問合せに応じて、各問合せに対する回答をレコードで表す問合せの実行結果の表を送信するデータベースサーバに、複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表す予め定められた複数のデータ構造のうちのいずれかを用いて送信するデータ送信手段を実現させるためのプログラムである。
【０１５９】
また、上述したデータベースサーバ８２が作動することにより実行される情報処理方法は、クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し複数の列項目を有する問合せの実行結果の表を送信する際に、実行結果の表の列ごとに、当該列を表す予め定められた複数のデータ構造のうちのいずれかを用いて送信する、という方法である。
【０１６０】
上述した構成を有する、データベースサーバ、プログラム、又は、情報処理方法、の発明であっても、上記データベースシステム８と同様の作用を有するために、上述した本発明の目的を達成することが出来る。
【０１６１】
＜付記＞
上記実施形態の一部又は全部は、以下の付記のようにも記載されうる。以下、本発明における分散処理制御装置などの概略を説明する。但し、本発明は、以下の構成に限定されない。
【０１６２】
（付記１）
データベースサーバに対して問合せを実行するクライアントと、前記クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバと、を有するデータベースシステムであって、
前記データベースサーバは、複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
データベースシステム。
【０１６３】
（付記２）
付記１に記載のデータベースシステムであって、
前記データ送信部は、前記複数のデータ構造のそれぞれを用いた際のデータを前記クライアントに転送する際のデータ転送量に基づいて選択されたデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースシステム。
【０１６４】
（付記３）
付記２に記載のデータベースシステムであって、
前記データ送信部は、前記複数のデータ構造のうちの前記データ転送量が最も小さくなるデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースシステム。
【０１６５】
（付記４）
付記１乃至３のいずれかに記載のデータベースシステムであって、
前記実行結果の表の各列に対して、複数のデータ構造におけるデータ転送量を示す転送コストをそれぞれ算出し、当該算出した転送コストに基づいてデータを転送する際のデータ構造を列ごとに選択するデータ構造選択部を有し、
前記データ送信部は、前記データ構造選択部が列ごとに選択したデータ構造を用いて、列ごとにデータを送信する
を有する
データベースシステム。
【０１６６】
（付記５）
付記４に記載のデータベースシステムであって、
前記データ構造選択部は、データを値の一覧である値リストと前記値リストのうちの該当する位置を示す値番号との組み合わせで表現するデータ構造と、行番号に対応する値の配列で構成されるデータ構造と、の前記転送コストを算出し、当該算出した転送コストに基づいてデータを転送する際のデータ構造を列ごとに選択する
データベースシステム。
【０１６７】
（付記５−１）
付記５に記載のデータベースシステムであって、
データ構造選択部は、前記値リストと前記値番号の組み合わせで表現するデータ構造を選択する場合、前記値番号の添え字を行番号に対応させる処理を行う
データベースシステム。
【０１６８】
（付記５−２）
付記４乃至５−１のいずれかに記載のデータベースシステムであって、
前記データ構造選択部は、前記データ構造ごとの予想バイト数を算出することで、前記転送コストを算出する
データベースシステム。
【０１６９】
（付記５−３）
付記４乃至５−２のいずれかに記載のデータベースシステムであって、
前記データ構造選択部は、前記データ構造ごとの予想バイト数とデータに対するアクセスの回数とに基づいて前記転送コストを算出する
データベースシステム。
【０１７０】
（付記６）
付記１乃至５に記載のデータベースシステムであって、
前記クライアントは、前記データベースサーバから送信されたデータを一時的に記憶する一時データ記憶部を有し、
前記データベースサーバの前記データ送信部は、前記一時データ記憶部が記憶するデータに基づいて選択された前記複数のデータ構造のうちのいずれかを用いて送信する
データベースシステム。
【０１７１】
（付記７）
付記５に記載のデータベースシステムであって、
前記クライアントは、前記一時データ記憶部に記憶されたデータが所定の条件を満たす場合に、当該一時データ記憶部が記憶するデータをストレージ装置に移動させる
データベースシステム。
【０１７２】
（付記８）
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバであって、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信部を有する
データベースサーバ。
【０１７３】
（付記８−１）
付記８に記載のデータベースサーバであって、
前記データ送信部は、前記複数のデータ構造のそれぞれを用いた際のデータを前記クライアントに転送する際のデータ転送量に基づいて選択されたデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースサーバ。
【０１７４】
（付記８−２）
付記８又は付記８−１に記載のデータベースサーバであって、
前記データ送信部は、前記複数のデータ構造のうちの前記データ転送量が最も小さくなるデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
データベースシステム。
【０１７５】
（付記９）
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含み複数の列項目を有する問合せの実行結果の表を送信する際に、
前記実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信する
情報処理方法。
【０１７６】
（付記９−１）
付記９に記載の情報処理方法であって、
前記複数のデータ構造のそれぞれを用いた際のデータを前記クライアントに転送する際のデータ転送量に基づいて選択されたデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
情報処理方法。
【０１７７】
（付記９−２）
付記９又は付記９−１に記載の情報処理方法であって、
前記複数のデータ構造のうちの前記データ転送量が最も小さくなるデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
情報処理方法。
【０１７８】
（付記１０）
クライアントからの問合せに応じて、各問合せに対する回答をレコードで表し、当該レコードを含む問合せの実行結果の表を送信するデータベースサーバに、
複数の列を有する前記実行結果の表を送信する際に、当該実行結果の表の列ごとに、当該列を表すことが出来る複数のデータ構造のうちのいずれかを用いて送信するデータ送信手段を実現させるための
プログラム。
【０１７９】
（付記１０−１）
付記１０に記載のプログラムであって、
前記データ送信手段は、前記複数のデータ構造のそれぞれを用いた際のデータを前記クライアントに転送する際のデータ転送量に基づいて選択されたデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
プログラム。
【０１８０】
（付記１０−２）
付記１０又は付記１０−１に記載のプログラムであって、
前記データ送信部は、前記複数のデータ構造のうちの前記データ転送量が最も小さくなるデータ構造を用いて、前記実行結果の表の列ごとにデータを送信する
プログラム。
【０１８１】
なお、上記各実施形態及び付記において記載したプログラムは、記憶装置に記憶されていたり、コンピュータが読み取り可能な記録媒体に記録されていたりする。例えば、記録媒体は、フレキシブルディスク、光ディスク、光磁気ディスク、及び、半導体メモリ等の可搬性を有する媒体である。
【０１８２】
以上、上記各実施形態を参照して本願発明を説明したが、本願発明は、上述した実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明の範囲内で当業者が理解しうる様々な変更をすることが出来る。
【符号の説明】
【０１８３】
１、４、６  クライアント
１１  アプリケーション
１２  クライアントドライバ
１２１  データ読取部
１２２  データ領域
１２２１  結果セット格納領域
２  データベースサーバ
２１  クエリ解析部
２２  実行計画部
２３  クエリ実行部
２４  データ領域
２４１  表データ
２４１１  順序集合
２４１２  値番号／値リスト
２４２  値配列
２５  結果セットデータ構造判定部
２６  結果セット取得部
３、５、７  データベースシステム
４２２２  値リスト一時記憶領域
６２３  永続記憶判定部
６３  クライアントストレージ
６３１  値リスト永続化表
６３２  値リスト永続記憶領域
【図１】
2016177347.tif 000003
【図２】
2016177347.tif 000004
【図３】
2016177347.tif 000005
【図４】
2016177347.tif 000006
【図５】
2016177347.tif 000007
【図６】
2016177347.tif 000008
【図７】
2016177347.tif 000009
【図８】
2016177347.tif 000010
【図９】
2016177347.tif 000011
【図１０】
2016177347.tif 000012
【図１１】
2016177347.tif 000013
【図１２】
2016177347.tif 000014
【図１３】
2016177347.tif 000015
【図１４】
2016177347.tif 000016
【図１５】
2016177347.tif 000017
【図１６】
2016177347.tif 000018
【図１７】
2016177347.tif 000019
【図１８】
2016177347.tif 000020
【図１９】
2016177347.tif 000021
【図２０】
2016177347.tif 000022
【図２１】
2016177347.tif 000023
【図２２】
2016177347.tif 000024
【図２３】
2016177347.tif 000025
【図２４】
2016177347.tif 000026
【図２５】
2016177347.tif 000027
【図２６】
2016177347.tif 000028