【Tableau】DATASaber:Performance Best Practice(Ord7)解説

はじめによんでください。 kaodora.hatenablog.com

f:id:kaodora:20210104095612j:plain

全部書いてから気づいたのですが、内容盛り沢山すぎました!今後分けるか加筆するか何かしらしたいと思います。

パフォーマンスの考え方

どうしてパフォーマンスが大切か。

  • フローが途切れる
  • 本当のタスクを忘れる
  • 答えを得るのに時間がかかる
  • Fast workbook=Happy users
  • 似たようなワークブックを量産せずに済む
  • イライラする
    f:id:kaodora:20210104101447p:plain

パフォーマンスを決める要素
f:id:kaodora:20210104102642j:plain

処理する場所
f:id:kaodora:20210104104701j:plain

ベストプラクティス

  1. データが遅ければ、Tableauで早くなることはない
  2. Desktopで遅ければ、Serverで早くなることはない
  3. 入れすぎ厳禁(シンプルに)

今まではTableauが気持ちを汲み取ってくれたが
これからはTableauの気持ちを汲み取る!

f:id:kaodora:20210104105717j:plain
Tableauの気持ちを聞く:パフォーマンス記録
ヘルプ→設定とパフォーマンス→パフォーマンスの記録を開始→(パフォーマンスの記録を停止)

f:id:kaodora:20210104110041p:plain

f:id:kaodora:20210104110209p:plain

データソース

  データ量とパフォーマンスのジレンマ
f:id:kaodora:20210104111352j:plain
  対象データの件数

・レコード数
 ・行数が多いvs集計された行数が少ない
 ・フィルターを使用し、件数を削減(抽出フィルター、データソースフィルター)

  リレーショナル・データベース

・インデックスとパーティショニングは有効
・インデックス
 ・表の結合キーの列
 ・フィルターで使用される例
・パーティショニング
 ・ディメンション項目

  NULL

・ディメンション項目ではNULLを避ける
・NULLをなくしてインデックス効果を向上

  DB側でテーブルを準備

・集計データを事前準備
・Tableauでの複雑な計算フィールドを回避するために、DB側に必要な値をテーブルに持たせておく

  結合vsブレンディング

・結合
 ・(特殊な事情でなければ)同じデータベースであれば、表の結合が望ましい
 ・インデックスを有効利用
 ・1本のクエリ
ブレンド
 ・レコード数が多く、表の結合に適さない場合
 ・集計ビュー
・結合&クロスデータベース結合
 ・ファクト(トランザクション)テーブルとマスタテーブルの結合
・ブレンディング
  ・多対多リレーションシップなどでJOINした際に値が合わないデータを結合

  参照整合性の仮定

・ビューで使用している項目が1つのテーブルだけを対象とするケース
・「参照整合性の仮定」を設定することでクエリパフォーマンスを向上
・データメニューから設定

  抽出vsライブ接続

・データエンジンの性能は相対的なもの
✔︎データエンジンが比較的速いケース
 最適化されていないデータベース
 PCファイル形式のデータソース
✔︎データエンジンが比較的遅いケース
 高速マシーンのクラスタ

  データの抽出

・抽出のパフォーマンスの影響する原因
 ・行数
 ・列数(抽出ファイル作成時に影響)
 ・データ濃度(=ガーディナリティ、ディメンションメンバーの数)
 ・ディメンションvsメジャー

  ★集計された抽出

・集計された抽出を集計分析に使用
 ・DWHから負荷分散
 ・明細データはDWHに保持し、ライブ接続
・抽出を高速化
 ・表示単位に集計
 ・不要なディメンションフィルター
 ・使用していないフィールドを非表示

  計算

・行レベル計算と集計計算
 ・データベース側で計算処理
 ・行レベル計算はスケーラビリティが高い
  ・DBチューニング施策が効果を出しやすい
・行レベル計算と集計計算の分割
 ・行レベル計算を1つの計算フィールドに
 ・集計計算を2つ目の計算フィールドに
表計算
 ・クエリ結果を受け取り、Tableauが計算処理
 ・計算フィールドよりもTableauの計算負荷が高い

  計算フィールドvsネイティブ機能

・ネイティブ機能は計算フィールドよりも速い事が多い
 ・ディメンションメンバーのグルーピング→グループが有効
 ・ディメンションメンバーの名前の変更→別名の変更
 ・メジャー値のカテゴリ化→ビンが有効

  ★計算フィールド

・データ型はパフォーマンスの影響が大きい
  整数f:id:kaodora:20210104114656p:plain< ブールf:id:kaodora:20210104114714p:plain< 文字列f:id:kaodora:20210104114735p:plain

・ロジック計算にはブーリアンを使用する
 ・悪い例
 IF[DATE]=TODAY() THEN "TODAY" ELSE "TODAY" END
 ・良い例
 [DATE]=TODAY()
・文字の検索
 ・CONTAINTS()はFIND()より速い
 ・ワイルドカード照合はCONTAINTS()より速い

  計算フィールドで読むパラメーター

・条件式で参照するパラメーター
 ・表示名を利用
 ・整数として計算ロジックで参照

f:id:kaodora:20210104130836p:plain → f:id:kaodora:20210104130714p:plain

  日付計算 

そもそもデータ型を日付に変えればいい!文字型への変換は非効率
 ・悪い例
 DATE(LEFT(STR([YYYYMMDD],4))+"-"+MID(STR[YYYYMMDD],4,2)0+
    "-"+RIGHT(STR([YYYYMMDD],2)))
