こんにちは、クラウドエース編集部です。 Google Cloud が提供するフルマネージドのデータベース「AlloyDB」には、「カラムナエンジン」という分析処理を高速化してくれる機能が備わっています。 今回は、カラムナエンジンとはどのような機能で、どんなメリットがあるのか、具体的にどれくらい処理が高速化するのかについて、実例を交えながら解説していきます。 目次 Toggle カラムナエンジンとは?カラムナエンジンを使うとどれくらい早くなる?クエリの解析の際は Query Insights を使おうまとめ 尚、本記事はこちらの動画をベースにして記事にまとめたものになります。 内容の理解を深めるために記事中に参照となる動画の該当部分をリンク貼っておきますのでご活用いただければと思います。 カラムナエンジンとは? カラムナエンジンとは、Google Cloud が提供するデータベースサービス「 AlloyDB 」の機能のひとつです。「指定した列のデータを高速でクエリできる」ことが最大の特徴となっています。 カラムナエンジンの仕組みや利用するメリットについて詳しく見てみましょう。 AlloyDBとは まずは、カラムナエンジンが備わるデータベース「 AlloyDB 」について簡単に説明します。 AlloyDB とは、PostgreSQL 互換のフルマネージドデータベースです。優れたパフォーマンス、スケーリング、高可用性が特徴で、トランザクションでは標準の PostgreSQL の最大 4 倍のスループット、解析用途であれば標準の PostgreSQL の最大 100 倍のレイテンシを出すことができます。 カラムナエンジンの仕組み AlloyDB で利用できるカラムナエンジンは、処理をさらに高速化してくれる機能です。通常のデータベースが各行をひとかたまりのデータとして扱う「行指向」であるのに対して、カラムナエンジンは特定の列の値をまとめて処理する「列指向」でデータを扱うことが大きな特徴です。 (動画1:00〜) 行指向の処理で分析クエリの答えを得るには、テーブル全体をスキャンする必要があります。たとえそこに格納されたデータの大部分が質問の答えと無関係だとしても、すべての行のすべての列を読み取る必要があるのです。 一方で、列指向でデータを処理するカラムナエンジンでは、単一の列に値をまとめて保持することができます。関連する列にアクセスを集中させることによって、分析クエリにより速く応答できる仕組みです。 カラムナエンジンのメリット データを列で保持するカラムナエンジンを利用するメリットは、特に集計や範囲のスキャンといった処理を高速化できることです。 また、使い方が簡単なこともカラムナエンジンの利点と言えます。カラムナエンジンは、インスタンスにフラグ設定するだけで起動します。さらに、どの列をキャッシュで保持するかは、機械学習と分析モデルを活用しながら AlloyDB が自動判別してサジェストしてくれます。「サジェストされた内容を一定の間隔で、自動で設定し続ける」といった指示もできるため、一度設定すれば AlloyDB に全て任せてしまうといったことも可能です。 カラムナエンジン利用の際の注意点としては、メモリを常時消費することが挙げられます。ただし、メモリをどれだけ確保するのかは指定することができます。また、列ベースで保持するため、集計クエリに利用する列のみを保持することで、メモリ効率を上げられます。 カラムナエンジンを使うとどれくらい早くなる? それでは、カラムナエンジンを使うと、具体的にどれほど処理が早くなるのでしょうか。実際に負荷試験を行って、比較してみましょう。 計測方法・条件 今回の試験では、AlloyDB に対してコンピュートエンジンの上に立てた HammerDB というアプリケーションで負荷をかけます。6000万行の商品などが含まれたオンラインショッピングのオーダーについてのデータベースを処理していきます。データベースの総容量は約 20 GBで、分析系を含む 22 のクエリを実行します。AlloyDB の各設定値は、以下の通りです。 マシンタイプ 32vCPU, 256GB リージョン asia-northeast1(Tokyo) 高可用性 Highly available カラムナエンジンのメモリサイズ 7000 MB なお、HammerDB を動作させる VM の設定は以下の通りとなります。 マシンタイプ e2-highcpu4(4vCPU/4GB) リージョン asia-northeast1(Tokyo) 同じ条件で、カラムナエンジンをオンにした場合と、オフにした場合とでそれぞれ処理速度を比較します。 計測手順 今回の負荷試験の実施手順は以下の通りとなります。 初期データを書き込む 書き込んだ AlloyDB をバックアップし、別のインスタンスにリストアして同じ環境を再現する 片方の AlloyDB でカラムナエンジンを有効化する それぞれで負荷試験を実施 各クラスタで TPC-H を実行、CSV 化 計測結果を Spreadsheet に書き出してグラフ化 なお、カラムナエンジンのメモリサイズについて、推奨値には 30 MB 程度のブレがあったものの、概ね 350 MB 以下となりました。 結果 試験の結果を見てみましょう。速度の改善が著しかったクエリをまとめると、以下の通りとなりました。 クエリ番号 カラムナエンジン不使用時との速度比較 No.19 -74.36 % No.22 -52.21 % No.10 -35.22 % 最速のクエリであった No.19 では 74% の低減、カラムナエンジンを使わない時の ¼ の時間でレスポンスを返してくれるという結果になりました。 なお、今回の負荷試験において、カラムナエンジンを使ったことにより処理が遅くなったクエリは一つもありませんでした。速度の改善度合いが低いものを順に並べると、以下のようになっています。 クエリ番号 カラムナエンジン不使用時との速度比較 No.20 -1.18 % No.9 -5.72 % No.5 -6.39 % No.11 -7.66 % トータル -15.57 % 全体平均で見ても、レイテンシは 15% 低減しています。今回の負荷試験のような、大量データを処理する必要がある場合には、カラムナエンジンをオンにするべきと言えるでしょう。 ただし、この結果はあくまで今回取り扱ったデータについての分析結果です。また、 これは AlloyDB の β 版での結果となります。カラムナエンジンが有意に働かないケースは存在しないというわけではありません。 結果の分析 カラムナエンジンをオンにすることで、どの処理がどう速くなったかについて、もう少し具体的に見てみましょう。ここでは、特に高速化したクエリ No.19 を詳しく分析してみます。ちなみに No.19 とは、オンラインショッピングで配送するアイテムのうち、複数パターンに合致するアイテムを取得するというクエリです。 クエリの実行計画を見てみると、カラムナエンジンを使うのと使わないのとでは、最初の工程であるスキャン処理が異なることがわかりました。具体的には、カラムナエンジンを使わない場合、すべてのデータを1つずつ順番に見ていく「シーケンシャルスキャン」が行われるのに対し、カラムナエンジンを使った場合は、関連する列にアクセスを集中させる「カラムナスキャン」が行われています。これにより、クエリのコストが 150 万から 3000 程度まで激減しています。実行時間についても、同じように大きく減っていました。 (動画7:35〜) この結果の大きな要因としては、カラムナエンジンを使った処理では、アクセスレイテンシの低い DRAM からデータを読み込めたことが挙げられます。カラムナエンジンのキャッシュはクエリが最初に到達する VM のメモリ内に配置されるため、非常に素早く処理と呼び出しを行えるのです。 (動画8:45〜) ちなみに、上記の負荷試験とは別に、よりシンプルな「簡単な条件に合致するレコードの数を返す」というクエリを同じ条件にて試しました。その結果、カラムナエンジンを利用しなかった場合は 8.8 秒かかったところ、カラムナエンジンを利用すると 12.4 ミリ秒で処理が完了しました。これは、比較すると 700 倍の高速化です。 このような結果からも、単純なクエリであればあるほど、カラムナエンジンを利用することで高速化できると期待できます。 クエリの解析の際は Query Insights を使おう 今回の負荷試験のようにクエリを解析したい場合には、AlloyDB に備わる機能「 Query Insights 」の利用がおすすめです。 これは、クエリのパフォーマンスの監視と診断を行う機能です。クエリがどう処理されたか、各処理のレイテンシ、コスト、利用されたインデックス、CPU の処理内訳、クエリの平均応答時間などを確認できます。クエリの実行計画や予測コスト、実際にかかったレイテンシなども、ひと目でわかるような図で表示されるため、データベース初心者でも安心して使うことができるでしょう。 まとめ ここまで、AlloyDB とカラムナエンジンの機能について解説してきました。カラムナエンジンは、大きなデメリットがなく、簡単に処理を高速化できる機能と言えます。データ分析を行うのであれば、積極的にオンにするべきと言えるでしょう。 ただし、当然のことですが、あくまでカラムナエンジンはひとつのツールです。GO言語の開発者でもある Rob Pike 氏が提唱するプログラミングの法則の一つに「計測なしにチューニングを行ってはいけない」という言葉があります。この言葉通り、本当にカラムナエンジンを利用することで高速化しているのかを、きちんと計測することは忘れてはいけません。 なお、Google Cloud ではチューニングのためのツールも揃っています。今回紹介した Query Insights のほか、AlloyDB には Index を最適化できる機能などもあります。 この記事を参考に、データ分析に AlloyDB およびカラムナエンジンを活用してみてください。