« 【AWS Database Blog】Aurora ストレージエンジンのご紹介 | メイン | AWS Black Belt Online Seminar「AWS Batch」の資料およびQA公開 »

【AWS Database Blog】Amazon RDS for PostgreSQL 9.6.1 でパラレルクエリとフレーズ検索

こんにちは。ソリューションアーキテクトの江川(@daiti0804)です。本日は、AWS のソリューションアーキテクトである Jeff Levine AWS Database Blogに投稿したIntroducing the Aurora Storage Engine をご紹介します。


Amazon Web Services のソリューションアーキテクトとしての私の役割の1つに、我々のサービスの新機能やできることをお客様に知っていただくことがあげられます。 Amazon RDS は、時間のかかる管理タスクに集中することなく、クラウド上でリレーショナルデータベースを設定、運用、スケールさせることを可能にします。Amazon RDS では、PostgreSQL 9.6.1 のサポートをアナウンスしました。この投稿では、本リリースに含まれる2つの機能、パラレルクエリとフレーズ検索についてご案内したいと思います。

パラレルクエリ
パラレルクエリは、複数のワーカープロセスを作成し、クエリ実行をより高速に行うために複数のCPUを活用することができます。各ワーカープロセスは、データのサブセットに対してクエリを実施します。それぞれの結果は結合され、最終的なクエリ結果が作成されます。ワーカープロセスの数は、max_parallel_workers_per_gather というパラメータによって決定します。このパラメータのデフォルトの値は、0, つまりパラレルクエリは無効化されています。

下記の例では、VPC と 2 vCPU, 8GB の RAM を持つ db.m4.large インスタンスクラスのPostgreSQL RDS データベースを作成して利用しています。まず、PostgreSQL 向けの3rd party ツールである pgcli を利用して、pg961db という名前のテーブルを作成します。

CLi

この CREATE TABLE 文では、 generate_series 関数を使って、テーブルの各レコードの ID として機能する1 から 1億までの整数値のセット作成しています。また、random(), floor() 関数を使って、1 から 9 までの乱数を持つカラムを生成しています。そして、SELECT 文を使用して、作成したテーブルの最初の3行を表示しています。これから、標準的なクエリを実行します。

CLi2

上記のスクリーショットでは、max_parallel_workers_per_gather は、 0 に設定され、パラレルクエリは無効化された状態で、SELECT を実行しています。クエリプランでは、シーケンシャルスキャン(上記スクリーショットで Seq Scan と表示)が呼び出していることがわかります。クエリの総時間は、約44秒です。では、パラレルクエリを有効にして何が起こるか確認しましょう。

CLi3

この例では、max_parallel_workers_per_gather が 2 と設定され、パラレルクエリが有効になっています。この EXPLAIN 文の出力を見ると、2つのワーカーが起動し、クエリの総時間は約29秒となり、1つのワーカーで同じクエリを実行するのと比べて、34% 短くなっていることがわかります。

この例では、複数のワーカーを使った分割統治法により、パラレルクエリがどのようにクエリの実行時間を短くできるかを示しました。これは先の例のavg() 関数のような集約関数を実行する場合に特に有効です。効率性があがるかどうかは、データそのもの、クエリの特性、データベースインスタンスクラスなど、非常に多くの要因に依存します。

フレーズ検索
PostgreSQL 9.6 から、標準検索ではできなかった語順を意識したフレーズ検索(phrase searches)ができるようになっています。まず、標準検索を使った例を見てみましょう。

CLi4

最初の例では、“Amazon Web Services has over 90 services” という文に対して、“Amazon Web Services” と検索すると、True という期待された結果が返ってきます。しかしながら、“The Web Travel Services Agency offers tours of the Amazon” という文に対して、“Amazon Web Services” と検索しても、True と返ってきてしまいます。これは望んだ結果ではないように見えます。なぜこういったことが起こるのかを理解するために、plainto_tsquery() 関数がどのようにクエリ文字列をパースするのかを見てみましょう。

CLi5

パーサーはまず、“Amazon Web Services” という文字列に対して英語での処理ルールを適用します。具体的に言うと、大文字、小文字の正規化や派生語を扱えるようにトークンを語彙素(lexemes)に変換する前に各用語の変化しない部分を抽出(“services” が “servic” へ変換されます)します。クエリ文字列の結果を確認すると、"&" 演算子で区切られた語彙素によって構成されていますことがわかります。もし、すべての語彙素が見つかった場合、順序に関係なく一致したとみなされます。PostgreSQL 9.6 では、phraseto_tsquery() 関数を利用することによって、文字列検索に対して、フレーズ検索が可能になっています。以下を確認してみましょう。

CLi6

クエリ文字列には、標準検索の時と同じように 3つの語彙素が含まれますが、「前の要素に続く」ことを意味する順序付け演算子である <-> で構成されています。3つの要素が正しい順序で表れた場合に一致したとみなされます。これにより、より簡単に検索結果を絞り込み、望ましい結果を得ることができます。(訳者注:こちらの機能を使った日本語に対する検索はサポートされていないのでご注意ください)

Amazon RDS for PostgreSQL バージョン 9.6.1 では、PostgreSQL の最新機能を持つマネージドサービスとしてクラウドに提供されています。パラレルクエリは、複数の CPU を使って複数のワーカープロセスを起動することによって、検索性能を向上することができます。フレース検索機能は、検索対象となる用語に特別な順序が必要な場合に、より適切な検索体験を提供します。 始めるのは簡単です。Getting Started Guide を使って、数クリックで PostgreSQL データベースを作成しましょう。

 

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30