(57)【要約】  Ｉ／Ｏ要求を発行するＩ／Ｏ方式として、Ｉ／Ｏ要求のＩ／Ｏ応答が返って来るまでそのタスクが待ち状態となる同期Ｉ／Ｏ方式と、Ｉ／Ｏ要求のＩ／Ｏ応答が返る前に別のタスクを実行することが可能な非同期Ｉ／Ｏ方式とがある。ＤＢＭＳは、タスクの実行においてＩ／Ｏ要求を発行する場合、Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、同期Ｉ／Ｏ方式と非同期Ｉ／Ｏ方式のうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行する。
2015145762.tif 000002
【特許請求の範囲】
【請求項１】
Ｉ／Ｏ応答速度が異なる複数の記憶デバイスに格納されているデータベースへのクエリを受け付けるクエリ受付部と、
前記受け付けたクエリを実行し、前記クエリの実行において、複数のデータベースオペレーションを実行するための２以上のタスクのうちの少なくとも２つのタスクを並行実行するクエリ実行部と
を有し、
Ｉ／Ｏ要求を発行するＩ／Ｏ方式として、Ｉ／Ｏ要求のＩ／Ｏ応答が返って来るまでそのタスクが待ち状態となる同期Ｉ／Ｏ方式と、Ｉ／Ｏ要求のＩ／Ｏ応答が返る前に別のタスクを実行することが可能な非同期Ｉ／Ｏ方式とがあり、
前記クエリ実行部は、タスクの実行においてＩ／Ｏ要求を発行する場合、前記複数の記憶デバイスのうちのＩ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、前記同期Ｉ／Ｏ方式と前記非同期Ｉ／Ｏ方式のうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行する、
データベース管理システム。
【請求項２】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が所定速度を超えていれば、前記同期Ｉ／Ｏ方式を選択し、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度以下であれば、前記非同期Ｉ／Ｏ方式を選択する、
請求項１記載のデータベース管理システム。
【請求項３】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が所定速度を超えていても、前記Ｉ／Ｏ先の記憶デバイスがビジーであれば、前記非同期Ｉ／Ｏ方式を選択する、
請求項２記載のデータベース管理システム。
【請求項４】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度を超えている場合、読出し対象データの種別を基に、前記同期Ｉ／Ｏ方式を選択するか否かを判定する、
請求項２記載のデータベース管理システム。
【請求項５】
前記クエリ実行部は、前記読出し対象データが索引であれば、前記同期Ｉ／Ｏ方式を選択することを決定し、前記読出し対象データが表であれば、前記非同期Ｉ／Ｏ方式を選択することを決定する、
請求項４記載のデータベース管理システム。
【請求項６】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度以下の場合、
並行実行可能タスク数が実行可能なタスク数未満であれば、前記非同期Ｉ／Ｏ方式を選択することを決定し、
前記並行実行可能タスク数が前記実行可能なタスク数を超えていれば、前記同期Ｉ／Ｏ方式を選択することを決定する、
請求項２記載のデータベース管理システム。
【請求項７】
前記並行実行可能タスク数は、ＣＰＵコアの数と、各ＣＰＵコアが並行実行可能なタスクの数との積である、
請求項６記載のデータベース管理システム。
【請求項８】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度以下の場合、Ｉ／Ｏ要求の多重度の上限と、前記非同期Ｉ／Ｏ方式が選択されたタスクの数と、前記非同期Ｉ／Ｏ方式に関するオーバヘッドとのうちの少なくとも１つを基に、前記非同期Ｉ／Ｏ方式を選択することを決定するか否かを判定する、
請求項２記載のデータベース管理システム。
【請求項９】
前記クエリ実行部は、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度を超えている場合と、前記Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が前記所定速度以下の場合とのうちの少なくとも１つの場合、前記Ｉ／Ｏ先の記憶デバイスのデバイスドライバの処理方式を基に、前記同期Ｉ／Ｏ方式を選択するか前記非同期Ｉ／Ｏ方式を選択するかを決定する、
請求項２記載のデータベース管理システム。
【請求項１０】
前記複数の記憶デバイスの各々のＩ／Ｏ応答速度は、その記憶デバイスについて予め定義されたＩ／Ｏ性能と、その記憶デバイスへの経路について測定された帯域とに基づいて決定される、
請求項１記載のデータベース管理システム。
【請求項１１】
複数の記憶デバイスのうちの少なくとも１つをストレージ装置が有し、
前記ストレージ装置から、前記ストレージ装置が有する記憶デバイスのＩ／Ｏ応答速度を表す情報、または、前記ストレージ装置が有する記憶デバイスのＩ／Ｏ性能と帯域を表す情報が取得される、
請求項１記載のデータベース管理システム。
【請求項１２】
前記クエリ実行部は、前記クエリの実行において、データベースオペレーションを実行するためのタスクを動的に生成し、動的に生成されたタスクを実行し、２以上の実行可能なタスクが存在する場合には、それら２以上のタスクのうちの少なくとも２つのタスクを並行して実行する、
請求項１記載のデータベース管理システム。
【請求項１３】
Ｉ／Ｏ応答速度が異なる複数の記憶デバイスに関する情報を記憶するメモリと、
前記情報を基に、前記複数の記憶デバイスに格納されているデータベースへのクエリを実行し、前記クエリの実行において、複数のデータベースオペレーションを実行するための２以上のタスクのうちの少なくとも２つのタスクを並行実行するプロセッサと
を有し、
Ｉ／Ｏ要求を発行するＩ／Ｏ方式として、Ｉ／Ｏ要求のＩ／Ｏ応答が返って来るまでそのタスクが待ち状態となる同期Ｉ／Ｏ方式と、Ｉ／Ｏ要求のＩ／Ｏ応答が返る前に別のタスクを実行することが可能な非同期Ｉ／Ｏ方式とがあり、
前記プロセッサは、タスクの実行においてＩ／Ｏ要求を発行する場合、前記複数の記憶デバイスのうちのＩ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、前記同期Ｉ／Ｏ方式と前記非同期Ｉ／Ｏ方式のうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行する、
計算機。
【請求項１４】
Ｉ／Ｏ応答速度が異なる複数の記憶デバイスに格納されているデータベースへのクエリを受け付け、
前記受け付けたクエリを実行し、前記クエリの実行において、複数のデータベースオペレーションを実行するための２以上のタスクの各々の実行において、Ｉ／Ｏ要求を発行する場合、前記複数の記憶デバイスのうちのＩ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、Ｉ／Ｏ要求のＩ／Ｏ応答が返って来るまでそのタスクが待ち状態となる同期Ｉ／Ｏ方式と、Ｉ／Ｏ要求のＩ／Ｏ応答が返る前に別のタスクを実行することが可能な非同期Ｉ／Ｏ方式とのうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行する、
データベース管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、データのＩ／Ｏ（Input/Output）に関し、例えば、データベース管理技術に関する。
【背景技術】
【０００２】
データベースを基盤とする多くのアプリケーションが存在し、データベースに関する一連の処理および管理を行うデータベース管理システム（以下、ＤＢＭＳ）は重要なものとなっている。データベース（以下、ＤＢ）の特徴の１つは、多量のデータを扱うことである。そのため、一般に、複数の記憶デバイスが、ＤＢのデータを記憶し、ＤＢＭＳがＤＢの処理を行う際には、ＤＢのデータを保持している記憶デバイスに対してＩ／Ｏ（アクセス）が発生する。特に、ペタバイトクラスの超大規模ＤＢのデータの中から、ある特定のデータを探し出す処理には膨大な時間を要することになる。【０００３】
そこで、大量のデータの中から特定のデータを探し出す検索処理を高速化する技術として、特許文献１に開示されている技術が知られている。特許文献１によれば、ＤＢＭＳは、１つのクエリを実行する際に、タスクを動的に生成し並行実行することで、データ読出し要求を多重化する。この技術を用いたＤＢＭＳによると、タスクを生成順で逐次的に実行するＤＢＭＳと比較して、検索性能を向上することができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−３４４１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
タスクを並行して実行するＤＢＭＳは、Ｉ／Ｏ要求（データ読出し要求）の多重化を図るため、非同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行する。非同期Ｉ／Ｏ方式とは、タスクの実行により発行されたＩ／Ｏ要求のＩ／Ｏ応答が返って来る前に別のタスクを実行することが可能なＩ／Ｏ方式である。非同期Ｉ／Ｏ方式が選択されることにより、或るタスクの実行において発行されたＩ／Ｏ要求のＩ／Ｏ応答が返って来る前に、実行対象のタスクを別のタスクに切り替えることができる。【０００６】
しかし、タスクを並行して実行するからといって、常に非同期Ｉ／Ｏ方式を選択することが適切だとは限らない。Ｉ／Ｏ方式の選択が不適切であると、ＤＢＭＳの性能の低下を招き得る。【０００７】
このような問題は、ＤＢＭＳに限らず、Ｉ／Ｏ要求を発行する他のコンピュータプログラムあるいは計算機システム等のシステムについても存在し得る。
【課題を解決するための手段】
【０００８】
Ｉ／Ｏ要求を発行するＩ／Ｏ方式として、Ｉ／Ｏ要求のＩ／Ｏ応答が返って来るまでそのタスクが待ち状態となる同期Ｉ／Ｏ方式と、Ｉ／Ｏ要求のＩ／Ｏ応答が返る前に別のタスクを実行することが可能な非同期Ｉ／Ｏ方式とがある。ＤＢＭＳは、タスクの実行においてＩ／Ｏ要求を発行する場合、Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、同期Ｉ／Ｏ方式と非同期Ｉ／Ｏ方式のうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行する。
【発明の効果】
【０００９】
ＤＢＭＳの性能を向上することができる。
【図面の簡単な説明】
【００１０】
【図１】実施例１にかかる計算機システムの構成例を示した図である。
【図２Ａ】ＤＢ管理情報の構成例を示した図である。
【図２Ｂ】ＤＢファイル情報の構成例を示した図である。
【図２Ｃ】ＤＢデータ領域情報の構成例を示した図である。
【図３Ａ】ＤＢスキーマ管理情報の構成例を示した図である。
【図３Ｂ】記憶デバイス性能情報の構成例を示した図である。
【図４Ａ】システム情報の構成例を示した図である。
【図４Ｂ】クエリ実行プラン情報の構成例を示した図である。
【図５Ａ】ＯＳ管理情報の構成例を示した図である。
【図５Ｂ】ストレージ管理情報の構成例を示した図である。
【図６】ＤＢＭＳの開始から終了までの処理のフローチャートである。
【図７】クエリ実行のフローチャートである。
【図８】Ｉ／Ｏ処理部（Ａ）のＩ／Ｏ処理のフローチャートである。
【図９】Ｉ／Ｏ処理部（Ｂ）のＩ／Ｏ処理のフローチャートである。
【図１０】Ｉ／Ｏ処理部（Ｂ）のＩ／Ｏ完了処理のフローチャートである。
【図１１】実施例１の概要を示した図である。
【図１２】実施例２にかかるタスク実行のフローチャートの一部分を示す。
【図１３】実施例３にかかる計算機システムの構成例を示した図である。
【図１４】実施例４にかかる計算機システムの構成例を示した図である。
【図１５】実施例５にかかる計算機システムの構成例を示した図である。
【発明を実施するための形態】
【００１１】
以下、幾つかの実施例を説明する。データベース管理システム（以下、ＤＢＭＳ）へのクエリの発行元としては、ＤＢＭＳの内部のコンピュータプログラムであってよく、もしくは、外部のコンピュータプログラムであってよい。例えば、クエリ発行元は、ＤＢＭＳを有する計算機内で実行されるコンピュータプログラム（例えばアプリケーションプログラム）であってもよいし、計算機に接続されたクライアント計算機等の装置で実行されるコンピュータプログラム（例えば、アプリケーションプログラム）であってもよい。
【００１２】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、計算機、ストレージ装置等に含まれるプロセッサ（例えばＣＰＵ（Central  Processing  Unit）によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）および／または通信インターフェイスデバイス（例えば通信ポート）等を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置（計算機またはストレージ装置等）が行う処理としてもよい。また、プロセッサは、処理の一部または全部を行うハードウエア回路を含んでもよい。プログラムは、プログラムソースから各コントローラにインストールされてもよい。プログラムソースは、例えば、プログラム配布計算機または記憶メディアであってもよい。
【００１３】
また、以下の説明では、要素の識別情報として、識別子、番号または名称が使用されるが、それに代えてまたは加えて、識別情報は、他種の情報を含んでもよい。
【実施例１】
【００１４】
図１１は、実施例１の概要を示した図である。【００１５】
通信ネットワーク１８２を介して、計算機１００にストレージ装置１５０が接続される。計算機１００は、記憶デバイス（Ｘ）１０８を有し、オペレーティングシステム（以下、ＯＳ）１４０およびＤＢＭＳ１２０を実行する。ストレージ装置１５０は、コントローラ１５４を有し、記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８を計算機１００に提供する。記憶デバイス（Ｘ）１０８、記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８は、データベース（以下、ＤＢ）のデータを記憶する。【００１６】
ＤＢＭＳ１２０は、クエリ実行部１２２、Ｉ／Ｏ処理部（Ａ）１３２、および、Ｉ／Ｏ処理部（Ｂ）１３４を有する。【００１７】
クエリ実行部１２２は、少なくとも２つのタスクを並行実行できる。例えば、クエリ実行部１２２は、データベースオペレーション（以下、ＤＢオペレーション）を実行するためのタスクを動的に生成し、動的に生成されたタスクを実行し、２以上の実行可能なタスクが存在する場合には、それら２以上のタスクのうちの少なくとも２つのタスクを並行して実行することで、Ｉ／Ｏ要求（例えばデータ読出し要求）を多重化して発行することができる。タスクの実装としては、例えば、ＯＳ１４０が管理するプロセスやスレッド（リアルスレッド）、または、アプリケーションやミドルウェアが実装する擬似プロセスや擬似スレッド（ユーザスレッド）など任意の実行環境が利用できる。本実施例では、リアルスレッド、およびユーザスレッドがタスクを実行する。【００１８】
Ｉ／Ｏ要求の発行に使用されるＩ／Ｏ方式として、非同期Ｉ／Ｏ方式と、同期Ｉ／Ｏ方式がある。同期Ｉ／Ｏ方式は、Ｉ／Ｏ要求を発行したユーザスレッドがＩ／Ｏ応答が返って来るまで待たされるＩ／Ｏ方式である。一方、非同期Ｉ／Ｏ方式は、Ｉ／Ｏ要求を発行したユーザスレッドがＩ／Ｏ応答を待っている間、別のユーザスレッドの処理を実行することが可能なＩ／Ｏ方式である。Ｉ／Ｏ処理部（Ａ）１３２は、同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行するモジュールであり、Ｉ／Ｏ処理部（Ｂ）１３４は、非同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行するモジュールである。例えば、ＯＳ１４０が、同期Ｉ／Ｏ方式のための関数（以下、同期Ｉ／Ｏ関数）と、非同期Ｉ／Ｏ方式のための関数（以下、非同期Ｉ／Ｏ関数）を有していて、Ｉ／Ｏ処理部（Ａ）１３２は、ＯＳ１４０の同期Ｉ／Ｏ関数をコールしてＩ／Ｏ要求を発行し、Ｉ／Ｏ処理部（Ｂ）１３４は、ＯＳ１４０の非同期Ｉ／Ｏ関数をコールしてＩ／Ｏ要求を発行する。タスク（本実施例ではユーザスレッド）の実行によりＩ／Ｏ要求が発行される場合、いずれのＩ／Ｏ方式（Ｉ／Ｏ処理部）によりＩ／Ｏ要求を発行するかが選択され、選択されたＩ／Ｏ方式（Ｉ／Ｏ処理部）によりＩ／Ｏ要求が発行される。Ｉ／Ｏ先の記憶デバイスが、計算機１００内の記憶デバイス（Ｘ）１０８の場合、ＯＳ１４０により、記憶デバイス（Ｘ）１０８に対するＩ／Ｏが行われ、Ｉ／Ｏ応答がＯＳ１４０により受けられる。Ｉ／Ｏ先の記憶デバイスが、ストレージ装置１５０内の記憶デバイス（Ｙ）１５６または記憶デバイス（Ｚ）１５８の場合、ＯＳ１４０によりＩ／Ｏ要求がストレージ装置１５０に送信され、Ｉ／Ｏ応答が、ストレージ装置１５０から送られＯＳ１４０により受けられる。ＯＳ１４０は、受けたＩ／Ｏ応答の完了割り込みをＤＢＭＳ１２０に送信する。Ｉ／Ｏ応答の完了割り込みを受けたＤＢＭＳ１２０は、同期Ｉ／Ｏ方式の場合直ちにデータをＯＳ１４０から転送し処理を継続する。非同期Ｉ／Ｏ方式の場合は、完了しているＩ／Ｏを一括して取得し、個々のＩ／Ｏ応答に対するＩ／Ｏ完了処理を実行する。なお、ＤＢＭＳ１２０は、ＯＳ１４０からＩ／Ｏ応答の完了割り込みを受けるまで待っているのではなく、定期的に完了しているＩ／ＯがあるかＯＳ１４０に確認するとしてもよい。また、Ｉ／Ｏ処理部（Ａ）１３２の全部または一部、および、Ｉ／Ｏ処理部（Ｂ）１３４の全部または一部（例えば、Ｉ／Ｏ処理部（Ｂ）１３４のうちＩ／Ｏ処理を行う部分）は、ＤＢオペレーションを行ういずれかのユーザスレッドであってもよい。【００１９】
記憶デバイス（Ｘ）１０８、記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８の各々は、物理記憶デバイスであってもよいし、論理記憶デバイスであってもよい。物理記憶デバイスは、ＨＤＤ（Hard  Disk  Drive）、ＦＭＤ（Flash  Memory  Device）、および、他の記憶媒体を有する記憶デバイスのいずれでもよい。ＦＭＤは、一般的にはＳＳＤ（Solid  State  Drive）である。論理記憶デバイスとしては、１以上の物理記憶デバイス（例えばＲＡＩＤ（（Redundant  Array  of  Independent  Disks））グループ）に基づく論理記憶デバイスもあれば、Thin  Provisioning技術に従う仮想的な論理記憶デバイスもある。論理記憶デバイスは、一般に、論理ボリュームまたは論理ユニット（以下、ＬＵ）と呼ばれることもある。本実施例では、記憶デバイス（Ｘ）１０８は、ＦＭＤであり、記憶デバイス（Ｙ）１５６は、複数（または１つ）のＦＭＤに基づく論理記憶デバイスであり、記憶デバイス（Ｚ）１５８は、複数（または１つ）のＨＤＤに基づく論理記憶デバイスである。また、本実施例では、論理記憶デバイスを「ＬＵ」と言うことがある。Ｉ／Ｏ先の記憶デバイスがＬＵであっても、最終的には、そのＬＵにおけるＩ／Ｏ先領域に対応した物理領域（その物理領域を有する物理記憶デバイス）に対してＩ／Ｏが発生することになる。【００２０】
記憶デバイス（Ｘ）１０８、記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８のうちの少なくとも２つの記憶デバイスはＩ／Ｏ応答の速さ（Ｉ／Ｏ応答時間）が異なる。例えば、記憶デバイス（Ｘ）１０８、記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８のうち、記憶デバイス（Ｚ）１５８のＩ／Ｏ応答が最も遅く、記憶デバイス（Ｘ）１０８のＩ／Ｏ応答が最も速い。記憶デバイス（Ｙ）１５６のＩ／Ｏ応答は、少なくとも記憶デバイス（Ｚ）１５８のＩ／Ｏ応答より速く、記憶デバイス（Ｘ）１０８のＩ／Ｏ応答と同じかそれより遅い。【００２１】
ＤＢＭＳ１２０は、Ｉ／Ｏ応答速度情報（図示せず）を有する。Ｉ／Ｏ応答速度情報は、ＤＢのデータを格納している記憶デバイス毎のＩ／Ｏ応答速度を含む。Ｉ／Ｏ応答速度は、Ｉ／Ｏ応答の速さを表す値、例えばＩ／Ｏ応答時間であり、固定値でも可変値でもよい。Ｉ／Ｏ応答速度は、外部入力値（計算機１００の外部から入力された値）であってもよいし、測定値（ＤＢＭＳ１２０により繰り返し測定される値）であってもよいし、外部入力値と測定値の両方を基に決定された値であってもよい。外部入力値は、管理者により計算機１００に入力された値であってもよいし、ストレージ装置１５０から取得された値であってもよい。Ｉ／Ｏ応答測定値が、外部入力値と測定値の両方を基に決定された値の場合、例えば、外部入力値が、記憶デバイスのＩ／Ｏ応答時間の理想値（例えば仕様上の値）であり、測定値が、記憶デバイスへの経路の帯域の値である。【００２２】
クエリ実行部１２２は、各タスクの実行において、Ｉ／Ｏ要求を発行する場合、Ｉ／Ｏ応答速度情報を参照しＩ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基にＩ／Ｏ方式を選択し、選択したＩ／Ｏ方式に対応したＩ／Ｏ処理部１３２または１３４を用いて、Ｉ／Ｏ要求を発行する。例えば、クエリ実行部１２２は、Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度が、同期Ｉ／Ｏ方式と非同期Ｉ／Ｏ方式のどちらの条件に適合するかを基に、Ｉ／Ｏ方式を選択する。図１１の例では、同期Ｉ／Ｏ方式の条件は、Ｉ／Ｏ応答速度が所定速度を超えている（例えばＩ／Ｏ応答時間が所定時間未満）であり、非同期Ｉ／Ｏ方式の条件は、Ｉ／Ｏ応答速度が所定速度以下（例えばＩ／Ｏ応答時間が所定時間以上）である。そして、記憶デバイス（Ｘ）１０８および記憶デバイス（Ｙ）１５６の各々のＩ／Ｏ応答速度が所定速度を超えていて、記憶デバイス（Ｚ）１５８のＩ／Ｏ応答速度が所定速度未満であるとする。このため、クエリ実行部１２２は、Ｉ／Ｏ先が記憶デバイス（Ｘ）１０８または記憶デバイス（Ｙ）１５６の場合、同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ａ）１３２）を選択し、Ｉ／Ｏ先が記憶デバイス（Ｚ）１５８の場合、非同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ｂ）１３４）を選択する。【００２３】
非同期Ｉ／Ｏ方式によれば、オーバヘッドが発生する。オーバヘッドは、例えば、Ｉ／Ｏ応答が返って来る前に実行対象のタスク（本実施例ではユーザスレッド）を別のタスクに切り替えること、および、Ｉ／Ｏ完了処理（例えば、ＯＳ１４０が受けて保持している全てのＩ／Ｏ応答をＯＳ１４０から取得する処理である一括刈取りを含む）である。Ｉ／Ｏ応答が遅い記憶デバイスがＩ／Ｏ先の場合、オーバヘッドは相対的に無視できると考えられる。しかし、Ｉ／Ｏ応答が速い記憶デバイスがＩ／Ｏ先の場合、オーバヘッドによってＤＢＭＳ１２０の性能が低下する可能性がある。本実施例によれば、Ｉ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度に応じたＩ／Ｏ方式でＩ／Ｏ要求を発行できる。これにより、ＤＢＭＳ１２０の性能を向上することができる。具体的には、Ｉ／Ｏ応答が速い記憶デバイスに対するＩ／Ｏ要求の発行は同期Ｉ／Ｏ方式により行われるので、ユーザスレッドの切り替えやＩ／Ｏ完了処理といったオーバヘッドを削減することができ、Ｉ／Ｏ応答が遅い記憶デバイスに対するＩ／Ｏ要求の発行は非同期Ｉ／Ｏ方式により行われるので、ＣＰＵが待ち状態となる間別のユーザスレッドでＣＰＵを使用することができる。【００２４】
以下、本実施例を詳細に説明する。【００２５】
図１は、実施例１にかかる計算機システムの構成例を示した図である。【００２６】
通信ネットワーク１８０および１８２を介して、計算機１００とストレージ装置１５０とが接続される。計算機１００は、ストレージ装置１５０に格納されているＤＢのデータを管理するＤＢＭＳ１２０を実行する。通信ネットワーク１８０は、例えば、ＬＡＮ（Local  Area  Network）やＷＡＮ（Wide  Area  Network）等のネットワークでよく、通信ネットワーク１８２は、ファイバチャネル等で構成されるネットワーク（例えばＳＡＮ（Storage  Are   Network））でよい。図１において、計算機１００およびストレージ装置１５０は、それぞれ１台のみ記載しているが、どちらとも複数台であってもよい。また、計算機１００とストレージ装置１５０は、異なる通信ネットワーク１８０および１８２に代えて、１つの通信ネットワークを介して接続されてもよい。【００２７】
計算機１００は、内部バス１０２で接続されたＣＰＵ（プロセッサ）１０４、Ｉ／Ｏ（Input/Output）デバイス１０６、記憶デバイス（Ｘ）１０８、メモリ１１０、Ｉ／Ｆ（１）１１２（通信ネットワーク１８０とのインターフェイスデバイス）、および、Ｉ／Ｆ（２）１１４（通信ネットワーク１８２とのインターフェイスデバイス）を有する。なお、記憶デバイス（Ｘ）１０８は内部バス１０２ではなく直接ＣＰＵ１０４に接続されても良い。記憶デバイス（Ｘ）１０８およびメモリ１１０の少なくとも一方には、ＤＢＭＳ１２０およびＯＳ１４０が格納され、ＣＰＵ１０４によって実行される。【００２８】
ＤＢＭＳ１２０は、クエリ受付部１２１、クエリ実行プラン生成部１２３、クエリ実行部１２２、Ｉ／Ｏ処理部（Ａ）１３２およびＩ／Ｏ処理部（Ｂ）１３４を有する。クエリ受付部１２１は、ＤＢへのクエリを受け付ける。クエリ実行プラン生成部１２３は、受け付けたクエリを実行するために必要なＤＢオペレーションを表す情報である処理ブロックを含むクエリ実行プランを生成する。クエリ実行部１２２は、生成したクエリ実行プランに基づいてクエリを実行し、そのクエリの実行において、ＤＢオペレーションを実行するためのタスクを動的に生成し、動的に生成された複数のタスクを並行して実行することで、多重でＩ／Ｏ要求（データ読み出し要求）をＤＢに発行する。例えば、クエリ実行部１２２は、クエリの実行において、（ａ）ＤＢオペレーションを実行するためのタスクを生成すること、（ｂ）生成されたタスクを実行することで、必要に応じてそのタスクに対応したＤＢオペレーションに必要なデータを読み出すためにＤＢへ読出し要求を発行すること、（ｃ）上記（ｂ）で実行されたタスクに対応したＮ番目のＤＢオペレーションの実行結果に基づき（Ｎ＋１）番目のＤＢオペレーションを実行する場合には、その実行結果に基づくタスクを新たに生成すること（Ｎは１以上の整数）、および、（ｄ）その新たに生成したタスクについて上記（ｂ）および上記（ｃ）を行うこと、を行い、上記（ｂ）および（ｄ）において、２以上の実行可能なタスクが存在する場合には、それら２以上のタスクのうちの少なくとも２つのタスクを並行して実行するようになっている。Ｉ／Ｏ処理部（Ａ）１３２およびＩ／Ｏ処理部（Ｂ）１３４は、それぞれ、クエリの実行においてＩ／Ｏ要求の発行に使用される。Ｉ／Ｏ処理部（Ａ）１３２は、同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行し、Ｉ／Ｏ処理部（Ｂ）１３４は、非同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行する。Ｉ／Ｏ処理部１３２および１３４のうちの少なくとも１つが、２つ以上あってもよい。また、少なくとも同期Ｉ／Ｏ方式および非同期Ｉ／Ｏ方式が存在するが、それより多くのＩ／Ｏ方式が存在してもよい。Ｉ／Ｏ処理部１３２および１３４は、それぞれ、ＯＳ１４０に対するインターフェイスも兼ねる。【００２９】
ＤＢＭＳ１２０は、ＤＢの管理に用いるＤＢ管理情報１２４、記憶デバイスのＩ／Ｏ応答の速さに関する記憶デバイス性能情報１２６、ＤＢＭＳ１２０を含んだシステム（本実施例では計算機）に関するシステム情報１２８、および、クエリを基に生成されたクエリ実行プランを表すクエリ実行プラン情報１３０を保持する。【００３０】
ＯＳ１４０は、ＯＳ１４０上の論理デバイスと記憶デバイス（計算機１００内の記憶デバイス（Ｘ）１０８、および、ストレージ装置１５０上の記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８等）とを対応付けるＯＳ管理情報１４２を保持する。なお、ＯＳ管理情報１４２は、ＤＢＭＳ１２０からも参照可能である。【００３１】
ストレージ装置１５０は、コントローラ１５４、複数のＦＭＤ２５６、および、複数のＨＤＤ２５８を有する。それらは、内部バス１５２によって接続される。複数のＦＭＤ２５６により、１以上のＲＡＩＤグループが構成され、その１以上のＲＡＩＤグループを基に、記憶デバイス（Ｙ）１５６が提供される。同様に、複数のＨＤＤ２５８により、１以上のＲＡＩＤグループが構成され、その１以上のＲＡＩＤグループを基に、記憶デバイス（Ｚ）１５８が提供される。なお、図１において、コントローラ１５４は、１台のみ記載されているが、複数台であってもよい。【００３２】
コントローラ１５４は、例えば、内部バス１６０で接続されたＩ／Ｆ（１）１６２（通信ネットワーク１８０とのインターフェイスデバイス）、Ｉ／Ｆ（２）１６４（通信ネットワーク１８２とのインターフェイスデバイス）、ＣＰＵ（プロセッサ）１６６、キャッシュメモリ１６８、およびメモリ１７０を有する。メモリ１７０には、ストレージ装置１５０を制御する制御プログラム１７２が格納され、ＣＰＵ１６６によって実行される。制御プログラム１７２は、ストレージ装置１５０のＬＵ（記憶デバイス１５６および１５８）と物理記憶デバイスを対応付けるストレージ管理情報１７４を保持する。【００３３】
上述したクエリ受付部１２１、クエリ実行プラン生成部１２３、クエリ実行部１２２、Ｉ／Ｏ処理部（Ａ）１３２およびＩ／Ｏ処理部（Ｂ）１３４は、ＤＢＭＳ１２０がＣＰＵ１０４で実行されることによって実現されるが、これらのうち、少なくとも一の構成要素が行う処理の少なくとも一部が、ハードウェアによって実現されていてもよい。ＤＢＭＳ１２０をはじめとするコンピュータプログラムは、プログラムソースから計算機１００にインストールされていてもよい。プログラムソースは、例えば、計算機１００が読み取り可能な記憶媒体であってもよい。【００３４】
図１に示すＤＢＭＳ１２０の構成は一例に過ぎない。例えば、ある構成要素は複数の構成要素に分割されていてもよく、複数の構成要素が１つの構成要素に統合されていてもよい。【００３５】
以下、上述した各種情報を詳細に説明する。なお、本実施例において、ＤＢＭＳ１２０のセットアップ、ストレージ装置１５０の論理ユニット構成やＯＳ側の論理デバイス構成、ＤＢの表および索引はそれぞれ定義済みであるとし、ＤＢのデータは配置済みであるものとする。また、それに合わせて、ＤＢ管理情報１２４、システム情報１２８、ＯＳ管理情報１４２、ストレージ管理情報１７４には、それぞれ情報が格納されているものとする。これらの情報１２４、１２８、１４２および１７２の少なくとも１つは、管理者により外部から入力されてよいものとする。【００３６】
図２Ａは、ＤＢ管理情報１２４の構成例を示した図である。【００３７】
ＤＢ管理情報１２４は、ＤＢのデータを配置するファイルに関する情報であるＤＢファイル情報２００、ＤＢのデータ領域に関する情報であるＤＢデータ領域情報２０２、および、ＤＢの表や索引といったスキーマの管理情報であるＤＢスキーマ管理情報２０４を含む。【００３８】
図２Ｂは、ＤＢファイル情報２００の構成例を示した図である。【００３９】
ＤＢファイル情報２００は、ＤＢのデータを配置するＤＢファイルとＯＳ１４０上のデバイスファイル（論理デバイス）のマッピングに関する情報であり、ＤＢファイル毎にエントリを有する。各エントリは、ＤＢファイルパス（ＤＢファイルを識別するためのファイルパス）を登録するフィールド２２０、サイズ（そのＤＢファイルのサイズ（ここでは一例としてバイト単位））を登録するフィールド２２２、および、デバイスファイルパス（そのＤＢファイルを配置するデバイスファイル（論理デバイス））のパスを登録するフィールド２２４を有する。【００４０】
図２Ｃは、ＤＢデータ領域情報２０２の構成例を示した図である。【００４１】
ＤＢデータ領域情報２０２は、ＤＢのスキーマを配置するＤＢデータ領域とそのＤＢデータ領域が配置されるＤＢファイルのマッピングに関する情報であり、ＤＢデータ領域毎にエントリを有する。各エントリは、ＤＢデータ領域ＩＤ（ＤＢデータ領域を識別するための識別子）を登録するフィールド２４０、ＤＢデータ領域サイズ（ＤＢデータ領域のサイズ）を登録するフィールド２４２、および、ＤＢファイルパス（ＤＢデータ領域を構成するＤＢファイルのファイルパス）を登録するフィールド２４４を有する。なお、１つのＤＢデータ領域のエントリに複数のＤＢファイルが設定されてもよい。【００４２】
図３Ａは、ＤＢスキーマ管理情報２０４の構成例を示した図である。【００４３】
ＤＢスキーマ管理情報２０４は、ＤＢの表や索引といったスキーマを管理する情報であり、スキーマ毎にエントリを有する。各エントリは、スキーマＩＤ（スキーマを識別するための識別子）を登録するフィールド３００、スキーマ名（そのスキーマの名称）を登録するフィールド３０２、スキーマ種別（そのスキーマの種別）を登録するフィールド３０４、ＤＢデータ領域ＩＤ（そのスキーマが配置されるＤＢデータ領域の識別子）を登録するフィールド３０６、および、データサイズ（そのスキーマのデータサイズ）を登録するフィールド３０８を有する。【００４４】
図３Ｂは、記憶デバイス性能情報１２６の構成例を示した図である。【００４５】
記憶デバイス性能情報１２６は、記憶デバイス毎のＩ／Ｏ応答の速さに関する情報を表し、記憶デバイス毎にエントリを有する。エントリは、正確には、記憶デバイスにマッピングされたデバイスファイル（論理デバイス）毎に、存在する。各エントリは、デバイスファイルパス（論理デバイスを識別するためのデバイスファイルパス）を登録するフィールド３２０、Ｉ／Ｏ数（その記憶デバイスに対して発行されたＩ／Ｏ要求の数）を登録するフィールド３２２、平均Ｉ／Ｏ応答時間を登録するフィールド３２４を有する。すなわち、図３Ｂの例では、Ｉ／Ｏ応答速度は、平均Ｉ／Ｏ応答時間である。平均Ｉ／Ｏ応答時間は、対象期間における１以上のＩ／Ｏ応答時間の平均である。対象期間は、第１の時点（例えば現時点）から、第１の時点よりも過去の第２の時点までの期間である。記憶デバイスに対するＩ／Ｏ要求が発行された場合、クエリ実行部１２２が、Ｉ／Ｏ先記憶デバイスに対応したＩ／Ｏ数をカウントアップし、そのＩ／Ｏ要求についてのＩ／Ｏ応答時間を算出し、算出されたＩ／Ｏ応答時間を基に、Ｉ／Ｏ先記憶デバイスに対応した平均Ｉ／Ｏ応答時間を更新する。Ｉ／Ｏ応答時間は、Ｉ／Ｏ開始時刻からＩ／Ｏ完了時刻までの時間である。Ｉ／Ｏ開始時刻は、Ｉ／Ｏ処理の開始時刻、または、Ｉ／Ｏ処理においてＩ／Ｏ要求をＯＳ１４０に発行した時刻である。Ｉ／Ｏ完了時刻は、ＯＳ１４０からＩ／Ｏ応答を受けた時刻またはＩ／Ｏ処理の完了時刻である。なお、Ｉ／Ｏ応答速度は、平均Ｉ／Ｏ応答時間に代えて、対象期間における１以上のＩ／Ｏ応答時間を基に決定される他種のＩ／Ｏ応答時間、例えば、対象期間における最長Ｉ／Ｏ応答時間、または、対象期間における最短Ｉ／Ｏ応答時間でもよい。【００４６】
図４Ａは、システム情報１２８の構成例を示した図である。【００４７】
システム情報１２８は、ＤＢＭＳ１２０を有するシステム（計算機１００）に関する情報を表す。システム情報１２８は、ＣＰＵコア数（計算機１００のＣＰＵ１０４が有するＣＰＵコアの数）を登録するフィールド４００、ＣＰＵコア並行実行数（各ＣＰＵコアが並行実行可能なユーザスレッドの数）を登録するフィールド４０２、リアルスレッド数（ＤＢＭＳ１２０がタスクを実行する際に使用可能なリアルスレッドの数）を登録するフィールド４０４、ユーザスレッド数（ＤＢＭＳ１２０がタスクを実行する際に使用可能な１つのリアルスレッド内部のユーザスレッドの数）を登録するフィールド４０６、および、Ｉ／Ｏ方式選択閾値（Ｉ／Ｏ方式の選択の際に平均Ｉ／Ｏ応答時間と比較される閾値）を登録するフィールド４０８を有する。リアルスレッドは、ＯＳ１４０が有するスレッドであり、ユーザスレッドは、リアルスレッド内の擬似スレッドである。ＤＢＭＳ１２０が、複数のユーザスレッドを生成し、それらは、複数のリアルスレッドに割り振られる。図４Ａの例によれば、１２８のリアルスレッドが存在する。１つのリアルスレッドは、１つのＣＰＵ論理コア上で実行され、１つのリアルスレッドにおいて、５１２のユーザスレッドが切り替えられながらそれぞれ実行される。同期Ｉ／Ｏ方式が選択されたユーザスレッドは、Ｉ／Ｏ応答が返ってくるまでは、リアルスレッドにおいても待ち状態となる（少なくともＩ／Ｏ応答が返って来るまで別のユーザスレッドに切り替わらない）。一方、非同期Ｉ／Ｏ方式が選択されたユーザスレッドはＩ／Ｏ発行後別のユーザスレッドに切り替えられ、リアルスレッドにおいてあるユーザスレッドがＩ／Ｏを発行している間も別のユーザスレッドの処理を実行する。なお、本実施例において、動的にタスクが生成されるとは、用意されたユーザスレッドに必要な値が入力されることでユーザスレッドが実行可能な状態になること、である。【００４８】
図４Ｂは、クエリ実行プラン情報１３０の構成例を示した図である。【００４９】
クエリ実行プラン情報１３０は、クエリを受付けた際に生成するクエリ実行プランの情報を表し、１つの処理ブロック（ＤＢオペレーション）毎にエントリを有する。各エントリは、クエリＩＤ（クエリを識別するための識別子）を登録するフィールド４３０、処理ブロックＩＤ（その処理ブロックを識別するための識別子）を登録するフィールド４３２、処理種別（その処理ブロックの処理種別）を登録するフィールド４３４、アクセススキーマＩＤ（その処理ブロックがアクセスするスキーマの識別子）を登録するフィールド４３６、左処理ブロックＩＤ（その処理ブロックに繋がる左側（直前）の処理ブロックの識別子）を登録するフィールド４３８、右処理ブロックＩＤ（その処理ブロックに繋がる右側（直後）の処理ブロックの識別子）を登録するフィールド４４０、および、検索条件（その処理ブロックの検索条件）を登録するフィールド４４２を有する。【００５０】
図５Ａは、ＯＳ管理情報１４２の構成例を示した図である。【００５１】
ＯＳ管理情報１４２は、論理デバイス（デバイスファイル）と記憶デバイスとのマッピングに関する情報であり、論理デバイス毎にエントリを有する。各エントリは、デバイスファイルパス（デバイスファイルのパス）を登録するフィールド５００、デバイス種別（マッピングされた記憶デバイスの種別）を登録するフィールド５０２、サイズ（マッピングされた記憶デバイスのサイズ（記憶容量））を登録するフィールド５０４、装置ＩＤ（マッピングされた記憶デバイスを有する装置（ストレージ装置）の識別子）を登録するフィールド５０６、および、ＬＵＮ（マッピングされたＬＵの識別子としてのＬＵＮ（Logical  Unit  Number））を登録するフィールド５０８を有する。フィールド５０２に登録される記憶デバイス種別は、マッピングされた記憶デバイスが物理記憶デバイスであれば、その物理記憶デバイスの種別であり、マッピングされた記憶デバイスがＬＵであれば、そのＬＵの基になっている物理記憶デバイスの種別である。マッピングされた記憶デバイスが、計算機１００内の記憶デバイス（Ｘ）１０８であっても、ＯＳ管理情報１４２にエントリが設けられる。そのエントリでは、装置ＩＤおよびＬＵＮは、それぞれ“ＮＵＬＬ”とされる。【００５２】
図５Ｂは、ストレージ管理情報１７４の構成例を示した図である。【００５３】
ストレージ管理情報１７４は、ストレージ装置１５０内の論理ページ（論理的な記憶領域）とストレージ装置１５０内の物理ページ（物理的な領域）のマッピングに関する情報である。ＬＵは、複数の論理ページで構成されており、ストレージ管理情報１７４は、論理ページ毎にエントリを有する。各エントリは、ＬＵＮ（その論理ページを含んだＬＵのＬＵＮ）を登録するフィールド５２０、論理ページアドレス（その論理ページのアドレス）を登録するフィールド５２２、デバイス番号（論理ページの基になっている物理記憶デバイスの識別子としての番号）を登録するフィールド５２４、デバイス種別（論理ページの基になっている物理記憶デバイスの種別）を登録するフィールド５２６、および、物理ページアドレス（論理ページに対応する物理ページのアドレス）を登録するフィールド５２８を有する。【００５４】
以下、本実施例で行われる処理の詳細を説明する。【００５５】
図６は、ＤＢＭＳ１２０の開始から終了までの処理のフローチャートである。【００５６】
ＤＢＭＳ１２０は、起動した直後、所定の処理機化処理を行う（ステップ６０１）。例えば、ＤＢＭＳ１２０は、内部の管理情報を初期化し、外部とのコネクションを確立する。また、例えば、ＤＢＭＳ１２０は、ＯＳ管理情報１４２を基に、ＤＢのデータを保持している記憶デバイスのリストを取得し、その後、記憶デバイス性能情報１２６を生成する。記憶デバイス性能情報１２６の各エントリにおいて、Ｉ／Ｏ数が登録されるフィールド４０２、および、平均Ｉ／Ｏ応答時間が登録するフィールド４０４は、それぞれブランクである。なお、このステップ６０１において、ＤＢＭＳ１２０は、複数のリアルスレッド、およびユーザスレッドを生成してよい。【００５７】
ＤＢＭＳ１２０はクエリ受付の待ち状態に入る。クエリ受付部１２１は、クエリを受け付けたか否かを判定する（ステップ６０３）。ステップ６０３の判定結果が否定の場合（ステップ６０２：Ｎｏ）、つまり、クエリ受付待ち状態において、クエリ受付部１２１は、ＤＢＭＳ１２０を終了するか否かを判定する（ステップ６０３）。ステップ６０３の判定結果が肯定の場合（ステップ６０３：Ｙｅｓ）、ＤＢＭＳ１２０が終了する。【００５８】
ステップ６０２の判定結果が肯定の場合（ステップ６０２：Ｙｅｓ）、クエリ待ち状態から抜け、クエリ実行プラン生成部１２３は、受け付けたクエリを基にクエリ実行プランを生成し、そのクエリ実行プランの情報をクエリ実行プラン情報１３０に登録する（ステップ６０４）。その後、クエリ実行部１２２が、そのクエリ実行プラン情報１３０に基づいてクエリを実行する（ステップ６０５）。【００５９】
図７は、クエリ実行のフローチャートである。なお、実行するクエリをレコードレベルで複数のクエリ部分に分割し、各クエリ部分について、少なくとも２つのタスクが並行に実行されてもよい。この場合、１つのクエリ部分について図７のフローチャートが実行される。【００６０】
クエリ実行部１２２は、クエリ実行プラン情報１３０を参照し、実行する処理ブロックを特定する（ステップ７０１）。続いて、クエリ実行部１２２は、特定した処理ブロックのアクセススキーマＩＤをキーに、ＤＢスキーマ管理情報２０４から、そのアクセススキーマＩＤに一致するスキーマＩＤを含んだエントリにおけるＤＢデータ領域ＩＤを取得する（ステップ７０２）。続いて、クエリ実行部１２２は、取得したＤＢデータ領域ＩＤをキーに、ＤＢデータ領域情報２０２から、そのＤＢデータ領域ＩＤに一致するＤＢデータ領域ＩＤを含んだエントリにおけるＤＢファイルパスを特定する（ステップ７０３）。続いて、クエリ実行部１２２は、特定したＤＢファイルパスをキーに、ＤＢファイル情報２００から、そのＤＢファイルパスに一致するＤＢファイルパスを含んだエントリにおけるデバイスファイルパスを特定する（ステップ７０４）。続いて、クエリ実行部１２２は、特定したデバイスファイルパスをキーに、記憶デバイス性能情報１２６から、そのデバイスファイルパスに一致するデバイスファイルパスを含んだエントリにおける平均Ｉ／Ｏ応答時間を特定する（ステップ７０５）。この特定された平均Ｉ／Ｏ応答時間が、Ｉ／Ｏ先の記憶デバイスの平均Ｉ／Ｏ応答時間である。【００６１】
クエリ実行部１２２は、特定した平均Ｉ／Ｏ応答時間が、システム情報１２８におけるＩ／Ｏ方式選択閾値未満か否かを判定する（ステップ７０６）。【００６２】
ステップ７０６の判定結果が肯定の場合（ステップ７０６：Ｙｅｓ）、クエリ実行部１２２は、Ｉ／Ｏ処理部（Ａ）１３２を選択し、Ｉ／Ｏ処理部（Ａ）１３２にＩ／Ｏ処理の実行を要求する（ステップ７０７）。一方、ステップ７０６の判定結果が否定の場合（ステップ７０６：Ｎｏ）、クエリ実行部１２２は、Ｉ／Ｏ処理部（Ｂ）１３４を選択し、Ｉ／Ｏ処理部（Ｂ）１３４にＩ／Ｏ処理の実行を要求する（ステップ７０８）。ステップ７０７および７０８のいずれも、ユーザスレッドの実行により行われる。【００６３】
クエリ実行部１２２は、ステップ７０７または７０８が完了した後、クエリ実行プラン情報１３０を基に、クエリが終了したか否かを判定する（ステップ７０９）。ステップ７０９の判定結果が肯定の場合（ステップ７０９：Ｙｅｓ）、クエリ実行が終了する。ステップ７０９の判定結果が否定の場合（ステップ７０９：Ｎｏ）、クエリ実行部１２２は、ステップ７０１から処理を継続する。【００６４】
図８は、Ｉ／Ｏ処理部（Ａ）１３２のＩ／Ｏ処理のフローチャートである。【００６５】
Ｉ／Ｏ処理部（Ａ）１３２は、クエリ実行部１２２から要求を受け、Ｉ／Ｏ処理の開始時刻を取得し内部に保持する（ステップ８０１）。そして、Ｉ／Ｏ処理部（Ａ）１３２は、ＯＳ１４０に対して同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行する（ステップ８０２）。なお、Ｉ／Ｏ開始時刻は、例えば、ＯＳ１４０がＬｉｎｕｘ(登録商標)の場合、そのＯＳのＲＤＴＳＣ命令を発行して取得することができる。【００６６】
Ｉ／Ｏ処理部（Ａ）１３２は、Ｉ／Ｏ要求発行後、ＯＳ１４０からＩ／Ｏ応答（Ｉ／Ｏ要求の応答）が返って来るまで待機する（ステップ８０３）。【００６７】
ＯＳ１４０からＩ／Ｏ応答が返って来ると、Ｉ／Ｏ処理部（Ａ）１３２は、Ｉ／Ｏ完了時刻（Ｉ／Ｏ応答を受けた時刻）を取得し、Ｉ／Ｏ応答時間（ステップ８０１で保持したＩ／Ｏ開始時刻から、取得したＩ／Ｏ終了時刻までの時間）を算出する（ステップ８０４）。そして、Ｉ／Ｏ処理部（Ａ）１３２は、記憶デバイス性能情報１２６を更新、すなわち、Ｉ／Ｏ先記憶デバイスに対応するＩ／Ｏ数をカウントアップし、且つ、Ｉ／Ｏ先記憶デバイスに対応する平均Ｉ／Ｏ応答時間を更新する（ステップ８０５）。【００６８】
図９は、Ｉ／Ｏ処理部（Ｂ）１３４のＩ／Ｏ処理のフローチャートである。【００６９】
Ｉ／Ｏ処理部（Ｂ）１３４は、クエリ実行部１２２から要求を受け、Ｉ／Ｏ開始時刻を取得し内部に保持する（ステップ９０１）。【００７０】
続いて、Ｉ／Ｏ処理部（Ｂ）１３４は、ＯＳ１４０に対して非同期Ｉ／Ｏ方式によりＩ／Ｏ要求を発行し（ステップ９０２）、実行対象のユーザスレッドを、Ｉ／Ｏ処理部（Ｂ）１３４にＩ／Ｏ処理を要求したユーザスレッド（Ｉ／Ｏ処理部（Ｂ）１３２を用いてＩ／Ｏ要求を発行したユーザスレッド）から、別のユーザスレッドに切り替える（ステップ９０３）。【００７１】
図１０は、Ｉ／Ｏ処理部（Ｂ）１３４のＩ／Ｏ完了処理のフローチャートである。なお、Ｉ／Ｏ完了処理は、Ｉ／Ｏ完了処理専用のユーザスレッド（以下、専用ユーザスレッド）が実行しても良いし、ＤＢオペレーションを行うユーザスレッドが実行しても良い。前者の場合、Ｉ／Ｏ完了処理が繰り返し実行されても良いし、ＣＰＵ（ＣＰＵコア）を使用する順番が専用ユーザスレッドに回ってきた時に実行されても良い。後者の場合、ステップ９０２が行われた場合に、Ｉ／Ｏ処理部（Ｂ）１３４に要求を出したユーザスレッドによりＩ／Ｏ完了処理が実行されも良い。また、Ｉ／Ｏ完了後の処理方式の違いに応じて、Ｉ／Ｏ処理部（Ａ）１３２とＩ／Ｏ処理部（Ｂ）１３４が更に異なってもよい。【００７２】
Ｉ／Ｏ処理部（Ｂ）１３４は、ＯＳ１４０にＩ／Ｏ完了割込みがあるか否かを判定する（ステップ１００１）。ステップ１００１の判定結果が否定の場合（ステップ１００１：Ｎｏ）は、Ｉ／Ｏ完了処理が終了する。【００７３】
ステップ１００１の判定結果が肯定の場合（ステップ１００１：Ｙｅｓ）、Ｉ／Ｏ処理部（Ｂ）１３４が、ＯＳ１４０に返って来ている全てのＩ／Ｏ応答をＯＳ１４０に要求する（ステップ１００２）。すなわち、ＯＳ１４０からＩ／Ｏ応答の一括刈取りが行われる。【００７４】
Ｉ／Ｏ処理部（Ｂ）１３４は、Ｉ／Ｏ応答があるか否か判定し（ステップ１００３）、Ｉ／Ｏ応答が無い場合（ステップ１００３：Ｎｏ）は、Ｉ／Ｏ完了処理を終了する。【００７５】
Ｉ／Ｏ応答がある場合（ステップ１００３：Ｙｅｓ）、Ｉ／Ｏ処理部（Ｂ）１３４は、実行対象のユーザスレッドを、そのＩ／Ｏ応答に対応するＩ／Ｏ要求を発行したユーザスレッドに切り替える（ステップ１００４）。Ｉ／Ｏ処理部（Ｂ）１３４（あるいは、ステップ１００４による切替え後のユーザスレッド）は、Ｉ／Ｏ完了時刻（ステップ１００２の一括刈取りによりＩ／Ｏ応答を受けた時刻）を取得し、Ｉ／Ｏ応答時間（図９のステップ９０１で保持していたＩ／Ｏ開始時刻から、取得されたＩ／Ｏ完了時刻までの時間）を算出する（ステップ１００５）。そして、Ｉ／Ｏ処理部（Ｂ）１３４（あるいは、ステップ１００４による切替え後のユーザスレッド）は、記憶デバイス性能情報１２６を更新、すなわち、Ｉ／Ｏ先記憶デバイスに対応するＩ／Ｏ数をカウントアップし、且つ、Ｉ／Ｏ先記憶デバイスに対応する平均Ｉ／Ｏ応答時間を更新する（ステップ１００６）。【００７６】
ステップ１００６の後、Ｉ／Ｏ処理部（Ｂ）１３４（あるいは、ステップ１００４による切替え後のユーザスレッド）は、実行対象のユーザスレッドを、Ｉ／Ｏ完了処理を実行していた元のユーザスレッドに切り替え（ステップ１００７）、Ｉ／Ｏ処理部（Ｂ）１３４（あるいは、切替え後のユーザスレッド）は、ステップ１００３を実行する。【００７７】
以上、本実施例によれば、ＤＢＭＳ１２０が、Ｉ／Ｏ先記憶デバイスの平均Ｉ／Ｏ応答時間を基に、Ｉ／Ｏ要求を同期Ｉ／Ｏ方式と非同期Ｉ／Ｏ方式のいずれで発行するかを選択する。これにより、ＣＰＵ１０４の使用効率を高めＤＢＭＳ１２０の性能を向上することができる。
【実施例２】
【００７８】
実施例２を説明する。その際、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略または簡略する。【００７９】
実施例２では、Ｉ／Ｏ先記憶デバイスの平均Ｉ／Ｏ応答時間がＩ／Ｏ方式選択閾値未満か否かの判定の後、その判定の結果に応じたＩ／Ｏ方式を選択してよいか否かの補助判定を行う。【００８０】
図１２は、実施例２にかかるタスク実行のフローチャートの一部分を示す。【００８１】
クエリ実行部１２２は、Ｉ／Ｏ先記憶デバイスの平均Ｉ／Ｏ応答時間がＩ／Ｏ方式選択閾値未満の場合（ステップ７０６：Ｙｅｓ）、同期Ｉ／Ｏ方式を選択してよいか否かの第１の補助判定を行い（ステップ１２０１）、Ｉ／Ｏ先記憶デバイスの平均Ｉ／Ｏ応答時間がＩ／Ｏ方式選択閾値以上の場合（ステップ７０６：Ｎｏ）、非同期Ｉ／Ｏ方式を選択してよいか否かの第２の補助判定を行う（ステップ１２０２）。【００８２】
第１の補助判定は、例えば、下記（１−１）〜（１−２）のうちの少なくとも１つである。【００８３】
（１−１）Ｉ／Ｏ対象データの種別が、同期Ｉ／Ｏ方式向けか否かが判定される。具体的には、クエリ実行部１２２は、クエリ実行プラン情報１３０およびＤＢスキーマ管理情報２０４を基に、読み出すＤＢデータのスキーマ種別を特定し、そのスキーマ種別が表か索引かを判定する。読み出すＤＢデータのスキーマ種別が索引の場合、クエリ実行部１２２は、同期Ｉ／Ｏ方式を選択すると決定し（ステップ１２０１：Ｙｅｓ）、読み出すＤＢデータのスキーマ種別が表の場合、非同期Ｉ／Ｏ方式を選択すると決定する（ステップ１２０１：Ｎｏ）。タスクを動的に生成し並行実行するＤＢＭＳ１２０において、ＤＢＭＳ１２０の性能の向上を図るためには、タスク生成の基となる索引のデータは可能な限り早く読み出すことが好ましい。一方、表のデータの読み出しが遅くてもＤＢＭＳ１２０の性能に与える影響は小さい。そこで、この補助判定によれば、読み出すＤＢデータのスキーマ種別が索引であれば、同期Ｉ／Ｏ方式を選択することが決定され、読み出すＤＢデータのスキーマ種別が表であれば、非同期Ｉ／Ｏ方式を選択することが決定される。【００８４】
（１−２）記憶デバイス毎のデバイスドライバの処理方式を表す情報を基に、Ｉ／Ｏ先記憶デバイスのデバイスドライバの処理方式（例えば、Ｉ／Ｆの種類）が、同期Ｉ／Ｏ方式向けか否かが判定される。その情報は、管理者により外部から入力されてもよいし、ストレージ装置１５０から取得されてもよい。【００８５】
第２の補助判定は、例えば、下記（２−１）〜（２−３）のうちの少なくとも１つである。【００８６】
（２−１）クエリ実行部１２２は、システム情報１２８を参照し、全ＣＰＵコア上で並列実行可能なタスク数（ＣＰＵコア数４００とＣＰＵコア並行実行数４０２の積）が、その時点で実効可能な全タスク数以上か否かを判定する。なお、クエリ実行部１２２は、実行可能なタスクはリアルスレッドを優先に割り振るものとする。例えばリアルスレッド数が１２８、１リアルスレッド当りのユーザスレッドが５１２の場合において、実行可能なタスク数が２５６の場合では、１つのリアルスレッドで２５６ユーザスレッドにタスクを割り当てるのではなく、１２８のリアルスレッドでそれぞれ２つのユーザスレッドにタスクを割り当てる。この判定の結果が肯定の場合、１つのリアルスレッド内で動作可能なユーザスレッドは１以下となるため、ＤＢＭＳ１２０がＣＰＵ１０４のコストをかけて（使用率を上げてまで）切り替える必要はなく、同期Ｉ／Ｏ方式（すなわち、ユーザスレッドの切り替えを行わないＩ／Ｏ方式）を選択する。この場合、Ｉ／Ｏ待ちによってアイドル状態となったリアルスレッドは、ハードウェア（ＣＰＵコア）側で別のリアルスレッドに切り替えられるため、物理的なＣＰＵとしては動作することになる。一方、先の判定が否定の場合は、少なくとも１つのリアルスレッドにおいて、リアルスレッド当りの動作可能なユーザスレッドが２以上となるものがあるため非同期Ｉ／Ｏ方式を選択する。【００８７】
（２−２）記憶デバイス毎のデバイスドライバの処理方式を表す情報を基に、Ｉ／Ｏ先記憶デバイスのデバイスドライバの処理方式が非同期Ｉ／Ｏ方式向けか否かが判定される。【００８８】
（２−３）Ｉ／Ｏ要求の多重度の上限と、非同期Ｉ／Ｏ方式が選択されたユーザスレッドの数と、オーバヘッドとのうちの少なくとも１つを基に、非同期Ｉ／Ｏ方式が選択されるユーザスレッドが増えることが許されるか否かが判定される。ＤＢＭＳ１２０について要求されている性能、Ｉ／Ｏ要求の多重度の上限、および、オーバヘッドの時間、のうちの少なくとも１つは、管理者により外部から入力されてもよいし、ストレージ装置１５０から取得されてもよい。この判定の結果が肯定の場合に、非同期Ｉ／Ｏ方式を選択することが決定され、この判定の結果が否定の場合に、同期Ｉ／Ｏ方式を選択することが決定される。【００８９】
なお、実施例２では、記憶デバイス毎のＩ／Ｏ応答速度は、固定値であり、管理者から入力されてもよいし、ストレージ装置１５０から取得されてもよい。また、記憶デバイスのＩ／Ｏ応答速度は、その記憶デバイスのＩ／Ｏ性能とその記憶デバイスへの経路への経路の帯域とを基に決定されてよい。記憶デバイスのＩ／Ｏ性能及び帯域のうちの少なくとも１つは、管理者により入力されてもよいし、その記憶デバイスを有するストレージ装置１５０から取得されてもよい。記憶デバイスのＩ／Ｏ応答速度、または、記憶デバイスのＩ／Ｏ性能および帯域のうちの少なくとも１つ、を固定値とすることで、記憶デバイス毎にＩ／Ｏ応答速度（例えば平均Ｉ／Ｏ応答時間）を測定することに比べて、ＣＰＵ１０４のコスト（使用率）を低減することができる。なお、このケースにおいて、例えば、ＤＢＭＳ１２０は、Ｉ／Ｏ応答速度（固定値）が所定速度を超えていても（図１２のステップ７０６：Ｙｅｓ）、Ｉ／Ｏ先記憶デバイスがビジーであれば、非同期Ｉ／Ｏ方式を選択することを決定してよい（ステップ１２０１：Ｎｏ）。「Ｉ／Ｏ先記憶デバイスがビジー」とは、例えば、Ｉ／Ｏ先記憶デバイスへの経路の帯域が所定帯域未満である、Ｉ／Ｏ先記憶デバイスに対するＩ／Ｏ要求のＩ／Ｏ応答としてビジーを意味する応答が返って来た、または、Ｉ／Ｏ応答が所定回数以上タイムアウトした、でよい。また、経路帯域は、ＤＢＭＳ１２０により繰り返し測定される値でもよいし、ストレージ装置１５０で測定されストレージ装置１５０から取得された値でもよい。
【実施例３】
【００９０】
実施例３を説明する。その際、実施例１および２との相違点を主に説明し、実施例１および２との共通点については説明を省略または簡略する。【００９１】
図１３は、実施例３にかかる計算機システムの構成例を示した図である。【００９２】
Ｉ／Ｏ応答速度が異なる複数の記憶デバイス（Ｙ）１５６および記憶デバイス（Ｚ）１５８を有する複数のストレージ装置１５０Ａおよび１５０Ｂがある。計算機１００が、複数のストレージ装置１５０Ａおよび１５０Ｂに接続される。【００９３】
実施例３でも、Ｉ／Ｏ先が記憶デバイス（Ｙ）１５６であれば、同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ａ））１３２が選択され、Ｉ／Ｏ先が記憶デバイス（Ｚ）１５８であれば、非同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ｂ））１３４が選択される。
【実施例４】
【００９４】
実施例４を説明する。その際、実施例１〜３との相違点を主に説明し、実施例１〜３との共通点については説明を省略または簡略する。【００９５】
図１４は、実施例４にかかる計算機システムの構成例を示した図である。【００９６】
Ｉ／Ｏ応答速度が異なる複数の記憶デバイス（Ｘ）１０８および記憶デバイス（Ｗ）１４０８が、計算機１００内に存在する。記憶デバイス（Ｗ）１４０８は、例えばＨＤＤである。Ｉ／Ｏ先が記憶デバイス（Ｘ）１０８であれば、同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ａ））１３２が選択され、Ｉ／Ｏ先が記憶デバイス（Ｗ）１４０８であれば、非同期Ｉ／Ｏ方式（Ｉ／Ｏ処理部（Ｂ））１３４が選択される。【００９７】
実施例４では、インメモリデータベースが採用されてよい。
【実施例５】
【００９８】
実施例５を説明する。その際、実施例１〜４との相違点を主に説明し、実施例１〜４との共通点については説明を省略または簡略する。【００９９】
図１５は、実施例５にかかる計算機システムの構成例を示した図である。【０１００】
アプリケーションサーバ１１０２は、データベースサーバ（計算機）１００に、通信ネットワーク１１０９を介して通信可能に接続されている。また、データベースサーバ（以下、ＤＢサーバ）１００は、ストレージ装置１５０に、通信ネットワーク１８２（および１８０）を介して通信可能に接続されている。ユーザ端末（クライアント端末）１１０１は、アプリケーションサーバ１１０２に、通信ネットワーク１１０８を介して通信可能に接続されている。ＤＢサーバ１００は、ＤＢ１２２を管理するＤＢＭＳ１０４を実行する。ストレージ装置１５０は、ＤＢ１２２を格納する。アプリケーションサーバ１１０２は、ＤＢＭＳ１０４に対してクエリを発行するアプリケーションプログラムを実行する。ユーザ端末１１０１は、アプリケーションサーバ１１０２で実行されるアプリケーションプログラムに要求を出す。なお、ユーザ端末１１０１、または、アプリケーションサーバ１１０２は、複数存在しても良い。【０１０１】
アプリケーションサーバ管理端末１１０５は、通信ネットワーク１１１１を介してアプリケーションサーバ１１０２に通信可能に接続されている。ＤＢサーバ管理端末１１０６は、通信ネットワーク１１１２を介してＤＢサーバ１００に通信可能に接続されている。ストレージ管理端末１１０７は、通信ネットワーク１１１３を介してストレージ装置１５０に通信可能に接続されている。アプリケーションサーバ管理端末１１０５は、アプリケーションサーバ１１０２を管理する端末である。ＤＢサーバ管理端末１１０６は、ＤＢサーバ１００を管理する端末である。ストレージ管理端末１１０７は、ストレージ装置１５０を管理する端末である。なお、管理端末１１０５〜１１０７のうちの少なくとも２つが共通（一体）であっても良い。また、通信ネットワーク１８２および１１０８〜１１１３のうちの少なくとも２つが共通（一体）であっても良い。【０１０２】
実施例５では、例えば、下記の通り処理が実行される。
（Ｓ１１１４）ユーザ端末１１０１は、アプリケーションサーバ１１０２に要求（以下、ユーザ要求）を発行する。
（Ｓ１１１５）アプリケーションサーバ１１０２は、Ｓ１１１４で受信したユーザ要求に従いクエリを生成する。そして、生成したクエリをＤＢサーバ１００に発行する。
（Ｓ１１１６）ＤＢサーバ１００は、アプリケーションサーバ１１０２からのクエリを受け付け、受け付けたクエリを実行する。ＤＢサーバ１００は、受け付けたクエリの実行において必要なＩ／Ｏ要求（例えばデータ読出し要求）をストレージ装置１５０に発行する。ＤＢサーバ１００は、１つのクエリの実行において、複数のＩ／Ｏ要求を並行して発行することがある。そのため、ＤＢサーバ１００は、１つのクエリの実行において、Ｓ１１１６の要求を複数回並行して行うことがある。
（Ｓ１１１９）ストレージ装置１５０は、Ｓ１１１６で発行されたＩ／Ｏ要求について、ＤＢサーバ１００に応答する。ストレージ装置１５０は、Ｓ１１１９の応答を複数回並行して行うことがある。
（Ｓ１１１８）ＤＢサーバ１００は、クエリの実行結果を生成し、アプリケーションサーバ１１０２に送信する。
（Ｓ１１１７）アプリケーションサーバ１１０２は、クエリの実行結果を受信する。そして、該実行結果に従う、Ｓ１１１４で受信したユーザ要求に対する回答を、ユーザ端末１１０１に送信する。【０１０３】
なお、アプリケーションサーバ１１０２に発行されるユーザ要求、または、ＤＢサーバへ発行されるクエリは、同時に複数あっても良い。【０１０４】
以上、幾つかの実施例を説明したが、本発明は、これらの実施例に限定されるものでなく、その要旨を逸脱しない範囲で種々変更可能である。【０１０５】
例えば、いずれの実施例でも、Ｉ／Ｏ処理部（Ａ）１３２およびＩ／Ｏ処理部（Ｂ）１３４は、それぞれ、１つのモジュールとして用意されるが、それに代えて、Ｉ／Ｏ処理部（Ａ）１３２およびＩ／Ｏ処理部（Ｂ）１３４が無く、タスク（本実施例ではユーザスレッド）が、同期Ｉ／Ｏ関数または非同期Ｉ／Ｏ関数をコールしてもよい。具体的には、図８に示したステップ８０１〜８０５のうちの少なくとも１つのステップが、少なくとも１つのユーザスレッドにより行われてよい。また、図９に示したステップ９０１〜９０３のうちの少なくとも１つのステップが、少なくとも１つのユーザスレッドにより行われてよい。また、図１０に示したステップ１００１〜１００７のうちの少なくとも１つのステップが、少なくとも１つのユーザスレッドにより行われてよい。【０１０６】
また、例えば、本発明は、ＤＢＭＳ以外のシステム、例えば、ファイルシステムにも適用できる。そのようなシステムを実行する計算機（またはその計算機を含んだ計算機システム）は、例えば、Ｉ／Ｏ応答速度が異なる複数の記憶デバイスに格納されているデータの処理要求を受け付ける処理要求受付部と、受け付けた処理要求を実行し、処理要求の実行において、複数のオペレーションを実行するための２以上のタスクのうちの少なくとも２つのタスクを並行実行する処理要求実行部とを有してよい。処理要求実行部は、タスクの実行においてＩ／Ｏ要求を発行する場合、複数の記憶デバイスのうちのＩ／Ｏ先の記憶デバイスのＩ／Ｏ応答速度を基に、同期Ｉ／Ｏ方式と非同期Ｉ／Ｏ方式のうちのいずれかを選択し、選択したＩ／Ｏ方式によりＩ／Ｏ要求を発行してよい。このように、ＤＢＭＳ以外のシステムでは、上記の説明において、ＤＢオペレーションをオペレーションと読み替え、クエリを処理要求と読み替えることができる。
【符号の説明】
【０１０７】
１００…計算機、１０８…記憶デバイス（Ｘ）、１２０…ＤＢＭＳ、１２２…クエリ実行部、１２４…データベース管理情報、１２６…記憶デバイス性能情報、１２８…システム情報、１３０…クエリ実行プラン情報、１３２…Ｉ／Ｏ処理部（Ａ）、１３４…Ｉ／Ｏ処理部（Ｂ）、１４０…ＯＳ、１４２…ＯＳ管理情報、１５０…ストレージ装置、１５４…コントローラ、１５６…記憶デバイス（Ｙ）、１５８…記憶デバイス（Ｚ）、１７２…制御プログラム、１７４…ストレージ管理情報、１８０、１８２…通信ネットワーク
【図１】
2015145762.tif 000003
【図２Ａ】
2015145762.tif 000004
【図２Ｂ】
2015145762.tif 000005
【図２Ｃ】
2015145762.tif 000006
【図３Ａ】
2015145762.tif 000007
【図３Ｂ】
2015145762.tif 000008
【図４Ａ】
2015145762.tif 000009
【図４Ｂ】
2015145762.tif 000010
【図５Ａ】
2015145762.tif 000011
【図５Ｂ】
2015145762.tif 000012
【図６】
2015145762.tif 000013
【図７】
2015145762.tif 000014
【図８】
2015145762.tif 000015
【図９】
2015145762.tif 000016
【図１０】
2015145762.tif 000017
【図１１】
2015145762.tif 000018
【図１２】
2015145762.tif 000019
【図１３】
2015145762.tif 000020
【図１４】
2015145762.tif 000021
【図１５】
2015145762.tif 000022
【国際調査報告】
2015145762.tif 000023
2015145762.tif 000024
2015145762.tif 000025
2015145762.tif 000026