【Tableau】PerformanceのBest Practice②～データソース～

前回の投稿の前置きでもお話ししましたが
Tableauはセルフ分析に優れており、データアナリストでなくてもビジュアライズを実現する事が可能です。　
そのため色んな立場の人がTableauに触れる可能性があるからこそ、パフォーマンスの知識を備え、皆が使いやすい環境を築いていくのが大切です。
今一度**「自分や周囲の人が作っているダッシュボードはPerformanceのBest Practiceを理解して作成できているか」**を考え、改善していくためのきっかけになれば嬉しいです。

今回は、実践で使えるデータソースのパフォーマンス知識についてお伝えしていきます。

**■performance関連の投稿は3部構成（予定）**
・**[【Tableau】PerformanceのBest Practice①～基本要素を知る～](https://qiita.com/t_misaki1029/items/b473b4fdcbafeab0a2ab#form　"【Tableau】PerformanceのBest Practice①～基本要素を知る～")**
**・【Tableau】PerformanceのBest Practice②～データソース～　　←今回ここ！**
**[・【Tableau】PerformanceのBest Practice③～計算フィールド～](https://qiita.com/t_misaki1029/items/91f75da7c156fdcbd82e#form　"・【Tableau】PerformanceのBest Practice③～計算フィールド～")**

まだPerformanceのBest Practice①～基本要素を知る～を読んでいない方は、よければ[こちら](https://qiita.com/t_misaki1029/items/b473b4fdcbafeab0a2ab#form　"【Tableau】PerformanceのBest Practice①～基本要素を知る～")から是非読んでみてください。
→ここでは**パフォーマンスについて知っていく・考えていく為に、まずは知っておいて欲しい情報**をお伝えしてます。

またTableauのバージョンが古いものを利用している場合、オプションが対応されていない場合があります。
ご了承ください。（投稿者は2020.2を利用していますので、それ以降のバージョンであれば問題ないと思います）

#■データソースを理解する
私たちは分析に扱うデータ量が多ければ、沢山の事を分析し知ることができます。
しかしながらデータソースはデータ量が多ければ多いほど遅くなっていきます。
そのため、我々は丁度いい塩梅を常に考え対応していかなければいけません。

では何を優先して考えていけば、パフォーマンス向上に繋がっていくのかを1つ1つ確認していきましょう。

###対象データの件数を知る
レコード数がどれだけあって、扱う対象として妥当であるのかという事をまずは確認しましょう。

対応としては以下の方法があります。
■ロジックで調整
　・抽出範囲を限定する
　・集計して行数を少なくする

■フィルターを使用し、行数を削減
①抽出フィルター※抽出可/ライブ接続不可
　このフィルター設定を行うことで、**利用しないデータを除外**することが出来ます。
　シートにデータを読み込ませる前にデータの抽出範囲を制限することができるのでパフォーマンスが向上します。
![抽出フィルター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/b23e301b-7d1c-6458-35be-5a73fd096caf.png)


さらに抽出フィルターの便利な機能を二つご紹介します。
★集計機能（赤枠）
★フィールド非表示機能（水色枠）
![集計ブログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/ff68fa0c-2d8b-8ca7-4d04-da2263412267.png)

★集計機能（赤枠）
　まず、使っていないディメンションを、シート上で非表示にします。
　その後、このチェックボックスを選択すると**非表示を抜いた粒度で集計**してくれます。
　※シート上での非表示にする作業は、「▼」押下し使用していないフィールドをすべて非表示でもOK↓
![集計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/36bc3022-08ba-2ea3-9351-716323bcf392.png)

★フィールド非表示機能（水色枠）
**ダッシュボードが完成した後**に、このボタンを押下することで**不要なフィールドを自動で除外**してくれます。

集計機能・フィールド非表示機能ともに大変便利なのですが注意点があります。
対象のダッシュボードをその後、他の誰かが編集する場合や中身の抽出条件を確認する可能性がある場合。
カスタムSQLだったらロジックを見る事で確実に抽出条件を確認する事が出来ますが、このオプション自体を知らない人は見逃してしまう可能性があります。
そのため、業務上利用する場合には、この知識をみんな（チーム内だったり、その領域関係者だったり）が知っている必要があります。

②データソースフィルター※抽出・ライブ接続可
　データ抽出フィルターとの違いとしては**試行錯誤をするためのフィルター**と覚えておくと良いです。
　シートに読み込んだ後でも、シート上で内容を変更することが可能です。
　ex )元データには10年分のデータが入っているけど、
　それだと確認するには遅そうなのでとりあえず利用するのは直近3年分だけ見たい時など◎
![データソースフィルター.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/7c3fa3cf-e7a7-5dbd-cb1d-49bd956f1da1.png)


###元データがリレーショル・データベースの場合
インデックスとパーティションは有効といわれています。
対応として具体的には以下の方法があります。

■インデックス
　・表の結合キーの列
　・フィルターで使用される列

■パーティション
　・ディメンション項目を使うと良い(ライブ接続の場合のみ)

■ディメンション項目でNULLは避ける

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

###データ接続方法
データ接続方法は複数種類があるので、以下の図を参考にしてください。
![データ接続方法.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/543eca77-bb43-e165-3a89-df77da7c8d1f.png)

リレーションシップはTableauが適切な結合を考えてくれる便利な接続方法です。
比較的新しい機能なのでここで初めて知った方は是非一度つかってみてください。（バージョンが古すぎると対応されていないです）

そして、横に繋ぐ方法は**リレーションシップ**の他に**結合、クロスデータベース結合、データブレンド**があるのですが、用途がそれぞれ異なるのでパフォーマンスとしてすべての種類を比較するには難しいです。
そのため、今回は比較しやすい結合とデータブレンドに注目します。（赤枠部分）

パフォーマンスの速さは結合＞ブレンドです。
ただ、**速さで決めるのではなく用途別で使い分ける必要**があります。

■結合（処理：データベース）
　**同じデータベース**であれば**結合**を活用しましょう。
　オラクルなどのインデックスがある場合にはここで活用すると良いです。

■ブレンド（処理：Tableau）
　**粒度が異なり結合できない場合**には**ブレンド**を活用しましょう。
　レコード数が多い場合には、ある程度の粒度にまとめてブレンドすると良いです。

処理のタイミングは結合はデータベース側、ブレンドはtableau側になります。
なので可能であれば結合を活用し、理由がある場合にはブレンドを使うという流れで判断してください。

###抽出orライブ接続
Tableau公式では素早く簡単な方法は「抽出」と公開しており、抽出＞ライブと言われています。
しかし実際は、利用環境や利用するデータベースによって変わる可能性もあるので、どちらが速いとは一概に断定できません。
そのため、用途をしっかり理解し使い分けていくのが良いです。

■抽出
　・リアルタイムデータを**必要としない場合**

■ライブ
　・リアルタイムデータを**必要とする場合**

あくまで投稿者の現場での体験談なので参考程度に受け取って欲しいのですが、
過去にライブ接続のダッシュボードを同じタイミングで大勢の人がアクセスした事で、障害が発生した事例がありました。
これは利用する環境だったり利用者の数によって変わってくるので、**一概にライブ接続が悪いと言っているわけでは決してありません！**

上記の経緯があり、ライブ接続を利用する場合には以下の確認をお勧めしたいです。
　・一度に多くの人がアクセスする可能性はないか？
　・本当にリアルタイムである必要があるのか？（スケジュール機能で一日に一回更新ではダメ？）

###対象データの内容次第で影響するもの
■行数、列数(カラム)
　→先ほど行数を削減するお話しをしましたが、列数も影響します。

■データ濃度(=ディメンションメンバーの数)

■ディメンションなのかメジャーなのか
　→メジャーの方が早いです。

###「全部気にするの大変だよ！」って人にまずは3つのポイントをお勧め
個人的にまずはこれを活用することをお勧めします。
（現場によって変わってくるとは思うので参考までに）

**■表示単位に事前集計**
　→データべース作成や、DBテーブル作成などの段階で集計し、レコード数を削減しましょう。
　ex ) 必要な粒度で、CAP IDはcountしておくとか◎
　　日時系のカラムは月単位でまとめて集計しておくとか◎(group by等)
　→SQLはあまりいじりたくない、よく分からない場合には
　　今回ご紹介した、抽出フィルターの集計機能を活用しましょう。

**■不要なディメンションを除外**
　→抽出フィルター・データソースフィルターなどを活用しましょう。
　　※シート上のディメンションフィルターではパフォーマンスは早くならないので注意です。

**■使用していないフィールドを非表示**
　→抽出フィルターのフィールド非表示機能をポチっとするだけ！

###おわりに
計算フィールド関連のパフォーマンス知識は以下に投稿しました。
**[・【Tableau】PerformanceのBest Practice③～計算フィールド～](https://qiita.com/t_misaki1029/items/91f75da7c156fdcbd82e#form　"・【Tableau】PerformanceのBest Practice③～計算フィールド～")**