【Tableau】DATASaber:Performance Best Practice(Ord7)解説
はじめによんでください。 kaodora.hatenablog.com
全部書いてから気づいたのですが、内容盛り沢山すぎました!今後分けるか加筆するか何かしらしたいと思います。
パフォーマンスの考え方
どうしてパフォーマンスが大切か。
- フローが途切れる
- 本当のタスクを忘れる
- 答えを得るのに時間がかかる
- Fast workbook=Happy users
- 似たようなワークブックを量産せずに済む
- イライラする
パフォーマンスを決める要素
処理する場所
ベストプラクティス
- データが遅ければ、Tableauで早くなることはない
- Desktopで遅ければ、Serverで早くなることはない
- 入れすぎ厳禁(シンプルに)
今まではTableauが気持ちを汲み取ってくれたが
これからはTableauの気持ちを汲み取る!
Tableauの気持ちを聞く:パフォーマンス記録
ヘルプ→設定とパフォーマンス→パフォーマンスの記録を開始→(パフォーマンスの記録を停止)
データソース
データ量とパフォーマンスのジレンマ
対象データの件数
・レコード数
・行数が多いvs集計された行数が少ない
・フィルターを使用し、件数を削減(抽出フィルター、データソースフィルター)
リレーショナル・データベース
・インデックスとパーティショニングは有効
・インデックス
・表の結合キーの列
・フィルターで使用される例
・パーティショニング
・ディメンション項目
NULL
・ディメンション項目ではNULLを避ける
・NULLをなくしてインデックス効果を向上
DB側でテーブルを準備
・集計データを事前準備
・Tableauでの複雑な計算フィールドを回避するために、DB側に必要な値をテーブルに持たせておく
結合vsブレンディング
・結合
・(特殊な事情でなければ)同じデータベースであれば、表の結合が望ましい
・インデックスを有効利用
・1本のクエリ
・ブレンド
・レコード数が多く、表の結合に適さない場合
・集計ビュー
・結合&クロスデータベース結合
・ファクト(トランザクション)テーブルとマスタテーブルの結合
・ブレンディング
・多対多リレーションシップなどでJOINした際に値が合わないデータを結合
参照整合性の仮定
・ビューで使用している項目が1つのテーブルだけを対象とするケース
・「参照整合性の仮定」を設定することでクエリパフォーマンスを向上
・データメニューから設定
抽出vsライブ接続
・データエンジンの性能は相対的なもの
✔︎データエンジンが比較的速いケース
最適化されていないデータベース
PCファイル形式のデータソース
✔︎データエンジンが比較的遅いケース
高速マシーンのクラスター
データの抽出
・抽出のパフォーマンスの影響する原因
・行数
・列数(抽出ファイル作成時に影響)
・データ濃度(=ガーディナリティ、ディメンションメンバーの数)
・ディメンションvsメジャー
★集計された抽出
・集計された抽出を集計分析に使用
・DWHから負荷分散
・明細データはDWHに保持し、ライブ接続
・抽出を高速化
・表示単位に集計
・不要なディメンションフィルター
・使用していないフィールドを非表示
計算
・行レベル計算と集計計算
・データベース側で計算処理
・行レベル計算はスケーラビリティが高い
・DBチューニング施策が効果を出しやすい
・行レベル計算と集計計算の分割
・行レベル計算を1つの計算フィールドに
・集計計算を2つ目の計算フィールドに
・表計算
・クエリ結果を受け取り、Tableauが計算処理
・計算フィールドよりもTableauの計算負荷が高い
計算フィールドvsネイティブ機能
・ネイティブ機能は計算フィールドよりも速い事が多い
・ディメンションメンバーのグルーピング→グループが有効
・ディメンションメンバーの名前の変更→別名の変更
・メジャー値のカテゴリ化→ビンが有効
★計算フィールド
・データ型はパフォーマンスの影響が大きい
整数< ブール< 文字列
・ロジック計算にはブーリアンを使用する
・悪い例
IF[DATE]=TODAY() THEN "TODAY" ELSE "TODAY" END
・良い例
[DATE]=TODAY()
・文字の検索
・CONTAINTS()はFIND()より速い
・ワイルドカード照合はCONTAINTS()より速い
計算フィールドで読むパラメーター
・条件式で参照するパラメーター
・表示名を利用
・整数として計算ロジックで参照
→
日付計算
そもそもデータ型を日付に変えればいい!文字型への変換は非効率
・悪い例
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がクイックフィルターやパラメーターの感じとちょっと違う
・ソースシートはデータソースからクエリされる必要がある
・パラメーターを活用
メリット
・フィルター項目表示用のクエリが不要
・データソース間を跨いでフィルターできる(最近クイックフィルターもできる・・)
デメリット
・単一項目のみしか選択できない
・パラメーター+計算フィールド=複雑になりがち
★フィルターの順序
ダッシュボードデザイン
ビュー(=シート)
・本当に必要なものだけを取得・表示する
・不要な"詳細"を外す
・チャート vs クロス集計
・行列の少ないマーク表示は表形式のものより早く表示できる
・テキストテーブルを描画するには大量のメモリが必要
・詳細なクロス集計を表示するにはGuided Analysisを使うこと
・不当な地理的役割は設定しない
・生成された緯度経度を参照する時間を省く
ダッシュボード
・シートやクイックフィルターを少なくする
・1シートにつき少なくとも1クエリ
・1クイックフィルターにつき少なくとも1クエリ
・タブを非表示にする(特にServerの場合)
・タブの表示されているビューはすべてプロセスが走る
・タブを表示するためにワークブックの構造を把握するプロセスが走る
・タブを減らすとパフォーマンスが上がる
・次のパラメーターを試してみる':tabs=no'
・フィルターアクションの"すべての値を除外"
・すべてのデータを取得する重たいクエリを避ける
・サイズを固定したダッシュボード
・異なるウインドウサイズで毎回描画しなければならない
・Viz QL Server はユーザーごとにレンダリングを行う
・"自動"はキャッシュヒット率が低い
・(それにそもそもデザインに問題もある)
Tableauの向き/不向き