Ord10まで行った今こそ振り返り!~Ord7編~
お久しぶり(?)です。先週はコミュニティポイントのための活動で忙しく一切タッチができなかった復習ですが、最終試練も間近に迫っており復習もせねば、、ということでアメリカから執筆しております。
Ord7は初めて解いたときは「ふーん」という感じだったのですが、Cloudを利用した時、その重要さを思い知ることになりました。ダッシュボードの処理効率に気を付けないと、見る側の気力を削ぎますね。
なぜパフォーマンスが重要なのか
パフォーマンスの悪さはすなわち分析の芽を摘むことになるからです。
パフォーマンスを決める4要素のうち、処理能力以外は基本作り手の努力になるので、お金をかける前に「無駄がないか」「Tableauに負荷をかけていないか」に注意するべきです
Tableauの一連の操作はどこで行われているのか?
一個一個の操作の場所を把握するよりも、DBとTableauの役割分担を理解する方が覚えやすいと思います。基本的にTableauはクエリ照会結果によって渡されたViewに対して操作するもので、クエリの実行やView(結合された結果のViewも含めて)、集計や合計の計算はDB側で行います。
ややこしいですが表計算はクエリの実行結果に対して行うもので、Tableau側の操作になります。
操作が重い時の注意点…
そもそもデータが重たければTableauではどうしようもない!
Tableau ServerがTableau Desktopより速いとは限らない!Serverも色んなワークブックを同時にレンダリングしている!
一つのワークブックにシートを詰め込み過ぎない!1用途1ブック!連動させたければURLアクションで飛ばそう!
パフォーマンスを見る方法
ダッシュボードが重いなと感じるとき、パフォーマンスを見ることができます。
データベースとパフォーマンス
そもそもいらないデータを持ってこないようにする
パフォーマンスと分析の幅はトレードオフになっており、データ数が増えれば増える程、より分析の幅は広くなる分パフォーマンスは悪化します。
が、あからさまに要らないデータはそもそも持ってこないようにするべきです。その方法としては
・抽出
・データソースフィルター
これらは根本から要らないデータを削る手法で、普段分析で使うフィルターはディメンションフィルターであり、取ってきたデータに対してみたいものだけ絞っているだけなのでパフォーマンスの改善には繋がりません。
RDB側も整理しておく
取得元となるリレーショナルデータベース側にも工夫の余地があります。
インデックスとパーティショニングを組み合わせて一つのDBを重くしないようにするのも有効です。
・インデックス
・表の結合キーの列
・フィルターで使用される列
・パーティショニング
・ディメンションの項目
・NULLを削っておく
・DB側で集計されたテーブルを事前に準備しておく
複雑な計算フィールドを回避するために必要な情報はテーブルに含める。
DBを結合させる様々な手法
以下混乱を招くので注釈です。結合というワードが複数出ますが、文脈上登場する結合は一般的に一つのデータベースにすること、「結合」はその方法としてインデックス同士で繋ぎ合わせる手法とここでは書き分けています)
・「結合」
同じスキーマ(DB2どうし、Oracleどうし等)であればこれが望ましい。
トランザクションテーブルとマスターテーブルの結合に用いる。
・ブレンディング
売上データと在庫データなど、多対多の粒度が合わないリレーションシップのテーブルが、異なるスキーマ(DB2-Oracleなど)にある場合などに用いる結合。
・クロスデータベース結合
異なるスキーマにあるデータベースのテーブルを「結合」と同じく結合できる。
抽出 vs ライブ接続
抽出接続とライブ接続、どちらが早いかは実はケースバイケースです。
(データエンジンの性能などに依存します)
抽出のパフォーマンスについて
抽出のパフォーマンスには行数や列数が関わってきます。以下手段を取ることで抽出を高速化することができます。
・必要な粒度の表示単位に集計した状態で抽出する
・不要なディメンションメンバーをフィルター
・使用していないフィールドを非表示にする
計算について
・行レベル計算と集計計算
行単位の計算。IF等。データベース側で計算を行っている。
集計計算はAVG、SUMなど各行に対する集計の計算。
行レベル計算を集計計算に内包する際は、行レベル計算は別で計算フィールドとして作成しておくと、別シートでの再利用もできるのでベストプラクティスとされています。
・表計算
クエリ実行結果を受けてTableau側で実施するもののため、計算フィールドと比べてTableau側の処理負荷が高い。
そもそもでなるべく計算フィールドを使わない!
以下の様な操作はいずれもやろうと思えばIF文で実現できたりしますが、デフォルトでTableau側のメニューで実行可能です。Tableau側で最適なクエリを組んでいるので処理効率が良くなるようになっています。
(例1)ディメンションメンバーのグルーピング
⇒ 「グループの作成」
(例2)ディメンションメンバーの名前変更
⇒「別名の編集」
(例3)メジャー値のカテゴリ化
⇒「ビンの作成」
計算フィールドに使うデータ型も効率に関わっている
■処理効率が高い順
整数 > ブール値 > 文字列
ロジックはブール値にすることを意識!
(ブール値ということだけが見たいのなら、、という条件付きな気がしますが…)
悪い例 ⇒ IF[DATE]=TODAY() THEN "TODAY" ELSE "NOT TODAY" END
良い例 ⇒ [DATE] = TODAY()
日付が文字列になっていたら…
データソースの操作でデータ型を文字列から日付型に変えれば、仰々しく計算する必要もない。日付型に変換した結果NULLになるなら、DATEPARSEで形を整えてやればよい(例 DATEPARSE("yyyy年MM月dd日",[日付]))
フィルター
フィルター単位の遅い早い
■ 不連続フィルターは遅い!
行単位(正確にはディメンション単位)でクエリを発行するため重くなる。いちいち間のデータの抜けを加味しなくてはならない。
■ 範囲(連続)フィルターはまだ早い!
間の抜け漏れなど気にせず範囲の両端だけ決まっていれば良いため。
日付のフィルターの遅い早い
■ 不連続フィルターは遅い!
日付も同様、不連続の場合は処理が遅い。
■ 範囲(連続)フィルターはまだ早い!
間の抜け漏れなど気にせず範囲の両端だけ決まっていれば良いため。
■ 相対日付は最も早い!
今日から何年前、など指定するだけで良く、データ不要でクエリを動かせるので最も処理が簡単。他は、範囲など条件の基準になるデータは取ってきてく必要がある。
クイックフィルターの用法・多用に注意!
耳が痛い…。
クイックフィルターは基本的に動作を重くすることに注意です。
クイックフィルターの中でもデータ項目にあるものを使ったフィルター(複数・単一ドロップダウンリスト、範囲の日付等)は遅くなる要因です。
カスタムフィルターやワイルドカード照合など、データ項目にないものを使ったフィルターは早くなります。
なお、クイックフィルターの表示方法は2つあります。
・データベース内のすべての値
⇒ 他のフィルターが変更されたとしても影響を受けない。
・関連値のみ
⇒ 他のフィルターが関わる(カテゴリでフィルターするとサブカテゴリもフィルターされる)
関連する値のみにすれば表示が減って軽くなるかと思いきや、上位のクイックフィルターの下にあるクイックフィルターも実行するクエリが動くので遅くなります。
フィルター"アクション"やパラメータを使いましょう!
クイックフィルターを使うのではなくGuided Analyticsを意識しましょう!
ハイライト⇒クリックすれば絞られる、といったフィルターアクションを活用できます(ただ、Tableauに慣れていない人は画面を押せば動くとかは気づかないかも、ここの案内は大事)
パラメータはデータ項目に依存してないので早くなります。ただし、複数項目を選択はできないです。が、あまり複数同時選択のシーンってないかも…?
フィルターの実行順序について
抽出フィルター
データソースフィルター
コンテキストフィルター
FIXED
セットフィルター
ディメンションフィルター
INCLUDE/EXCLUDE
メジャーフィルター
表計算フィルター
1は大元のデータから、2は1から抜いた処理対象のデータから。3はその上で大前提に適用させたいフィルター。4は3の上で固定させたい条件。
これを受けて、5で集団を確定させ、6でディメンション、8は6のディメンションに対して集計(メジャー)、最後にTableau側の表計算フィルターかなと。
ただし、7はこの位置なのがあまり理解できないです…笑。
ダッシュボード
シートやクイックフィルターはなるべく少なく!
1シートに1クエリが、1クイックフィルターに1クエリが走ります。なるべく削りましょう。
要らないタブは非表示
タブを表示させるためのワークブックの構造を知るためのプロセスが走るため、非表示にしておかないと効率が落ちます(違いを知りたい場合、URLクエリストリングに:tabs=noと入れると比較できます
フィルターアクションの"すべての値を除外"を使う
⇒ 全てのデータを取得する重たいクエリの実行を避ける。
ダッシュボードのサイズは固定で!
自動だと異なるウィンドウサイズで毎回描画するためのレンダリングが走るので重くなる。Vizやマジョリティに合わせたサイズをしっかり固定しておきましょう。
総論
パフォーマンスが良いVizは無駄がなく、結果として見る側も見やすいVizになる!!