【実装例】Tableauで大量データを高速に表示する
私が開発したダッシュボードで、大量データを高速に表示させた時の実装ポイントを書いていきたいと思います。
データ量としては100億レコードをレスポンスとしては数秒(10秒以内)で返るダッシュボードを構築しました。
基本的な考え方は、
Tableauのフィルターが多い場合のダッシュボードの改善 の画面に表示されるフィルター(クイックフィルター)の実装方法がベースとなっているので、こちらも参考にしてください。
実装のポイント
集計テーブルの作成
この開発したダッシュボードの生データの時点は、100億より全然大きいレコード数でした。まずは仕様を固めた上で、ダッシュボードに使わない粒度の項目を集計してまとめあげます。
例えば、秒単位保持されていた生データを日単位のデータに集計してまとめ上げるイメージです。
この方法は、ここで話すほどの巨大なデータを扱わない場合でも、パフォーマンスの観点では常に検討すべきポイントかと思います。
検索条件用のテーブルを作成
作成した集計データでも100億レコード以上ある大量データなのでもちろん抽出することができません。なのでライブ接続で実現するしかありません。
一方でライブ接続かつ大量データのテーブルからフィルター項目を表示しようとすると初期表示が著しく遅くなります。また、関連値などフィルター項目の選択によって他のフィルター項目が変更される場合も遅くなります。
そこで検索条件用のテーブルを作成します。検索条件用テーブルというのは、集計データから検索条件に利用するカラムだけ抽出したテーブルになります。
抽出する際には、SQLでいうとDISTINCTを行うのですが、これは利用するカラムだけを抜粋して、そのカラムの値の組み合わせがユニークになるようにします。
集計データは大量データでも、この検索条件用テーブルはデータが削られているためデータソースの抽出ができると思います。検索条件用テーブルを作成した時点で抽出できないデータ量である場合はライブ接続を選択するのではなく、フィルター項目を見直してデータソースの抽出ができるデータ量に抑えた方がいいです。
検索条件が一意となるキー(サロゲートキー)の作成
検索条件用テーブルに各レコードが一意になる数字のキー(サロゲートキー)を用意します。
DBの連番機能を利用することもありですが、各検索条件の値をコード値に変換したものを組み合わせて作る場合が個人的には多いです。
理由としては、データソースを再計算した場合にこのキーが変更されることを防止するためです。連番を利用しても、キーの値の変更を防止できる仕組みがあれば問題ないかと思います。
ポイントは、検索条件の項目をそのまま文字列として結合して、文字列のサロゲートキーを作成するのはパフォーマンス上よくないので避けるべきです。
サロゲートキーを作成することにより、集計済みテーブルもサロゲートキーのみ保持すればよく、検索条件のカラムは必要なくなるのでデータソースが小さくなります。
これは、DBのパフォーマンスの観点では、以下の2点の効果が期待できます。
- 検索条件がサロゲートキーの1つになるので、パフォーマンスが向上
- 集計済みテーブルのテーブルのカラム数が減る分パフォーマンスが向上
DBのチューニング
DWHによってはDBチューニングが不要のものもありますが、このダッシュボードはAmazon Redshiftを利用していたので、チューニングが必要になりました。
やり方としては、以下の通りになります。
- Tableauのパフォーマンス記録からTableauが実際に発行しているSQLを確認。
- 1を元に、DB上でどのようなSQLが実行されるかを確認。
- DB側でも実行されたSQLを確認。
- Redshiftの場合は、DistKeyやSortKeyで実行計画を見ながらDBのチューニングを図る。
Redshiftであれば元のデータが100億レコードを超えていても、条件で絞り込んでデータを抽出するだけであれば適切にチューニングすることにより数秒で返ってきます。
さらにTableau側での処理を単純なものにしておけば、10秒以内にレスポンスを返すことも可能です。
まとめ
Tableauのチューニングに合わせて、DBのチューニングを行うことで大量データを数秒でレスポンスを返すことができた事例です。
そもそもの開発する際に、集計済みデータも大量データで保持すべきかはきちんと検討した方がいいと思います。どうしても必要な際には、ライブ接続でDB側のチューニングを行う必要があります。
さらに、このパターンの場合は複雑なチャートの作成はパフォーマンスに多大な影響を与えるので、シンプルなものしかできないのではないかと思っています。
この記事が、どのくらいのデータ量までいけるのかの参考になれば幸いです。
Discussion