テーブル毎もしくはテーブル内で、柔軟にストア方式を指定した利用例
では、Greenplum DBはどうかというと、ローストアとカラムストアの両方のデータ格納方式を利用可能と申し上げました。これは、テーブル単位で処理内容に合った使い分けができるということです。例えば、2つのテーブルA、Bが存在し、テーブルAは、明細単位で参照・更新することが多いのでローストアに設定し、テーブルBは列単位で集計することが多いのでカラムストアに設定することで、使い分けを行い、それぞれの処理を効率化することが可能です。
また、テーブルパーティション単位でローストアとカラムストアを使い分けることで、1つのテーブル内においてもローストアとカラムストアを組み合わせることができます。例えば、図2のように、テーブルを時系列(図2では1年ごと)でレンジパーティションに区切り、それぞれのパーティションごとにローストアかカラムストアを選択します。この例では、最近のデータに関しては、行単位の参照・更新処理が多く、複数列に対してアクセスが多くなるので、ローストアで格納しています。それ以前の過去のデータに関しては列単位の集計処理が多いため、カラムストアで格納しています。このようにローストアとカラムストアを1つのテーブル内においてハイブリッドで構成し、両方のメリットを得ることができるのは、Greenplum DBの大きな特徴です。
テーブルスペースを利用した物理ストレージの使い分け(SSD等)
DB高速化をハードウェア構成の観点から考える場合、最近では、SSDの搭載を検討することもあるかと思います。もちろん、Greenplum DBはマルチストレージ(SSD、SAS、SATAなどの混在環境)での構成も可能です。具体的には、それぞれのストレージタイプ毎にテーブルスペースを作成し、図2の例と同様に、古いデータはコスト重視のSATA上に配置し、アクセス頻度が高く高速性が重視される最近のデータは性能重視のSSD上に配置することで、階層化ストレージ管理のような構成をとることが可能です。
リソースキューと動的クエリ優先度管理による柔軟なワークロード管理
ワークロード管理を行うことができないDWHシステムではどうでしょう。例えば、20分かかるクエリAがハードウェアリソースを占有している状態で、通常5秒で終了するクエリBが実行された場合、クエリAのレスポンスタイムは20分、クエリBは20分5秒となり、クエリBの処理性能に対する満足度は、極端に低くなります。一方、ワークロード管理を行い、クエリAが実行中でもクエリBを優先実行することができれば、クエリAは20分5秒、クエリBは5秒となり、クエリAの処理性能に対する満足度をほぼそのままに、クエリBに対する満足度を通常時と同じに保つことができます。これは、クエリAのレスポンスタイムが5秒伸びますが、元々の20分と比較すれば無視できるほど小さい時間になるためです。
以上は単純な例ですが、Greenplum DBのワークロード管理機能は、複雑な(重い)クエリ・多重(複数)実行・混合ワークロード環境を適切に管理するために、ハードウェアリソースを全てのクエリに対して適切かつ柔軟に割り当てる能力を持っています。これはリソースキューという仕組みを使って設定します。
図3を使って具体的に説明しますと、例えば、ユーザを3つのロール(グループ)に分けます(ここではマネジメント、アナリスト、一般社員の3つ)。それぞれのロールごとにリソースキューを作成し、ロールとの関連付けを行います。そして、リソースキューに対して同時実行可能なクエリ数やコストの総和を設定します。
図3の例では、マネジメントキュー、アナリストキュー、一般社員キューそれぞれに対し同時実行可能クエリ数を12、8、4に設定し、マネジメントキューに属しているユーザは同時に一番多くのクエリを実行することができるようにしています。
また、リソースキューに対してハードウェアリソース割り当ての優先度を設定します。図3の例では、マネジメントキューに対して、多くのハードウェアリソースを割り当てることで、同じクエリがそれぞれのリソースキューに投げられた場合、マネジメントキューに入っているクエリを一番速く実行することができるようにしています。
このようにリソースキューの優先度管理を行うことで、全体的な処理性能に対する満足度を高く維持することが可能です。
リソースキューを用いた優先度管理において設定可能な項目を大きく4つの観点からまとめると、以下の通りとなります。
(1)同時に処理されるクエリのコストの総和
クエリごとの*コストを確認し、処理中の複数クエリのコストの総和が、あらかじめ指定した閾値を上回ることのないよう制御します。 *コスト: クエリ処理に使用する必要リソース量
(2)同時に処理されるクエリ数
処理中のクエリ数を確認し、処理するクエリの数があらかじめ指定した閾値を上回ることがないよう制御します。
(3)CPUリソースの優先度
リソースキュー間でCPUリソースをどのように割り当てるかを制御します。
(4)メモリの優先度
リソースキュー間でメモリをどのように割り当てるかを制御します。