TECH BLOG
技術ブログ

ARTICLE

  • 2020-05-26 Swarm64 DA

    PostgreSQL高速化モジュール Swarm64 DA~導入編①~

Swarm64 DAによるPostgreSQLの高速化には通常のPostgreSQLとは違ったテーブル設計が必要になります。
またSwarm64 DA独自のオプションも存在し、この部分を理解することでPostgreSQLの高速化メカニズムの理解にもつながります。

はじめに

みなさん、こんにちは、インサイトの梅宮です。
Swarm64 DA入門編から見ていただいている方はSwarm64 DAの性能がある程度分かってきたのではないでしょうか?
そこで今回は前回の最後にお知らせした様にSwarm64 DAによる高速化が実現するまでのメカニズムを紹介したいと思います。

Swarm64 DAの高速化手順

Swarm64 DAはEXTENSIONであり、通常のPostgreSQLとはテーブルの作成手順から異なってきます。
また、Swarm64 DAテーブルは外部テーブル(以下Swarm64 DA外部テーブル)であり、CREATE TABLEのオプションなども専用のものを使用します。
以下が基本的なSwarm64 DA外部テーブルのDDLの例です。

CREATE FOREIGN TABLE orders (
o_orderkey bigint NOT NULL, o_custkey int NOT NULL, o_orderstatus character(1) NOT NULL,
o_totalprice numeric(13,2) NOT NULL,
o_orderdate date NOT NULL,
o_orderpriority character(15) NOT NULL,
o_clerk character(15) NOT NULL,
o_shippriority int NOT NULL,
o_comment character varying(79) NOT NULL
)
SERVER swarm64da_server OPTIONS(
range_index 'o_orderdate',
primary_key_hint 'PRIMARY KEY (o_orderkey)', foreign_keys_hint 'FOREIGN KEY (o_custkey) 
REFERENCES customer(c_custkey)', unique_keys_hint 'UNIQUE(o_custkey)');

『CREATE TABLE』を『CREATE FOREIGN TABLE』と指定する以外でデータ型の指定に関する変更はありませんが、上記した様にオプションの指定方法がSwarm64 DA外部テーブル独自のものとなっています。

range_index:Swarm64 DAによる高速化を実現するために指定する重要なカラム(詳細は後述)
primary_key_hint:通常の主キー指定と同様
foreign_keys_hint:通常の外部キー指定と同様
unique_keys_hint:通常のユニークキー指定と同様

Swarm64 DAによる高速化のメカニズム

Swarm64 DAはSwarm64 DA外部テーブルが作成された時にデータを圧縮し、このデータの一部を解凍してPostgreSQL内で使用するために外部テーブルを使用しています。
解凍するデータをピンポイントで指定しているため高速化が実現されるというメカニズムです。
range_indexはこの解凍するデータの指標として指定するものです。

Range_indexの指定基準

Swarm64 DAによる高速化においてrange_indexの指定は大変重要なファクターです。この指定を誤ることで高速化が実現されない、最大限のパフォーマンスを出すことができないなどの弊害が起こります。
そこで、range_indexの指定に適しているカラムの判断基準を挙げていきます。
◎range型のデータであること
 ex.時間や日付などのデータ型、価格や量を表すデータ型、緯度・経度といった空間情報を表すデータ型
◎問い合わせにおいて、頻繁に参照されるカラムであること

この2点の条件に合致するカラムをrange_index選択として選択することが望ましいです。
またrange_indexの指定カラム数は常に1つ以上必要であり、最大3つまで選択可能です。2つ〜3つのrange_indexを使用するのがパフォーマンス上理想的です。

高速化処理における5つのステージ

Swarm64 DAのPostgreSQL高速化プロセスは5つの段階(ステージ)に分けられ、それぞれの段階において特定の条件を満たすことで高速化が実現されます。
5つのうち、1つでも条件が満たされていれば高速化はされるのですが、通常は2~3ステージ、パフォーマンスを最大限活用するのであれば全てのステージの条件を満たす必要があります。
※条件が満たされなかった(高速化しなかった)部分に関してはCPUによる通常の処理が行われます。
高速化処理における5つのステージ

ステージ1. Range index

Range index
このステージでは流されたクエリを基にしてテーブルを圧縮します。

条件
  1. テーブルから参照できるデータであること
  2. 使用するテーブルがSwarm64 DA外部テーブルであること
  3. WHERE句で使用できる演算子の制約(後述)を遵守していること
Range indexの対応するWHERE句の演算子

Range indexの対応するWHERE句の演算子

ステージ2. Decompression

Decompression
このステージではステージ1で圧縮したテーブルをFPGAカード内で解凍します。

条件
  1. テーブルから参照できるデータであること
  2. 使用するテーブルがSwarm64 DA外部テーブルであること

ステージ3. カラムの選択

カラムの選択
このステージではステージ2で解凍したテーブルからSELECT文で指定したカラムに絞り込みます。

条件
  1. テーブルから参照できるデータであること
  2. 使用するテーブルがSwarm64 DAテーブルであること
  3. SELECT文で特定のカラム名を指定していること

ステージ4 WHERE句のプッシュダウン

WHERE句のプッシュダウン
このステージではステージ3で絞ったカラムをWHERE句に従ってさらに絞ります。

条件
  1. テーブルから参照できるデータであること
  2. 使用するテーブルがSwarm64 DA外部テーブルであること
  3. WHERE句がSwarm64 DAでサポートされている演算子であること
  4. FPGAアクセラレーションデバイスでサポートされているカラムタイプであること(後述)
Swarm64 DA外部テーブル作成時のカラムタイプ制約

Swarm64 DA外部テーブル作成時のカラムタイプ制約

ステージ5 Finalization

Finalization

概要
  1. ステージ5では満たすべき条件はなく、以下のプロパティが提供される。
    →クエリに適応できる並列性の向上
    →実行計画内に特定のノードを作成
  2. Swarm64 DAの導入による並列処理により通常のテーブルにおいてもある程度の高速化処理が見込まれる。
  3. ステージ1~4において処理されなかったステージがある場合はこのステージにてCPUによる処理が行われる。

まとめ

以上がSwarm64 DAのPostgreSQL高速化メカニズムについての紹介です。
PostgreSQL高速化処理における5つのステージの部分で説明した様にSwarm64 DAによるPostgreSQLの高速化はテーブル設計やカラムの選択にちょっとしたコツが必要になります。
しかし条件を満たすことができるほどより最適な高速化を実現することもできます。

終わりに

今回はSwarm64 DAがPostgreSQLの高速化をするメカニズムについてご紹介しました。
通常のPostgreSQLのテーブル設計などとは少し違う部分もあり、戸惑う部分もあったのではないでしょうか。しかしこの部分を理解することがSwarm64 DAの性能やメカニズムを理解する上で重要となってきます。
次回はよりSwarm64 DAの仕組みを理解していただくために、Swarm64 DAのOS上での構成や動作をしているのかについてご紹介したいと思います。

本日は、ありがとうございました。

お問い合わせフォーム

https://www.insight-ltd.co.jp/contact/

今までの記事

PostgreSQLの高速化モジュール Swarm64 DA -入門編-
PostgreSQLの高速化モジュール Swarm64 DA -検証編①-

CATEGORY

ARCHIVE

データベースの
パフォーマンス・チューニングのご相談は
株式会社インサイトまで
お気軽にお問い合わせください。

CONTACT