IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 東芝メモリ株式会社の特許一覧

特開2024-131004クエリ処理の実行方式を最適化する方法及びデータベースシステム
<>
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図1
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図2
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図3
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図4
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図5
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図6
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図7
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図8
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図9
  • 特開-クエリ処理の実行方式を最適化する方法及びデータベースシステム 図10
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024131004
(43)【公開日】2024-09-30
(54)【発明の名称】クエリ処理の実行方式を最適化する方法及びデータベースシステム
(51)【国際特許分類】
   G06F 16/28 20190101AFI20240920BHJP
【FI】
G06F16/28
【審査請求】未請求
【請求項の数】20
【出願形態】OL
(21)【出願番号】P 2023041003
(22)【出願日】2023-03-15
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110000408
【氏名又は名称】弁理士法人高橋・林アンドパートナーズ
(72)【発明者】
【氏名】渡邉 大毅
(72)【発明者】
【氏名】石原 丈士
(72)【発明者】
【氏名】白川 健治
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175AA02
5B175KA12
(57)【要約】
【課題】データベースシステムにおけるクエリ処理の新たな最適化方法を提供すること。
【解決手段】タスクグラフを用いてデータベースに対するクエリ処理を実行する方法であって、前記クエリ処理は、複数のタスクを含み、前記タスクグラフは、前記複数のタスクに対応する複数のノードと、前記ノードに対する入力及び出力を示すエッジと、を含む有向グラフであり、前記方法は、前記ノードの入力データ又は出力データの圧縮状態を含むプロパティを識別し、前記複数のノードの各々の処理コストを計算し、前記複数のノードに含まれる第1ノードは、出力対象に第1圧縮状態で対象データを出力し、前記複数のノードに含まれる第2ノードは、前記出力対象に前記第1圧縮状態とは異なる第2圧縮状態で前記対象データを出力することを含み、同一の前記タスクグラフには、前記第1ノード及び前記第2ノードが含まれる。
【選択図】図7
【特許請求の範囲】
【請求項1】
タスクグラフを用いてデータベースに対するクエリ処理を実行する方法であって、
前記クエリ処理は、複数のタスクを含み、
前記タスクグラフは、
前記複数のタスクに対応する複数のノードと、
前記ノードに対する入力及び出力を示すエッジと、を含む有向グラフであり、
前記方法は、
前記ノードの入力データ又は出力データの圧縮状態を含むプロパティを識別し、
前記複数のノードの各々の処理コストを計算し、
前記複数のノードに含まれる第1ノードは、出力対象に第1圧縮状態で対象データを出力し、
前記複数のノードに含まれる第2ノードは、前記出力対象に前記第1圧縮状態とは異なる第2圧縮状態で前記対象データを出力する
ことを含み、
同一の前記タスクグラフには、前記第1ノード及び前記第2ノードが含まれる、方法。
【請求項2】
前記処理コストの計算は、前記入力データ又は前記出力データの圧縮状態に基づいて行われる、請求項1に記載の方法。
【請求項3】
前記処理コストの計算は、前記複数のノードの各々に対して、対応する前記タスクに応じた処理時間を計算することを含む、請求項2に記載の方法。
【請求項4】
前記第1圧縮状態及び前記第2圧縮状態は、非圧縮状態を含む、請求項1に記載の方法。
【請求項5】
前記第1圧縮状態及び前記第2圧縮状態は、異なる圧縮方法で圧縮された複数の圧縮状態から選択された1の同一又は異なる圧縮状態を含む、請求項4に記載の方法。
【請求項6】
前記データベースは、複数の情報処理端末によって構成され、
前記複数の情報処理端末の各々は、複数の記憶装置を含み、
前記プロパティは、前記情報処理端末に係る情報及び前記記憶装置に係る情報を含む、請求項1に記載の方法。
【請求項7】
前記プロパティは、列指向のデータ圧縮フォーマットによって表される、請求項1に記載の方法。
【請求項8】
前記プロパティは、バイト指向のデータ圧縮フォーマットによって表される、請求項1に記載の方法。
【請求項9】
前記第1圧縮状態が非圧縮状態ではない場合、前記第1ノードに対して入力される入力データに含まれる付加情報に基づいて、前記出力対象において圧縮されたデータの伸張要否を判断する、請求項1に記載の方法。
【請求項10】
前記付加情報は、圧縮された前記入力データに係る情報を含むメタデータを含み、
前記メタデータは、前記入力データの最大値又は最小値を含む、請求項9に記載の方法。
【請求項11】
前記付加情報は、圧縮された前記入力データに係る情報を含むメタデータを含み、
前記メタデータは、前記入力データの和を含む、請求項9に記載の方法。
【請求項12】
前記処理コストの合計が最も小さい経路を実行経路として決定する、ことをさらに含む請求項1に記載の方法。
【請求項13】
前記決定された実行経路に基づいて前記クエリ処理を実行する、ことをさらに含む請求項12に記載の方法。
【請求項14】
管理システムと、
ホストから受信したクエリに応じてデータベースに対するクエリ処理を実行するクエリ実行部と、を備えるデータベースシステムであって、
前記管理システムは、有向グラフを用いて前記クエリ実行部を制御し、
前記クエリ処理は、複数のタスクを含み、
前記有向グラフは、
前記複数のタスクに対応する複数のノードと、
前記ノードに対する入力及び出力を示すエッジと、を含み、
前記複数のノードは、第1ノード及び第2ノードを含み、
前記クエリ実行部は、
前記第1ノードにおいて、対象データを第1圧縮状態で出力対象に出力し、
前記第2ノードにおいて、前記対象データを前記第1圧縮状態とは異なる第2圧縮状態で前記出力対象に出力するように構成され、
前記管理システムは、
前記複数のノードの各々の処理コストを計算し、
前記処理コストに基づき、前記第1ノードを含む実行経路及び前記第2ノードを含む実行経路を含む複数の実行経路から1の実行経路を決定して実行計画を生成し、
前記実行計画に基づいて前記クエリ実行部を駆動するように構成されたデータベースシステム。
【請求項15】
前記処理コストの計算は、前記複数のノードに入力又は出力されるデータの圧縮状態に基づいて行われる、請求項14に記載のデータベースシステム。
【請求項16】
前記処理コストの計算は、前記複数のノードの各々に対して、対応する前記タスクに応じた処理時間を計算することを含む、請求項15に記載のデータベースシステム。
【請求項17】
前記第1圧縮状態及び前記第2圧縮状態は、非圧縮状態を含む、請求項14に記載のデータベースシステム。
【請求項18】
前記第1圧縮状態及び前記第2圧縮状態は、異なる圧縮方法で圧縮された複数の圧縮状態から選択された1の同一又は異なる圧縮状態を含む、請求項17に記載のデータベースシステム。
【請求項19】
前記データベースは、複数の情報処理端末によって構成され、
前記複数の情報処理端末の各々は、複数の記憶装置を含み、
前記管理システムは、前記ノードの入力データ又は出力データの圧縮状態を含むプロパティを有し、
前記プロパティは、前記情報処理端末に係る情報及び前記記憶装置に係る情報を含む、請求項14に記載のデータベースシステム。
【請求項20】
前記プロパティは、列指向のデータ圧縮フォーマット又はバイト指向のデータ圧縮フォーマットによって表される、請求項19に記載のデータベースシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示の一実施形態はデータベースに対するクエリ処理の実行方式を最適化する方法及びデータベースシステムに関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。ソリッドステートドライブ(SSD)を用いたメモリシステムは、データベースシステムにおける情報処理装置及びストレージとして使用されている。
【0003】
データベースシステムは、クエリ(処理要求)に応じて処理が実行される。例えば、リレーショナルデータベースではSQLクエリ処理が行われる。SQLクエリ処理では、データの圧縮処理及び伸張処理を実行する位置(タイミング)、並びに圧縮されたデータを格納する装置を柔軟に変更できることが好ましい。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】米国特許第10346551号明細書
【特許文献2】米国特許第10296524号明細書
【特許文献3】米国特許第11521101号明細書
【発明の概要】
【発明が解決しようとする課題】
【0005】
本開示は、データベースシステムにおけるクエリ処理の新たな最適化方法を提供することを目的とする。
【課題を解決するための手段】
【0006】
一実施形態に係る方法は、タスクグラフを用いてデータベースに対するクエリ処理を実行する方法であって、前記クエリ処理は、複数のタスクを含み、前記タスクグラフは、前記複数のタスクに対応する複数のノードと、前記ノードに対する入力及び出力を示すエッジと、を含む有向グラフであり、前記方法は、前記ノードの入力データ又は出力データの圧縮状態を含むプロパティを識別し、前記複数のノードの各々の処理コストを計算し、前記複数のノードに含まれる第1ノードは、出力対象に第1圧縮状態で対象データを出力し、前記複数のノードに含まれる第2ノードは、前記出力対象に前記第1圧縮状態とは異なる第2圧縮状態で前記対象データを出力することを含み、同一の前記タスクグラフには、前記第1ノード及び前記第2ノードが含まれる。
【0007】
一実施形態に係るデータベースシステムは、管理システムと、ホストから受信したクエリに応じて前記データベースに対するクエリ処理を実行するクエリ実行部と、を備えるデータベースシステムであって、前記管理システムは、有向グラフを用いて前記クエリ実行部を制御し、前記クエリ処理は、複数のタスクを含み、前記有向グラフは、前記複数のタスクに対応する複数のノードと、前記ノードに対する入力及び出力を示すエッジと、を含み、前記複数のノードは、第1ノード及び第2ノードを含み、前記クエリ実行部は、前記第1ノードにおいて、対象データを第1圧縮状態で出力対象に出力し、前記第2ノードにおいて、前記対象データを前記第1圧縮状態とは異なる第2圧縮状態で前記出力対象に出力するように構成され、前記管理システムは、前記複数のノードの各々の処理コストを計算し、前記処理コストに基づき、前記第1ノードを含む実行経路及び前記第2ノードを含む実行経路を含む複数の実行経路から1の実行経路を決定して実行計画を生成し、前記実行計画に基づいて前記クエリ実行部を駆動するように構成されている。
【図面の簡単な説明】
【0008】
図1】一実施形態に係るデータベースシステムの構成を示すブロック図である。
図2】一実施形態に係るタスクグラフを示す図である。
図3】一実施形態に係るタスクグラフを示す図である。
図4】一実施形態に係るタスクグラフを示す図である。
図5】一実施形態に係る処理コストの計算方法を説明する図である。
図6】一実施形態に係るタスクグラフを示す図である。
図7】一実施形態に係るタスクグラフを示す図である。
図8】一実施形態に係るデータベースシステムにおけるクエリ処理の実行方式を最適化するフローチャートである。
図9】一実施形態に係るタスクグラフを示す図である。
図10】一実施形態に係るタスクグラフを示す図である。
【発明を実施するための形態】
【0009】
以下、実施形態に係るデータベースシステムについて、図面を参照して具体的に説明する。以下の説明において、略同一の機能及び構成を有する構成要素に対して同一符号が付されており、重複する説明が省略される場合がある。以下に示す各実施形態は、この実施形態の技術的思想を具体化するための装置や方法を例示する。実施形態の技術思想は、構成要素の材質、形状、構造、配置等を下記のものに限定しない。実施形態の技術的思想は、特許請求の範囲に対して、種々の変更を加えたものであってもよい。
【0010】
以下の説明において、「タスクグラフ」とは、順序関係を有する複数のタスクが存在する場合に、各タスクの処理に必要なコストに関する情報を保持するとともに、当該複数のタスクの前後関係(先行後続関係)を矢印でつなぐことで、有向グラフとして表現する技術である。複数のタスクが順序関係を有するとは、例えば、タスクグラフにタスクA、B、Cが存在する場合、タスクA及びタスクBを完了してからでないとタスクCを実行することができないような関係を意味する。
【0011】
各タスクの処理内容を示す単位ブロックを「ノード」という。つまり、タスクグラフには、各々が複数のタスクの各々に対応する複数のノードが規定されている。換言すると、タスクとノードとは1対1の関係である。各ノードにおいて、タスクの処理に必要な時間や電力、サーバの使用料金などのコストを総称して「処理コスト」という。ノード間において、タスクの前後関係を示す矢印を「エッジ」という。つまり、エッジは各ノードに対する入力及び出力を示す。
【0012】
「データベース」とは、リレーショナルデータベース(RDB)やそれ以外のデータベース(NoSQL)を含む、構造化されたデータの集合のことを指す。「リレーショナルデータベース」とは、表形式の複数のデータを関連付けて使用できるように構成されたデータベースである。リレーショナルデータベースに対する操作命令はデータベース言語によって記述される。例えば、当該データベース言語として、構造化クエリ言語(SQL)が用いられる。このSQLによってデータベースが操作され、データベースに格納されたデータの追加、削除、検索(取り出し)が実行される。また「NoSQL」とはリレーショナルデータベース以外の様々なデータベース、たとえばキーに対する値のセットを保持するKey-Value型データベースなどであり、こうしたNoSQLは、例えばApache CassandraにおけるCQLなど、(しばしばSQLとよく似ているが異なる)固有の言語を用いて操作することができる。以下の説明において、データベースに対してユーザが行いたい操作群をSQLなどによって定義したものを単に「クエリ」といい、クエリに従って実行される処理を「クエリ処理」という。つまり、クエリ処理には複数のタスクが含まれている。
【0013】
「圧縮状態」とは、入力又は出力されるデータが圧縮されている状態か、圧縮されていない状態か示す情報を含む。さらに、データが圧縮された状態である場合、圧縮状態は、当該データがどのような手法で圧縮されているかを示す情報を含む。具体的には、圧縮状態は、データが辞書式圧縮によって圧縮されているか、バイト圧縮(例えば、「gzip」)によって圧縮されているかといった情報を示す。つまり、圧縮状態は、異なる圧縮方法で圧縮された複数の圧縮状態から選択された1の圧縮状態であってもよい。
【0014】
「フィジカルプロパティ」又は「プロパティ」とは、あるタスクに係る処理(タスク処理)が実行された場合に、その処理の結果がどこに格納されているか、どのような圧縮状態か、を示すものである。つまり、フィジカルプロパティは、タスクグラフに含まれるタスクによって得られる処理結果に対して付与されている。例えば、リレーショナルデータベースが複数の情報処理端末(例えば、複数のサーバ)によって構成され、複数のサーバの各々が複数の記憶装置(例えば、SSD(Solid State Drive)、DRAM(Dynamic Random Access Memory)、CPU(Central Processing Unit))を含む場合、フィジカルプロパティには、対応するタスク処理の結果が格納されるサーバ及び記憶装置を特定する情報が含まれる。本実施形態では、フィジカルプロパティには、上記の情報に加えて、タスク処理の結果として格納されたデータの圧縮状態を示す情報が含まれる。上記のように、「フィジカルプロパティ」は、データフォーマットの概念を含む形式で表現される。
【0015】
[1.第1実施形態]
第1実施形態に係るデータベースシステムについて説明する。第1実施形態に係るデータベースシステム10は、例えば、リレーショナルデータベースである。データベースシステム10は、ホスト20と通信を行い、ホスト20からクエリを含むコマンドを受信し、当該クエリに応じてリレーショナルデータベースの機能を実現する。
【0016】
[1-1.データベースシステムの全体構成]
図1は、一実施形態に係るデータベースシステムの構成を示すブロック図である。図1に示すように、データベースシステム10(DB Sys.)は、管理システム11(Manager Sys.)及びクエリ実行部12(Query Exe.)を含む。
【0017】
管理システム11は、ホストインタフェース310(Host I/F)、タスクグラフ生成部320(Graph)及び実行計画決定部330(OPR)を含む。管理システム11は、これらの機能部を協働させることによって、以下に説明するタスクグラフ(有向非巡回グラフ)を用いてクエリ実行部12を制御する。なお、ホストインタフェース310、タスクグラフ生成部320及び実行計画決定部330の各機能部は、ハードウェア、ソフトウェアのいずれか又は両者を組み合せたものにて実現されることが可能である。また、各機能部での処理内容が、ホストインタフェース310、タスクグラフ生成部320、実行計画決定部330、として明確に区別されていることは必須では無い。ある処理の一部の処理が、別の機能部によって実行されてもよいし、各機能部がさらに細かい要素に分割されてもよい。
【0018】
ホストインタフェース310は、ホスト20とホストインタフェース310との間のインタフェース規格に従った処理を実行する。ホストインタフェース310は、ホスト20から受信したコマンド等を、内部バスを通じてタスクグラフ生成部320及び実行計画決定部330に送信する。ホストインタフェース310は、例えばクエリに従って実行された操作の結果をホスト20に送信する。
【0019】
タスクグラフ生成部320は、ホスト20から受信したクエリに基づいて、タスクグラフを生成する。例えば、タスクグラフ生成部320は、当該クエリを解析し、クエリに含まれる複数のタスクを特定し、当該複数のタスクの順序関係に基づいてタスクグラフを生成及び変形する。タスクグラフの生成方法及び変形方法は後で詳細に説明する。
【0020】
実行計画決定部330は、タスクグラフ生成部320によって生成されたタスクグラフと、各タスクにおける処理コストと、に基づいて、タスクグラフ上においてクエリ処理が効率良く実行される実行経路を決定する。換言すると、実行計画決定部330は、複数の実行経路から1の実行経路を決定して、クエリ処理の実行計画を生成し、当該実行計画に基づいてクエリ実行部12を駆動する。上記の処理を、タスクグラフを用いたデータベースに対するクエリ処理の実行方式を最適化する処理ということができる。なお、処理コストの計算方法及びクエリ処理の実行方式を最適化する方法は後で詳細に説明する。
【0021】
上記の最適化とは、タスクグラフ上における複数の処理経路のうち、処理コストが最も小さい(例えば、処理コストの計算から導出される処理時間が最も短い)処理経路を選択することを意味してもよいが、必ずしも処理コストが最も小さい処理経路が選択されなくてもよい。例えば、処理コスト以外の事情を考慮して処理経路が選択されてもよい。具体的には、データベースシステム10、ホスト20又はクエリ処理を要求するユーザの都合に合わせて、処理コストが最も小さい処理経路以外の経路が選択されてもよい。
【0022】
クエリ実行部12は、第1サーバ100(Server 1)及び第2サーバ200(Server 2)を含む。クエリ実行部12は、第1サーバ100及び第2サーバ200を協働させることによって、ホスト20から受信したクエリに応じた操作(クエリ処理)を実現する。
【0023】
第1サーバ100は、データ保持用のストレージサーバである。第1サーバ100は、CPU110、DRAM120及びSSD130を有している。CPU110は、例えばSRAM(Static Random Access Memory)などのキャッシュメモリを備えている。以下の説明では、CPU110のSRAMにデータが格納されることを、データがCPU110に格納されると表現する。つまり、第1サーバ100は、データをCPU110、DRAM120及びSSD130に格納することができる。
【0024】
第2サーバ200は、演算処理用のサーバである。第2サーバ200は、CPU210及びDRAM220を有している。第2サーバ200は、演算処理能力が高いサーバなので、SSD等のストレージを備えていなくてよい。CPU110と同様に、CPU210も、例えばSRAMなどのキャッシュメモリを備えている。以下の説明では、CPU210のレジスタやSRAMにデータが格納されることを、データがCPU210に格納されると表現する。つまり、第2サーバ200は、データをCPU210及びDRAM220に格納することができる。CPU210はCPU110に比べて高速で演算処理を実行することができる。DRAM220の容量はDRAM120の容量より大きい。なお、第2サーバ200がSSDを備えていてもよい。
【0025】
[1-2.タスクグラフの変形]
図2図4を用いて、タスクグラフの生成及び変形について説明する。図2図4は、一実施形態に係るタスクグラフを示す図である。これらの図を用いて、ホスト20から受信したクエリに基づいて、タスクグラフ生成部320がタスクグラフを生成する過程を説明する。
【0026】
この例では、クエリ処理として、テーブルに記録されたデータに対してIDごとの和(SUM)を計算し、その計算結果に対して特定のIDついて絞り込みを行う処理が例示されている。例えば、この場合のクエリは、「SELECT ID, SUM(VALUE) FROM TABLE Group by ID HAVING ID < 100」である。
【0027】
図2は、タスクグラフの変形を実行する前のデフォルトの処理順を示す。データベースシステム10がホスト20から上記のクエリを受信した場合、まず、図2に示すタスクグラフが生成される。図2では、クエリに記述された処理が記述された順に所定の1つの装置(サーバ)で実行される。図2では、各処理が第1サーバ100上で実行される場合について説明する。
【0028】
図2に示すタスクグラフでは、まず第1サーバ100のSSD130に格納されたテーブルの読み出し動作が実行される(N201;Read Table)。読み出されたデータは、読み出し動作の結果として、第1サーバ100のDRAM120に格納される(N202;TABLE)。当該データは、DRAM120からCPU110に転送される。
【0029】
CPU110は、転送された当該データに対してIDごとにSUMの計算を実行する(N203;SUM Cal.)。計算された結果は、N203の計算結果として、CPU110に格納される(N204;SUM rslt)。そして、CPU110は、この計算結果に対して特定のID(例えば、SUMの計算結果が100未満のID)について絞り込み処理を実行する(N205;FILTER)ことで、最終結果が導出される(N206;RESULT)。この場合、最終結果は、CPU110に格納されている。
【0030】
図2において、N201~N206の各ブロックをノードという。複数のノードのうち、矩形状のブロックで示されたノードをANDノードといい、略楕円形状のブロックで示されたノードをORノードという。各ブロック間を繋ぐ矢印がエッジである。
【0031】
ANDノードは、データベースシステム10がクエリ処理を実行する際における各処理単位を表す。例えば、ANDノードは、データの和の計算処理(SUM)、データの結合処理(JOIN)、及びデータの絞り込み処理(FILTER)を含む。図2の場合、N201、N203、N205がANDノードである。図2では、簡易的に各ANDノードには1のデータが入力される構成を例示したが、各ANDノードにはデータとは別に処理条件に係る情報が入力される。
【0032】
ORノードは、論理的に等価な出力を行うANDノードをグループ化したものを表す。換言すると、ORノードは、論理的に等価な処理によって得られた結果を表す。ORノードの詳細は後述する。図2の場合、N202、N204、N206がORノードである。
【0033】
図3は、デフォルトのタスクグラフに対してLogicalな変形を実行した場合のタスクグラフを示す。Logicalな変形とは、タスク処理の実行順序の入れ替えなどに関する変形ルールを適用したタスクグラフの変形を意味する。この場合、論理的に等価な最終結果が得られるように、各ANDノードの処理順が変更された複数の経路が導出される。
【0034】
図3に示すように、テーブルの読み出し動作の順序を変更することはできないので、図2のN201及びN202と同様に、テーブルの読み出し動作(N301;Read Table)及び読み出されたデータの格納(N302;TABLE)が実行される。一方、SUMの計算と絞り込み処理との順序を入れ替えることは可能なので、N302からの出力が分岐する。
【0035】
N303~N306は、図2のN203~N206と同じなので説明を省略する。図3では、N303~N305の経路と並列にN313~N315の経路が設けられている。いずれに経路であっても、N302でDRAM120に格納されたデータは、DRAM120からCPU110に転送される。
【0036】
N313~N315の経路において、まずCPU110は当該データに対して特定のIDについて絞り込み処理を実行する(N313;FILTER)。絞り込まれたデータは、絞り込み処理の結果として、CPU110に格納される(N314;FILTER rslt)。そして、CPU110は、この絞り込み処理の結果に対して、IDごとにSUMの計算を実行する(N315;SUM Cal.)。上記の処理によって、最終結果が導出される(N306)。
【0037】
N303~N305の経路であっても、N313~N315の経路であっても、SUMの計算及び絞り込み処理の両方のタスク処理が実行されるため、N306(ORノード)は論理的に等価な処理によって得られた結果である。これらの経路は論理的には等価であるが、タスクの処理順によってCPUの処理速度及び処理量が異なる場合がある。したがって、これらの経路について処理コストの計算を行い、処理コストが小さい経路を選択することで、クエリ処理の実行方式を最適化することができる。
【0038】
図4は、Logicalな変形が適用されたタスクグラフに対してPhysicalな変形を実行した場合のタスクグラフを示す。Physicalな変形とは、タスク処理をどの情報処理装置で実行するか、タスク処理の結果として得られるデータをどの記憶装置に格納するか等に関する変形ルールを適用したタスクグラフの変形を意味する。Physicalな変形において、タスク処理を実行する情報処理装置、及びタスク処理の結果を格納する記憶装置等の情報を表す「フィジカルプロパティ」がノードに付与されており、当該フィジカルプロパティに応じてタスクグラフがさらに展開する。この場合も、論理的に等価な最終結果が得られるように、各ANDノードの処理順が変更された複数の経路が導出される。図3に示すタスクグラフにおける両方の経路についてPhysicalな変形を実行した場合の経路は多岐に亘る。したがって、図4では、図3に示すタスクグラフのうちN313~N315の経路、かつ、最終結果が第2サーバ200に格納される場合について例示した。
【0039】
上記のように、「フィジカルプロパティ」は、ANDノードの出力データが物理的にどのように格納されているかを定義する、当該データの属性を示す情報である。図4の場合、各タスク処理が第1サーバ100又は第2サーバ200で実行されるケースを考慮した複数の経路が導出される。
【0040】
図4では、フィジカルプロパティが、データが格納されているサーバ及び記憶装置のみを含む構成を例示したが、後述するように、本実施形態に係る変形が全て反映されたタスクグラフにおけるフィジカルプロパティは、上記の項目に加えてデータの圧縮状態に係る情報を含む。
【0041】
図4に示すように、テーブルの読み出し動作の順序を変更することはできないので、図2のN201及びN202及び図3のN301及びN302と同様に、テーブルの読み出し動作の実行(N401;Read Table)及び読み出されたデータの格納(N402;TABLE)が実行される。図4では、対象のノードの上に、括弧で表記されたフィジカルプロパティが付与されている。図4に示すように、例えばN402において、データは第1サーバ100のDRAM120に格納されている。
【0042】
DRAM120に格納されたデータは、第1サーバ100で処理される場合と第2サーバ200で処理される場合とがあるので、N402からの出力が分岐する。
【0043】
まず、タスクが第2サーバ200で処理される場合について説明する。DRAM120に格納されたデータは、第2サーバ200に転送される(N403;Trans. Sv2)。転送されたデータは、転送処理の結果として第2サーバ200のDRAM220に格納される(N404;TABLE)。当該データは、DRAM220からCPU210に転送される。
【0044】
図4のN405~N408の経路は、図3に示すN303~N306の経路と同じなので、説明を省略する。同様に、図4のN415~N417の経路は、図3に示すN313~N315の経路と同じなので、説明を省略する。なお、N406におけるSUMの計算結果及びN416における絞り込み処理の結果は、いずれも第2サーバ200のCPU210に格納される。
【0045】
次に、タスクが第1サーバ100で処理される場合について説明する。この場合、DRAM120に格納されたデータは、CPU110に転送される。CPU110は当該データに対して特定のIDについて絞り込み処理を実行する(N423;FILTER)。絞り込まれたデータは、絞り込み処理の結果として、CPU110に格納される(N424;FILTER rslt)。
【0046】
CPU110に格納された上記データは、第2サーバ200に転送される(N425;Trans. Sv2)。転送されたデータは、転送処理の結果として第2サーバ200のCPU210に格納される(N416)。このデータ転送において、図4では第1サーバ100のCPU110から第2サーバ200のCPU210に直接データが転送されるように記述されているが、第1サーバ100のDRAM120及び第2サーバ200のDRAM220を介してCPU110からCPU210にデータが転送されてもよい。又は、上記のデータの転送先がDRAM220であってもよい。
【0047】
N402から分岐した出力がN403、N404、N415、N416を経由する経路であっても、当該出力がN423、N424、N425、N416を経由する経路であっても、SUMの計算の前に絞り込み処理のタスクが実行されているため、N416(ORノード)は論理的に等価な処理によって得られた結果である。
【0048】
上記の経路は論理的には等価であるが、タスクの処理順及びタスク処理が実行されるサーバによってCPUの処理速度及び処理量が異なる場合がある。したがって、これらの経路について処理コストの計算を行い、処理コストが小さい経路を選択することで、クエリ処理の実行方式を最適化することができる。
【0049】
[1-3.処理コストの計算]
図5を用いて処理コストの計算方法の一例について説明する。図5に示すタスクグラフに記載されたノードは、図4に示すタスクグラフに記載されたノードと同じである。図5に示す処理コストの計算は、複数のノードの各々に対して、対応するタスク処理に応じた処理時間を計算することによって行われる。具体的には、図5では、読み出し対象であるテーブルに含まれる行のうち、タスク処理が実行される行数に対して、一行あたりの処理時間を乗じる方法で処理コストが計算される例を示す。図5において、各ANDノードの上に付与された「#・・・」の文字は、各ANDノードに対応するタスク処理が実行されるサーバ及び当該タスク処理にかかる時間を示す。各ORノードの上に付与された、四角の枠で囲まれた文字は、タスク処理が実行された結果として得られるデータの行数を示す。
【0050】
以下の説明において、第1サーバ100において、一行のデータを読み出すために必要な時間は1μsecであり、一行のデータに対して絞り込みを実行するために必要な時間は3μsecであり、一行のデータに対してSUM計算を実行するために必要な時間は6μsecであるとして説明する。一方、第2サーバ200において、一行のデータに対して絞り込みを実行するために必要な時間は1μsecであり、一行のデータに対してSUM計算を実行するために必要な時間は2μsecであるとして説明する。第1サーバ100から第2サーバ200に1行のデータを転送するために必要な時間は10μsecであるとして説明する。
【0051】
第1サーバ100のSSD130に格納されたテーブルに100万行のデータが含まれている場合、N401におけるテーブルの読み出し動作に対する処理コストとして、100万行に対して1μsecを乗じることによって1secの処理コストが計算される。つまり、N401において、「第1サーバ100における1sec」の処理コストが算出される(#SV1_1sec)。上記の読み出し動作の結果、N402において、テーブルには100万行のデータが含まれている(1M Rows)。
【0052】
上記の同様の計算方法によって各ノードについて処理コストを計算した結果が図5に示されている。N403において、「第1サーバ100における10sec」の処理コストが算出される(#SV1_10sec)。N405において、「第2サーバ200における2sec」の処理コストが算出される(#SV2_2sec)。N407において、「第2サーバ200における0.001sec」の処理コストが算出される(#SV2_0.001sec)。N415において、「第2サーバ200における1sec」の処理コストが算出される(#SV2_1sec)。N417において、「第2サーバ200における0.2sec」の処理コストが算出される(#SV2_0.2sec)。N423において、「第1サーバ100における3sec」の処理コストが算出される(#SV1_3sec)。N425において、「第1サーバ100における1sec」の処理コストが算出される(#SV1_1sec)。なお、絞り込み処理(N415及びN423)が実行されることで、テーブルに含まれる行数は100万行から10万行に減少する。SUMの計算処理が実行されることで、テーブルに含まれる行数は100万行から1000行に減少する。
【0053】
図5において、左の経路(N405~N407を経由する経路)における処理コストの合計は13.0001secである。真ん中の経路(N415~N417を経由する経路)における処理コストの合計は12.2secである。右の経路(N423~N425、N416、N417を経由する経路)における処理コストの合計は5.2secである。上記のように、各経路に対する処理コストを計算することができる。図5の例では、処理コストの合計が最も小さい右の経路を最適なクエリ処理の実行方式として決定することができる。
【0054】
図5に示すタスクグラフでは、データの圧縮状態は考慮されていないが、後述するように、タスクグラフがデータの圧縮状態に応じた経路を含む場合は、圧縮状態に基づいて各ノードにおける処理コストが計算される。
【0055】
図5では、単純にタスク処理が実行される行数に対して、一行あたりの処理時間を乗じる方法で処理コストが計算される例を示したが、処理コストの計算方法はこの方法に限定されない。例えば、上記の条件に代えて、又は上記の条件に加えて、メモリの使用量の制約を考慮して処理コストを計算してもよい。また、上記のように処理時間だけでなく、処理に係る装置の消費電力やサーバの使用料金などを同時に考慮して処理コストを計算してもよい。
【0056】
[1-4.圧縮状態を考慮したタスクグラフの変形]
図6及び図7を用いて、圧縮状態を考慮したタスクグラフの変形について説明する。図6に示すタスクグラフは、当該変形の前のタスクグラフであり、図4に記載された経路のうち、N415~N417を経由する経路及びN423~N425を経由する経路のみを含む。図7に示すタスクグラフは、上記の変形を適用した後のタスクグラフである。
【0057】
図6のN601~N604は、それぞれ図4のN401~N404に対応する。図6のN605~N607は、それぞれ図4のN415~N417に対応する。図6のN608は、図4のN408に対応する。図6のN613~N615は、それぞれ図4のN423~N425に対応する。上記のように、図6の各ノードは図4の各ノードと同じである。一方、図6において各ORノードに付与されたフィジカルプロパティは、データが格納されているサーバ及び記憶装置に加えて、当該データの圧縮状態に係る情報を含む点において、図4に示すフィジカルプロパティと異なる。図6において、フィジカルプロパティの末尾に記載された「NC」は、データが非圧縮であることを意味する。
【0058】
図7は、図6のタスクグラフに対して圧縮状態を考慮した変形を実行した場合のタスクグラフを示す。圧縮状態を考慮した変形とは、データの読み出し動作又は書き込み動作を実行する際に、当該データの圧縮及び伸張を実行する変形と、データの転送を実行する際に、当該データの圧縮及び伸張を実行する変形とを含む。図7は、後者の変形が適用された例を示す。具体的には、圧縮状態を考慮した変形は、フィジカルプロパティにデータの圧縮状態に係る情報を追加することで、第1サーバ100から第2サーバ200にデータを転送する際に、非圧縮であるデータを転送してもよく、圧縮されたデータを転送してもよい、という変形ルールを適用した変形を意味する。
【0059】
図7のN701~N708は、それぞれ図6のN601~N608に対応する。図7のN713~N715は、それぞれ図6のN613~N615に対応する。N703及びN715における「Trans. SV2[NCPS]」は、第1サーバ100から第2サーバ200に非圧縮であるデータを転送することを意味する。
【0060】
図7では、上記のように圧縮状態を考慮した変形がなされた結果、第1サーバ100から第2サーバ200にデータを転送する処理(N702及びN714)からの出力が分岐している。図7に示すように、N723及びN724を経由する経路では、DRAM120に格納されたデータは、圧縮されて第2サーバ200に転送される(N723;Trans. SV2[CPS])。転送されたデータは、転送処理の結果として第2サーバ200のDRAM220に圧縮された状態で格納される(N724;TABLE)。圧縮されたデータを圧縮データといい、圧縮されていないデータ(又は、非圧縮であるデータ)を非圧縮データという場合がある。
【0061】
上記の場合、N703及びN704における処理コスト、及びN723及びN724における処理コストの計算は、これらのノードに対する入力データ又は出力データの圧縮状態に基づいて行われる。具体的には、第1サーバ100のDRAM120から第2サーバ200のDRAM220にデータを転送する場合、DRAM120からの出力データ又はDRAM220への入力データが非圧縮であるか、又は圧縮されているかに基づいて、処理コストの計算が行われる。
【0062】
N724でDRAM220に格納された圧縮データは、CPU210に転送され、CPU210において絞り込み処理が実行される(N705;FILTER)。N705の絞り込み処理を実行するために、上記の圧縮データは非圧縮データに伸張される。したがって、処理コストの計算を行う際に、N724からN705に延びるエッジは圧縮データの伸張に係る処理コストを含む。当該圧縮データの伸張は、CPU210及びDRAM220が協働することで実行される。
【0063】
N703を「第1ノード」といい、N723を「第2ノード」という場合がある。第1ノード及び第2ノードは、ともに論理的には同一のデータ、すなわちTABLEから読み出したデータと同じものを出力する。このデータを「対象データ」という場合がある。第1ノードの出力及び第2ノードの出力は、ともに第2サーバ200のDRAM220に送られる。この場合、これらの出力の対象であるDRAM220を「出力対象」という場合がある。
【0064】
第1ノードから出力されるデータは非圧縮データであり、第2ノードから出力されるデータは圧縮データである。つまり、第1ノード及び第2ノードから出力されるデータは異なる圧縮状態である。第1ノードから出力されるデータの圧縮状態を「第1圧縮状態」といい、第2ノードから出力されるデータの圧縮状態を「第2圧縮状態」という場合がある。
【0065】
上記の場合、第1ノード(N703)は、出力対象(DRAM220)に第1圧縮状態(非圧縮である状態)で対象データを出力する、ということができる。同様に、第2ノード(N723)は、当該出力対象(DRAM220)に第2圧縮状態(圧縮された状態)で当該対象データを出力する、ということができる。なお、図7に示すように、タスクグラフは、上記の第1ノード及び第2ノードを同時に含んでいる。第1圧縮状態が圧縮された状態に対応し、第2圧縮状態が非圧縮である状態に対応してもよい。第1圧縮状態及び第2圧縮状態がともにデータが圧縮された状態を示す場合、第1圧縮状態及び第2圧縮状態は、同一の圧縮方法で圧縮された状態であってもよく、異なる圧縮方法で圧縮された状態であってもよい。上記の「タスクグラフが第1ノード及び第2ノードを同時に含む」とは、複数の変形ルールに従って変形するタスクグラフにおいて、ある変形ルールに従って変形されたタスクグラフであって、変形が終了した後の最終的なタスクグラフ(後述する図8のS805において「Yes」に進んだ場合のタスクグラフ)において、第1ノード及び第2ノードが含まれることを意味する。
【0066】
N714からの出力が分岐する点について、図7に示すように、N735及びN736を経由する経路では、CPU110に格納されたデータ(絞り込み処理の結果)は、圧縮されて第2サーバ200に転送される(N735;Trans. SV2[CPS])。転送された当該データは、転送処理の結果として第2サーバ200のDRAM220に圧縮された状態で格納される(N736;FILTER rslt)。
【0067】
N736でDRAM220に格納された圧縮データは、CPU210に転送され、CPU210においてSUMの計算が実行される(N707;SUM Cal.)。N707の計算を実行するために、上記の圧縮データは非圧縮データに伸張される。したがって、処理コストの計算を行う際に、N736からN707に延びるエッジは圧縮データの伸張に係る処理コストを含む。
【0068】
上記の例では、サーバ間でデータを転送する場合に、圧縮データを転送する経路と非圧縮データを転送する経路とを生成する構成を例示したが、データを記憶装置に格納する際に圧縮データを格納する経路と非圧縮データを格納する経路とを生成してもよい。
【0069】
上記のように、本実施形態に係るタスクグラフによると、サーバ間でデータを転送する場合に、圧縮データを転送する経路と非圧縮データを転送する経路とについて処理コストを計算することができる。
【0070】
[1-5.クエリ処理の実行方式の最適化]
図8を用いてデータベースシステム10の動作について説明する。当該動作は、ホスト20がデータベースシステム10に対してコマンドを発行することで開始される。データベースシステム10は、ホスト20から受信したコマンドに含まれるクエリを解析することで、クエリ処理の実行方式の最適化を開始する。
【0071】
まず、データベースシステム10は、クエリによって規定された内容に従って、初期のタスクグラフを生成する(S801;Generating Graph)。本実施形態の場合、「SELECT ID, SUM(VALUE) FROM TABLE HAVING ID < 100」というクエリに従って、図2に示すようなタスクグラフを生成する。
【0072】
続いて、データベースシステム10は、タスク処理の実行順序の入れ替えに関する変形ルール(Logicalな変形)を適用してタスクグラフを変形する(S802;Logical Change)。Logicalな変形を適用することで、データベースシステム10は、各ANDノードの処理順が変更された複数の経路を導出し、図3に示すようなタスクグラフを生成する。
【0073】
続いて、データベースシステム10は、タスク処理をどの情報処理装置で実行するか、タスク処理の結果として得られるデータをどの記憶装置に格納するか等に関する変形ルール(Physicalな変形)を適用してタスクグラフを変形する(S803;Physical Change)。Physicalな変形を適用することで、データベースシステム10は、各ノードに付与されたフィジカルプロパティに従って、各ANDノードの処理順が変更された複数の経路を導出し、図4に示すようなタスクグラフを生成する。
【0074】
続いて、データベースシステム10は、サーバ間又は記憶装置間でデータを転送する際に、当該データの圧縮及び伸張を実行するか否かに関する変形ルールを適用してタスクグラフを変形する(S804;C/NC Change [trans. data])。上記の変形を適用することで、データベースシステム10は、各ノードに付与されたフィジカルプロパティに従って、分岐した複数の経路を導出し、図7に示すようなタスクグラフを生成する。
【0075】
上記のS804に係るタスクグラフの変形を適用する際に、データベースシステム10は、各ノードに付与されたフィジカルプロパティを識別し、当該フィジカルプロパティに応じたタスクグラフの変形を行う。なお、上記のように、フィジカルプロパティは、各ノードの入力データ又は出力データの圧縮状態に係る情報を含む。
【0076】
データベースシステム10は、S802~S804の変形を適用した後に、変形が終了したか否かの確認を行う(S805;Finish?)。全ての変形が終了していれば(S805の「Yes」)、データベースシステム10は、次のステップに係る処理(S806)を実行する。一方、全ての変形が終了していなければ(S805の「No」)、データベースシステム10は、再度S802~S804の変形を行う。
【0077】
S806では、データベースシステム10は、タスクグラフにおける複数の経路に対して最適な実行経路の探索を行う(S806;Serching Pass)。具体的には、データベースシステム10は、タスクグラフに含まれる複数のノードに対して処理コストを計算し、各ノードに対する処理コストに基づいて複数の経路の各々に対して処理コストの合計を計算する。データベースシステム10は、例えば、処理コストの合計が最も小さい経路を、最適な実行経路として決定する。上記の条件に代えて又は上記の条件に加えて、メモリの使用量の制約及び処理に係る装置の消費電力やサーバの使用料金などのコストを同時に考慮して処理コストを計算してもよい。
【0078】
続いて、データベースシステム10は、S806で決定された実行経路に基づいて、クエリ処理を実行する(S807;Executing Query)。データベースシステム10は、クエリ処理を実行した結果をホスト20に送信することで、上記のフローが終了する。
【0079】
上記のように、「フィジカルプロパティ」は、データフォーマットの概念を含む形式で表現される。当該データフォーマットの形式として、列指向のデータ圧縮フォーマット、又はバイト指向のデータ圧縮フォーマットが含まれる。列指向のデータ圧縮フォーマットは、例えば、Apache Parquet又はORCである。バイト指向のデータ圧縮フォーマットは、例えば、gzip又はlz4である。
【0080】
以上のように、本実施形態に係るデータベースシステム10によると、タスクグラフを用いたデータベースに対するクエリ処理の実行方式を最適化する際に、データの圧縮を行う場合とデータの圧縮を行う場合の両方の可能性を考慮したうえで当該最適化を行うことができる。
【0081】
[2.第2実施形態]
図9を用いて、第2実施形態に係るデータベースシステムについて説明する。第2実施形態に係るデータベースシステムの構成は第1実施形態に係るデータベースシステムと類似するので、共通点の説明を省略する。以下、第1実施形態に係るデータベースシステムと相違する点について主に説明する。
【0082】
[2-1.圧縮状態を考慮したタスクグラフの変形]
図9は、一実施形態に係るタスクグラフを示す図である。図9に示すタスクグラフは図7に示すタスクグラフと類似するが、図7におけるN703及びN723が統合されたN903が規定されている。同様に、図9では、図7におけるN715及びN735が統合されたN915が規定されている。図9に示すタスクグラフによって行われる処理は、図7に示すタスクグラフによって行われる処理と同じだが、両者のタスクグラフの記述方式が異なる。
【0083】
N903及びN915は、ともに第1サーバ100から第2サーバ200にデータを転送する際に、圧縮データが転送されるか又は非圧縮データが転送されるかを規定するノードである。図9の場合、N903及びN915の各々から分岐するエッジによって、出力されるデータが圧縮データなのか非圧縮データなのかを区別することができる。
【0084】
具体的には、N903からN904に延びるエッジは、非圧縮データが転送されることを意味する。一方、N903からN924に延びるエッジは、圧縮データが転送されることを意味する。同様に、N915からN906に延びるエッジは、非圧縮データが転送されることを意味する。一方、N915からN936に延びるエッジは、圧縮データが転送されることを意味する。
【0085】
上記のように、本実施形態では、1のノードから複数のエッジが延びている場合、経由するエッジによって圧縮データが転送されるか非圧縮データが転送されるかを規定する。つまり、タスクグラフにおいて、処理方法の分岐が、どのノードを経由するかによって表現されるのではなく、どのエッジを経由するかによって表現されてもよい。
【0086】
[3.第3実施形態]
図10を用いて、第3実施形態に係るデータベースシステムについて説明する。第3実施形態に係るデータベースシステムの構成は第1実施形態に係るデータベースシステムと類似するので、共通点の説明を省略する。以下、第1実施形態に係るデータベースシステムと相違する点について主に説明する。
【0087】
[3-1.圧縮状態を考慮したタスクグラフの変形]
図10は、一実施形態に係るタスクグラフを示す図である。図10に示すタスクグラフは図7に示すタスクグラフと類似する。しかし、図7では、N724から延びるエッジはN705のみに接続されているのに対して、図10では、N724に対応するN1024から延びるエッジは、N1005及びN1025の2つのノードに接続されている点において、図10に示すタスクグラフは図7に示すタスクグラフと相違する。
【0088】
図10に示すように、N1024から延びるエッジは、N1005だけでなくN1025にも接続されている。データベースシステム10は、第2サーバ200のDRAM220に格納されたデータが圧縮データである場合に、N1025に対して入力されるデータに付加された付加情報に基づいて、N1025において圧縮されたデータを伸張する必要があるか否かを判断する。N1025において、データの伸張の要否を判断することができる場合、データを伸張することなく絞り込み処理を完了させることができる。
【0089】
例えば、圧縮データには、圧縮に係る情報を含むメタデータが付加されている場合がある。より具体的には、列指向のデータベースで用いられる形式であるParquetフォーマットでは、データを数百MB程度のrow groupと呼ばれる単位に分割したうえで、row groupごとに「そのrow group内に含まれるデータの最大値及び最小値の少なくともいずれか」がメタデータとして記録されている。
【0090】
そこで、例えば、「100以上の値を有するデータのみを取り出す」という絞り込み処理を実行する場合、メタデータに記録されたデータの最大値が120であれば、上記の絞り込み処理を実行するために、圧縮されたデータを伸張する必要がある。一方で、メタデータに記録されたデータの最大値が80であれば、対象のrow groupには有効なデータは含まれていない。したがって、このような場合、データベースシステム10は、データを伸張することなく絞り込み処理が不要であることを判断することができる。
【0091】
上記のように、ノードに入力される付加情報に基づいて、圧縮されたデータの伸張要否を判断することで、より効率的な処理を実現することができる。
【0092】
本実施形態では、メタデータがデータの最大値及び最小値の少なくともいずれかを含む構成を例示したが、メタデータが上記データの和を含んでいてもよい。
【0093】
以上、本発明に係る実施形態について図面を参照しながら説明したが、本発明は上記の実施形態に限られるものではなく、本発明の趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、本実施形態のデータベースシステムを基にして、当業者が適宜構成要素の追加、削除もしくは設計変更を行ったものも、本発明の要旨を備えている限り、本発明の範囲に含まれる。さらに、上述した各実施形態は、相互に矛盾がない限り適宜組み合わせが可能であり、各実施形態に共通する技術事項については、明示の記載がなくても各実施形態に含まれる。
【0094】
上述した各実施形態の態様によりもたらされる作用効果とは異なる他の作用効果であっても、本明細書の記載から明らかなもの、又は、当業者において容易に予測し得るものについては、当然に本発明によりもたらされるものと解される。
【符号の説明】
【0095】
10:データベースシステム、 11:管理システム、 12:クエリ実行部、 20:ホスト、 100:第1サーバ、 110:CPU、 120:DRAM、 130:SSD、 200:第2サーバ、 210:CPU、 220:DRAM、 310:ホストインタフェース、 320:タスクグラフ生成部、 330:実行計画決定部
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10