見出し画像

DataSaber技術課題の備忘録_2

はじめに

DataSaberの10個の技術課題をクリアする過程で学んだことを、復習を兼ねて自分なりに言語化しています。
2回目のこの記事は、7つ目の技術課題である『Performance Best Practice』で学んだことについてまとめます。

『Performance Best Practice』のために用意された教材動画はこちらで、

Designing Dashboard for Performance
https://www.youtube.com/watch?v=AgNn-EnEJvo

この動画では、
①パフォーマンスの考え方
②データソース
③計算フィールド
④フィルター
⑤ダッシュボードデザイン
について、約2時間で説明されています。

この記事では主にこの動画の要旨をまとめていきます。

パフォーマンスの考え方

パフォーマンスは、『やりたいこと』『知識』『データ量』『処理能力』の4つで決まる。
一般的に『データ量』と『処理能力』で決まると思われがちだが、『やりたいこと』と『知識』が、適切な『データ量』と『処理能力』を選び取らせてくれるので、前提となる『やりたいこと』『知識』も大事。

『知識』として大事なのは、『どこで何が処理されているか』
DB側で処理されるタスクなのか、Tableau側で処理されるタスクなのか、を明確に理解することが大事。

基本的に、
I.データが遅ければ、Tableauで早くなることはない
II.Desktopで遅ければ、Serverで早くなることはない
III.入れすぎ厳禁(シンプルに)

Tableauでは、Desktopでの操作内容の『パフォーマンスの記録』をワークブックとしてアウトプットする機能があるので、それを見て、時間が掛かっているタスクを特定することが出来る。

データソース

データ量とパフォーマンスのジレンマ:
データは多ければ多いほどたくさんのことを知ることが出来るが、データは多ければ多いほど遅くなる(flowに乗れなくなる)
そのため、ベストな塩梅を見つけていく必要がある

★以下は、パフォーマンスが悪かった場合(遅かった場合)の対処方法
・対象データの件数を確認する
 桁数が多い場合は集計して減らしたり、フィルターを使って件数を減らす
 (抽出フィルター、データソースフィルターが有効)
・リレーショナルデータベースの場合:
 インデックスやパーティショニングを活用する
 ディメンション項目ではNullを避ける
 (Null値を無くしてインデックス効果を向上させる)
 DB側で集計データをテーブルとして事前に準備する
 (Tableauでの複雑な計算フィールドを回避するために、DBに必要な値をテーブルに持たせておく)
・複数テーブルの結合について:
 同じDBであれば結合が、粒度の違うデータ(例えば売上と在庫など)の場合であればブレンドが向いている
・結合はDB、ブレンディングとクロスデータベース結合はTableauで処理される(クロスデータベース結合のときは、抽出するのがベストプラクティス)
・『参照整合性の仮定』を設定することでクエリパフォーマンスを向上させることが出来る(ただし、ビューで使う項目が1つのテーブルだけを対象とするケースでのみ使える。データメニューから設定する。)
・接続方法を抽出にするか、ライブにするかはケースバイケース
・抽出のパフォーマンスに影響するのは、
  行数
  列数
  データ濃度(カーディナリティ、ディメンションメンバーの数)
  ディメンションvsメジャー
・抽出の際は、『表示されているディメンションでデータを集計』や『使用していないフィールドを非表示』の機能を使うと、抽出を高速化出来る

計算フィールド

・計算の種類
 DB側で処理される計算:行レベル計算と集計計算
 Tableau側で処理される計算:表計算
 ☆行レベル計算と集計計算は分けて計算フィールドを作った方が良い
 ☆行レベル計算はDBチューニングでパフォーマンスが改善しやすい
・ネイティブ機能は計算フィールドより速いことが多い
 例)メジャー値のカテゴリ化はビンを使った方が処理が速いことが多い
・データ型はパフォーマンスへの影響が大きい
 ☆整数>ブール値>文字
・ロジック計算にはブーリアンを使った方が速い
・文字の検索は、ワイルドカード照合>CONTAINS()>FINDS() の順で速い
・パラメータも文字列で扱うよりも数値にした方が処理が速い
 ☆パラメータの設定は数値で行い、数値を計算式で使うようにすると良い
・日付計算においても、文字列は非効率なので日付型もしくは数値型を使う
・ロジック計算:'ELSE IF'  vs 'ELSEIF'
 ☆スペースが入ると次のIF文として集計される
 ☆スペースを入れないと、一つのIF文として集計される
 ☆何度も同じ判定式を書かないようにする(まとめる)

フィルター

タブロー側が要因で重くなっている場合は、フィルターを改善すると良くなるケースが多い
・ディメンションフィルター
 不連続フィルターより連続フィルター(範囲フィルター)の方が速い
・日付フィルター
 相対日付>連続日付>不連続日付の順で速い
・クイックフィルター:
 項目が表示されたクイックフィルターは遅い
 項目がデータに依存しないクイックフィルターは速い
・ダッシュボード上のクイックフィルター
 大量のクイックフィルターは遅くなる原因
 クイックフィルターの代わりにGuided Analyticsを活用する
 ☆異なるディメンションレベルで複数のシートを作る
 ☆フィルターアクションを活用する
・クイックフィルターの代わりに、フィルターアクションやパラメータを活用するとパフォーマンスが改善する
・フィルターの順序
 ①抽出フィルター
 ②データソースフィルター
 ③コンテキストフィルター
 ④FIXED
 ⑤セットフィルター
 ⑥ディメンションフィルター
 ⑦EXCLUDE/INCLUDE
 ⑧メジャーフィルター
 ⑨表計算フィルター

ダッシュボードデザイン

・ビュー(シート)のベストプラクティス:
 必要なものを取得・表示する(不要なものを外す)
 行列の少ないマーク表示は表形式のものより表示が速い
 不要な地理的役割は設定しない
 等、最後の整理をきちんとする
・ダッシュボードのベストプラクティス:
 シートやクイックフィルターを最小限に絞る
 タブを非表示にする
 フィルターアクションの”「すべての値」を除外”する
・Tableauが向いていること:
 ビジュアル・インタラクティブ・定期的に使う
・Tableauが向いていないこと:
 複雑なクロス集計・Excelレポートの完全置換
☆一目見て分かることが大切
 一画面に重要な情報が分かりやすく見られるようになっていることが大事

最後に

Tableauのパフォーマンスを良くする:表示を速くするためのTips盛りだくさんの回でした。
この動画の元になったというホワイトペーパーも事前に読んだのですが、やはり動画のKTさんの説明はより丁寧で分かりやすかったです。
ホワイトペーパー:
https://www.tableau.com/ja-jp/learn/whitepapers/designing-efficient-workbooks

データソース・計算フィールド・ダッシュボードデザインについては、可能な限り速くする方法を選択していきたいと思いました。
ただ、悩ましいのがフィルターです。。
ユーザー側からフィルターを追加するように要望を受けることが多いので、使っていなさそうなものからそっと外していく他ないのかなと思っています。

いいなと思ったら応援しよう!