Tableauのパフォーマンスの落とし穴(並べ替え機能)
Tableauのパフォーマンスを考える上では、計算フィールドで処理するより標準機能を活用した方が一般的にはいいです。
しかし、並べ替え機能については計算フィールドを活用した方がいい場合があります。私も実際の業務で計算フィールドをやめて標準の並べ替え機能に変えたら急に表示が遅くなったケースがありました。
今回はサンプルストアで並べ替え機能とパフォーマンスを調査した結果をまとめたいと思います。
ベースとなるのは以下の表をいろいろな並び替えを実施した時のパフォーマンスを比較したいと思います。
【検証パターン】
- 並び替えがない場合
- サブカテゴリーで並べ替える場合
- 利益で並べ替える場合
- 利益率で並べ替える場合
Tableauの並べ替えの検証
1. 並べ替えがない場合
パフォーマンス記録は以下の通りで、Executing Queryは1回発行されます。
2. サブカテゴリで並べ替える場合
並べ替えがない場合と同じようにパフォーマンス記録は以下の通りで、Executing Queryは1回発行されます。
3. 利益で並べ替える場合
利益で並び替えると、Executing Queryは2回発行され、1回は並べ替えに使う項目を取得しているように見えます。
4. 利益率で並べ替える場合
利益率で並び替えるても利益の場合と同じように、Executing Queryは2回発行され、1回は並べ替えに使う項目を取得しているように見えます。
検証の考察
サブカテゴリーのような単純な項目で並べ替える場合は問題なさそうですが、「利益」や「利益率」など集計値で並べ替えようとするとTableauは別のクエリを発行しています。
Tableauでチャートを作成する際には集計値で並べ替えることは多いと思いますが、その場合はTableauで描画するためのデータを取得するだけではなく、別に並べ替え用にデータを取得するためにSQLを内部で発行している場合があることを知っておきましょう。
データを取得するSQLがそもそも遅い場合は、並べ替え用にデータを取得するSQLも遅いことが多いので、パフォーマンスに大きな影響を及ぼすので注意が必要です。
また、今回検証したTableau Desktopは2021.2.7という比較的新しいバージョンで試していますので、昔から発生していて現在でも起こっている現象かと思います。
並べ替え用のSQL発行の回避策
とはいえ、集計値で並べ替えを行いたい場合もあると思います。その場合は、RANK_UNIQUE関数を使うことで回避できる場合があります。
先ほどの利益率で並び替えをする場合のRANK_UNIQUE関数を使った場合のシートです。
ポイントは、RANK_UNIQUE関数を使ってその項目で並び替えを行い、RANK_UNIQUE関数の項目は非表示にしています。
並び替え用のRANK_UNIQUE関数は以下のようにしています。
RANK_UNIQUE([利益率])
この場合のパフォーマンスの記録は、以下のようになります。
Executing Queryは1回しか発行されず、並び替え用のデータを取得するためのSQLの発行は見られません。
※RANK_UNIQUE関数は、RANK関数と違って「同一の値に異なるランクが指定されます」。上記の場合にRANK関数を使っても特に変わらないです。
まとめ
実際に私が開発したダッシュボードでもRANK関数を使うことによって大幅にパフォーマンスが向上しました。
RANK関数などはパフォーマンス上あまり使わない方がいいとは思いますが、並べ替えで利用する場合は有効な場合があります。
とにかく遅いダッシュボードはパフォーマンスの記録をとって遅い原因を理解した上で、別の実装方法を試してみて検証するしかありません。
標準の機能の利用を避けて、計算フィールドを活用した方がパフォーマンスがあがることがあるので、これがベストな方法だという先入観にとらわれず、いろいろ試してみるのがパフォーマンス向上の近道かと思います。
Discussion