前回・前々回の投稿の前置きでもお話ししましたが(以下既に読んでいる人はとばして下さい!)
Tableauはセルフ分析に優れており、データアナリストでなくてもビジュアライズを実現する事が可能です。
そのため色んな立場の人がTableauに触れる可能性があるからこそ、パフォーマンスの知識を備え、皆が使いやすい環境を築いていくのが大切です。
今一度**「自分や周囲の人が作っているダッシュボードはPerformanceのBest Practiceを理解して作成できているか」**を考え、改善していくためのきっかけになれば嬉しいです。
今回は、実践で使える計算フィールドのパフォーマンス知識についてお伝えしていきます。
■performance関連の投稿は3部構成(予定)
・[【Tableau】PerformanceのBest Practice①~基本要素を知る~](https://qiita.com/t_misaki1029/items/b473b4fdcbafeab0a2ab#form "【Tableau】PerformanceのBest Practice①~基本要素を知る~")
・[【Tableau】PerformanceのBest Practice②~データソース~](https://qiita.com/t_misaki1029/items/e29e8c5e2b38c577d95a#form "【Tableau】PerformanceのBest Practice②~データソース~")
・【Tableau】PerformanceのBest Practice③~計算フィールド~ ←今回ここ!
まだ過去のPerformanceのBest Practice①・②を読んでいない方は、よければ上記リンクから是非読んでみてください。
またTableauのバージョンが古いものを利用している場合、オプションが対応されていない場合があります。
ご了承ください。(投稿者は2020.2を利用していますので、それ以降のバージョンであれば問題ないと思います)
■計算フィールドを理解する
Tableauにはいくつかの「計算」の種類があります。
ここで説明するのは集計計算・行レベル計算・表計算です。
前回のデータソースの投稿で**「DB側・Tableau側どちらの処理なのか?」がパフォーマンスを考慮する上で重要になるとお伝えしました。
その為、以下の図を参考に何がどこで処理されているのか?に注目**しながら、それぞれの計算式について確認していきましょう。
行レベル計算
■どんな計算?
・粒度がまとめられておらず、行単位で計算式が組まれているもの
・行レベル計算はスケーラビリティが高い
→DBチューニング思索が効果を出しやすいとも言われている
ex )
・[Sales] / [Profit]
・IF [Sales]='0' THEN '〇' END
■どこで処理されている?
データベース側で計算処理
集計計算
■どんな計算?
・集計関数を利用し、粒度が集計されている計算式。
※集計関数を単体で計算しているものも、集計関数を組み合わせて計算しているものも対象。
ex )
・SUM([Sales])
・AVG([Profit])
・SUM([Sales]) / SUM([Profit])
現在[Tableau で利用可能な集計関数](https://help.tableau.com/current/pro/desktop/ja-jp/calculations_calculatedfields_aggregate_create.htm#form"Tableau で利用可能な集計関数")は公式で確認できます。
■どこで処理されている?
データベース側で計算処理
表計算
■どんな計算?
・ビューに表示されているものに基づいて Tableau上で計算を行う計算式。
・行レベル計算や集計計算に比べてTableauの計算負荷が高い。
現在[Tableau で利用可能な表計算関数](https://help.tableau.com/current/pro/desktop/ja-jp/functions_functions_tablecalculation.htm#form "Tableau で利用可能な表計算関数")は公式で確認できます。
ex )
・INDEX()
・RUNNING_SUM(SUM([Profit]))
私は表計算関数を全て覚えていないので、簡易表計算の機能を良く活用しています。
■どこで処理されている?
データベースからクエリ結果を受取り、Tableauが計算処理
パフォーマンスに関わるポイント
■データ型はパフォーマンスへの影響が大きい。整数が一番速い。
整数>ブール>文字列
■パラメータ
パラメータの値は数値に置き換えると良い。
条件式でパラメータを参照する際に、文字列ではなく数値であることでパフォーマンスが向上する。
■ロジック計算にはブール値をうまく活用
ex )
・悪い例
IF [DATE] = TODAY() THEN "TODAY" ELSE "NOT TODAY" END
・良い例
[DATE] = TODAY()
■文字検索の速さ
ワイルドカード照合>CONTAINS()>FIND()
■行レベル計算と集計計算を分割
→一つの計算フィールド内で、行レベル計算を集計計算で囲うこともやろうとすれば可能
しかしそれだと、再利用が難くなってしまうので分けた方が◎
・計算フィールドで行レベル計算の作成を行い、その後新たな計算フィールドで集計計算を行う
計算フィールドとTableauオプション機能どちらを選ぶ
Tableauオプション機能(ネイティブ機能)は計算フィールドよりも速いことが多いです。
計算フィールドでは自由に計算式を組むことが出来るので、
つい何でも計算フィールドで済ませたくなる人もいるかもしれませんが
Tableauオプション機能を活用した方がパフォーマンスは向上します。
なぜならば、Tableauの得意なSQLで動くように設計されているからです。
参考として以下の機能があげられます。
■グループ
・デイメンションメンバーのグルーピング
■別名の編集
・デイメンションメンバーの名前変更
■ビン
・メジャー値のカテゴリ化
おわりに
今回、集計計算・行レベル計算・表計算のご紹介しました。
表計算は負荷は高いものの、複雑な計算が可能になるので用途によって使いこなしていく必要があります。
ここを完全理解し、思い通りに活用する事が自分的にはかなり大変で、まだまだ勉強中です。
その為、取り急ぎざっくりと特徴を記載しましたが、需要があればもっと具体的な活用例も追記しようかなと思います。