・数値型とDATEADD()の組み合わせ
 ・良い例
 DATEADD('DAY',[YYYYMMDD]%100-   1,DATEADD('MONTH',INT([YYYYMMDD]%10000)/100)-1,DATEADD('YEAR',INT([YYYYMMDD])/10000)-1900,#1900-01-01#)
・日付関数
NOW() システムタイムスタンプ
TODAY() システム日付

  ロジック関数

・ELSEIF!=ELSE IF
  IF [REGION]="EAST" AND [CUSTOMER SEGMENT]
  ="CONSUMER" THEN "EAST-CONSUMER"
  ELSE IF [REGION]="EAST" AND [CONSUMER SEGMENT]
  <>"CONSUMER" THEN "EAST-ALL OTHERS"
  END
  END
・改善例
  IF [REGION]="EAST" AND [CONSUMER SEGMENT]
  ="CONSUMER" THEN "EAST-CONSUMER"
  ELSEIF [REGION]="EAST" AND [CONSUMER SEGMENT]
  <>"CONSUMER" THEN "EAST-ALL OTHERS"
  END
・更に改善
  IF [REGION]="EAST" THEN
  IF [CONSUMER SEGMENT]="CONSUMER"
  THEN "EAST-CONSUMER" ELSE "EAST-ALL OTHERS"
  END
  END

フィルター

  ディメンションフィルター

不連続フィルターフィルターは遅い
 ・TableauはDBにクエリを発行し、全てのディメンションを取得しにいく
範囲(連続)フィルターは速い
 ・大量の不連続の値を取り込むより速い
 ・データの濃度(ガーディナリティ*1列に入っている値の種類)が高い場合、
  範囲フィルターの方が速い
・保持・除外フィルターは遅い
 ・複雑なWHERE句
・インデックスやパーティーションが有効に作用する

  日付フィルター

不連続日付
 ・ひとつひとつ取得しなければならないのでクエリ結果が遅い
連続日付の範囲指定
  ・範囲で取得するのでクエリ結果が速い
相対日付が更に速い(今日から1年前など)

  クイックフィルター

・項目が表示されたクイックフィルターは遅い
 ・表示する必要のある項目は全て取得しなければならない
 ・複数の値(ドロップダウン)
 ・単一の値(ドロップダウン)
 ・数値フィルター
 ・範囲日付フィルター
・項目がデータに依存しないクイックフィルターは速い
 ・フィルターのための項目を探す必要がない
 ・複数の値(カスタムリスト)
 ・ワイルドカード照合
 ・相対日付フィルター
 ・期間を参照フィルター

  クイックフィルターの表示項目

・2種のクイックフィルター表示方法
 ・データベース内のすべての値
 ・他のフィルターが変更されたとしても影響されない 
・関連値のみ
 ・他のフィルターが関連してくる
⇨パフォーマンスvs ビジュアル/ナビゲーション
 トレードオフの関係!!

  ダッシュボードのフィルター

・大量のクイックフィルターは遅い原因
 ・たくさんのディメンションリストを取得しなければならない
・クイックフィルターの代わりにGuided Analyticsを活用する
 ・異なるディメンションレベルで複数のシートを作る
・フィルターアクションを活用する

  クイックフィルターの代わりに・・・

フィルターアクションを活用する!
メリット
 ・複数項目選択をサポート
 ・選択項目はデータに応じてダイナミックに変動
 ・データソース間を跨いでフィルターできる(最近クイックフィルターもできる・・)
 ・フィルター用のソースシートからもインサイトを得られる
デメリット
 ・設定がちょっと難しい
 ・UIがクイックフィルターやパラメーターの感じとちょっと違う
 ・ソースシートはデータソースからクエリされる必要がある

パラメーターを活用
メリット
 ・フィルター項目表示用のクエリが不要
 ・データソース間を跨いでフィルターできる(最近クイックフィルターもできる・・)
デメリット
 ・単一項目のみしか選択できない
 ・パラメーター+計算フィールド=複雑になりがち

  ★フィルターの順序

f:id:kaodora:20201221203848p:plain

ダッシュボードデザイン

  ビュー(=シート)

・本当に必要なものだけを取得・表示する
 ・不要な"詳細"を外す
・チャート vs クロス集計
 ・行列の少ないマーク表示は表形式のものより早く表示できる
  ・テキストテーブルを描画するには大量のメモリが必要
 ・詳細なクロス集計を表示するにはGuided Analysisを使うこと
・不当な地理的役割は設定しない
 ・生成された緯度経度を参照する時間を省く

  ダッシュボード

・シートやクイックフィルターを少なくする
 ・1シートにつき少なくとも1クエリ
 ・1クイックフィルターにつき少なくとも1クエリ
・タブを非表示にする(特にServerの場合)
 ・タブの表示されているビューはすべてプロセスが走る
  ・タブを表示するためにワークブックの構造を把握するプロセスが走る
 ・タブを減らすとパフォーマンスが上がる
  ・次のパラメーターを試してみる':tabs=no'
・フィルターアクションの"すべての値を除外"
 ・すべてのデータを取得する重たいクエリを避ける
・サイズを固定したダッシュボード
 ・異なるウインドウサイズで毎回描画しなければならない
  ・Viz QL Server はユーザーごとにレンダリングを行う
 ・"自動"はキャッシュヒット率が低い
  ・(それにそもそもデザインに問題もある)

Tableauの向き/不向き

f:id:kaodora:20210104142538j:plain