Performance Best Practice(Ord7)

Ord7

パフォーマンスについて考える!

 

〇なぜパフォーマンスが大事なのか

 

 
〇パフォーマンスを決める要素

 

 
〇誰が何を処理しているかが重要

⇒どこで処理しているかが分かれば、パフォーマンスが悪いときすぐに原因が分かる

 ex)データが重い原因がマークの量であるのに、DBを変えても意味がない

 

用語の確認

  • クエリの実行:データベースからデータの抽出・操作をしている

  • レンダリング:データを処理または演算することで画像を表示させること

 

〇ベストプラクティス
  • データが遅ければ、タブローで早くなることはない
  • DeskTopで遅ければ、Saverで早くなることはない                        ⇒Saverは基本的に同時に色んな仕事をしているため、難しい
  • 入れすぎ注意(シンプルに)

パフォーマンスについて考えているのであれば、Tableauの気持ちを汲み取っていく

 

〇タブローの気持ちを聞く:パフォーマンス記録
  • 何が起こっているのか?何に時間がかかっているのか?                 ⇒サーバーパフォーマンスビューを確認
  • タブロー画面での見方                                               

    ヘルプ→設定とパフォーマンス→パフォーマンスの記録を開始→色々操作してみる→パフォーマンスの停止

     

    ⇒ログを取得することで、何に時間がかかっているかが分かる

 

〇データ量とパフォーマンスのジレンマ

データは多ければ多いほどたくさんのことを知ることが出来る

            VS

データは多ければ多いほど遅くなる(=Floeに乗れない)

⇒最善のバランスをどう見つけていくかが重要

 

〇対象データの特徴

レコード数

⇒行数が多いvs集計され行数が少ない

フィルターを使用し、件数を削減

  • 抽出フィルター
  • データソースフィルター
 
〇パフォーマンスが悪いときにチェックする項目

1.レコード数:今の環境で扱えるくらいの数か

【対処策】

  • 集計し行数を減らす
  • フィルターを使用し件数を減らす(抽出フィルター、データソースフィルター)                               ※Tableauでは普通でメンションフィルターでは件数は減っていないので注意

【The Query Pipeline】

 

2.リレーショナル・データベース(リレーショナル・データベースが元データの時)

【対処策】

  • インデックス
  • パーティショニング

【NULL】

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

【DB側でテーブルを準備】

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

【結合】

  • (特殊な事情でなければ)同じデータベースであれば、表の結合が望ましい

  • インデックスを有効利用

  • 1本のクエリ                                    ⇒1つのテーブルだったら基本的には結合を使う

ブレンド

  • レコード数が多く、表の結合に適さない場合
  • 集計ビュー

【結合&クロスデータベースの結合】

【ブレンディング】

  • 多対多リレーションシップなどJoinした際に値が合わないデータを結合

 

〇結合vsブレンディングvsクロスデータベース結合

 

〇抽出VSライブ接続

⇒抽出、ライブ接続のどちらが速いかはケースバイケース

  • データの抽出のパフォーマンスに影響する要因                     -行数                                   -列数(抽出ファイル作成時に影響)                       -データ濃度(=カーディナリティ。ディメンションメンバーの数)                                ⇒細かいかどうか
〇計算

1.行レベル計算と集計計算

  • データベース側で計算処理
  • 行レベル計算はスケーラビリティが高い                         -DBチューニング施策が効果を出しやすい

2.行レベル計算と集計計算を分割

  • 行レベル計算を1つの計算フィールドに
  • 集計計算を2つ目の計算フィールドに

3.表計算

  • クエリ結果を受け取り、Tableauが計算処理
  • 計算フィールドよりもTableauの計算負荷が高い

 

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

  • ネイティブ機能は計算フィールドより速いことが多い                       -ディメンションメンバーのグルーピング⇒グループが有効
  • ディメンションメンバーの変更                         ⇒別名の編集が有効
  • メジャー値のカテゴリ化                                -ビンの有効
〇計算フィールド
  • データ型はパフォーマンスへの影響が大きい                              -整数はプールより速い                                -整数・プールは文字よりも速い

整数>プール>文字列の順で速い

  • 特にロジック計算はIF文ではなく、ブーリアン(プール値)を使用すると速い  

 

〇日付の計算

日付型への変換

  • 文字型への変換は非効率
  • 数値型とDATEADD()の組み合わせ
  • 文字型を右クリックして日付型に直接変えればよい
  • 8桁の数字は基本的に日付型に変更できるが、もしNULL表示になった場合は「DATEPARSE」関数を使用

日付関数

  • NOW():システムタイムスタンプ
  • TODAT():システムスタンプ

〇フィルター(日付)

  • 不連続フィルターは遅い                            -TableauはDBにクエリを発行し、すべてのディメンションを取得しにくい
  • 範囲(連続)フィルターは速い                          -頭とお尻だけあればいいから、範囲の中に何があるかは関係ないから速い                                          -大量の不連続値を取り込むと速い
  • 保持・除外フィルターは遅い

☆日付も同じ

  • 相対日付はさらに速い 

 

〇フィルター(クリック)

  • 項目が表示されたクイックフィルターは遅い                                     (ドロップダウン、数値、範囲日付)                                         ⇒表示する項目をすべて取得(探す)必要があるため
  • 項目がデータに依存しないクイックフィルターは速い                                                          (カスタムリスト、ワイルドカード、相対日付)                                ⇒フィルターのために表示する項目を探す必要がないため

 

〇 ダッシュボード上のクリックフィルター

  • 大量のクイックフィルターは遅い原因                       ⇒たくさんのディメンションリストを取得しなければならない

【対処策】

  • 異なるディメンションレベルで複数シートを作る                        ⇒フィルターアクションを活用する                              -クイックフィルターでリストから選択ではなく、シート上で直接選択できるようにする
  • パラメーターを活用する   
ダッシュボード
  • シートやクイックフィルターを少なくする                      -1シートにつき少なくとも1クエリ
  • タブを非表示にする(特にSarverの場合)                        -タブの表示されているビューはすべてプロセスが走る                  ⇒タブを非表示にするためにワークブックの構造を把握するプロセス
  • フィルターアクション「すべて値を除外」を活用
  • ダッシュボードサイズは固定する

シートを作るとき・・・

⇒本当に必要なものだけを取得、表示する

 (マークカードに不要な詳細を入れない)

⇒不要な地理的役割は設定しない

 

〇Tableauの向き/不向き