Tableau Desktop: Basic Performance Tipsを読んでみた

2014.11.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon RedshitとTableau Softwareのパフォーマンスチューニング・改善ネタはこれまでも幾つかご紹介して来ましたが、Tableau Desktopのパフォーマンスチューニングで情報を検索してみたところ、Tableauの中の人が書いたと思しき関連資料を発見しました。

当エントリではその資料をざっくりと読みつつ、Tableau Desktopの面からのパフォーマンス改善の策を探ってみたいと思います。

目次

環境

クライアントマシン

  • 32ビットOSよりも64ビットOS
  • メモリは多いほうが良い
  • より良い性能のディスク、帯域幅のバックプレーンのものを選択

まぁ、ドキュメントの冒頭で『基本的な部分だけどこの辺は得てして変更(改善)が難しいとこなんだけどね』と書いているように、『環境面』についてはその根本を指摘するものが多いです。当項の"クライアントマシン"もそのうちの1つ。

しかし、TableauではAmazon Redshiftを筆頭にビッグデータをその分析対象として扱う事も多く、そうなってくると億単位のデータを扱わざるを得なくなって来る局面も出て来るでしょう。データを返す方(DB/DWH等)が速いレスポンスで大量のデータを返してきたとしても、クライアント側の処理性能が乏しいものではその良さも存分に活かす事は出来ません。

Tableau Desktopに必要なスペックは以下に記載されていますが、より快適な操作・大量のデータを扱うのであればより良い環境を整える事をお勧めします。

ネットワーク環境

  • サーバから返される大きな結果セットを扱う場合は、より多くの帯域幅を必要とする

ビッグデータを扱う局面については前項でも触れましたが、当然ながら件数が多くなればその大量データを転送する際の通信量も相当なものになります。以下Amazon Redshiftの場合だと、高スペックのクラスタのI/Oは2〜3GB/sと非常に高性能です。データを受け取る側のネットワーク環境についても、それらを受け止めるだけの環境を用意しておく事が望ましいです。

Tableau Server

  • メモリ量は多いほうが良い
  • ディスクは早いもののほうが良い
  • CPUもより多く、より早いほうが良い

Tableau Serverの言及もされています。こちらについても、Desktop同様、いずれも性能が良いもものにするに越したことはない、という感じですね。要求されるスペックについては以下のドキュメントを参考にしてください。

また、Tableau Serverはその利用規模や頻度によって求められるスペックも変わって来ます。以下ホワイトペーパーにその見積の際の指針がまとめられていますので、是非参考にしてみてください。

ブラウザ

こちらも上記同様、Tableau Serverに関するお話。ドキュメント曰く、同じ条件でアクセスを行った際、以下の結果となった模様。ブラウザ利用の際はこの辺も考慮に入れた方が良さそうです。

  • IE7:11秒
  • Firefox:3秒

また、テーマとは若干逸れますが、Google Chromeの拡張機能でTableau Server(やTableau Public)と連携するものがあるようです(こちらはTableau社からのものでは無く、Information Lab社というところが出しているようです)。Tableau Server/Publicをお使いで興味のある方は是非使ってみてはいかがでしょうか。(以下スクリーンショットはTableau Publicに繋いだ時のもの。ブラウザから所定のビューにアクセス出来る機能を有するようです。)

データベース

アプリケーションチューニング

リレーショナルデータベース環境では、適切にチューニングされたDBインスタンスとアプリケーションで良いパフォーマンス結果を得る事が出来ます。

インデックス

  • テーブル結合に含まれる全ての列にインデックスがあるかを確認。
  • Tableauのフィルタ内で使われる任意の列にインデックスがあるかを確認。
  • 可能な限り全てのテーブルに対してプライマリーキーを確認。
  • 全ての外部キーリレーションシップを明示的に定義。これにより、Tableau整合性チェックの内容の多くをバイパスする事が出来ます。

RDBMS等であれば、上記の対策は有効に働く事でしょう。(※ちなみに、Amazon Redshiftの場合ですとインデックスやプライマリキー等の意味合いがRDBMSとは異なってくるので注意してください。Amazon Redshiftが準拠しているPostgreSQLとの違いについては以下ドキュメント等を御参照ください。)

大量データ対応

テーブルのパーティショニングを検討します。殆どの場合、時間による制約を使わない限り意味があるものになりません。

NULLの扱い

(プログラマと)Tableau DesktopはNULLデータが好きではありません。可能な限り、テーブル上のカラムには明示的にNOT NULL制約を付けましょう。

計算

もし複雑な計算が必要となる場合、Tableauでは、計算を行うDBMSビューを作成する事を検討しましょう。データベース・サーバはデスクトップよりも大抵パワフルです!

サマリーテーブル

大きいデータセットを相手にする場合、事前に集約計算をしておく(サマリーテーブルを作っておく)事を検討しましょう。(注:Tableau Desktopを使用して自動的に集計テーブルを作成する事が出来ます。詳細は『抽出』の項を参照。)

テクニック

自動更新設定をOFFにする

ツールバー下記の位置にあるアイコンで自動更新のON/OFFの切替が行えます。 非常に大きなデータベースにアクセスし、分析の折に色々メジャー・ディメンションを切り替えて操作する際等は都度アクセス処理が走ってしまう事になるので、状況が固まるまでOFFの状態にしておき、DB/DWH等データソースにアクセスする際にONにする等の対応を行う事をお勧めします。

tableau-desktop-autoupdate-off-01

tableau-desktop-autoupdate-off-02

データソースの設定

データソースを作成する際、復数テーブルオプションを可能な限り使用し、カスタムSQLの使用は避けてください。Tableauは復数テーブルを用いた接続を行う際、そのクエリを最適化する事が出来ます。必要最低限のデータソースを使うようにし、未使用のデータソースは削除しましょう。結合用にテーブルをデータソースに追加する際は、[データ]から[データソースの編集]オプションを選択します。(※Tableauはこの時に幾つかの検証手順をスキップしています)

edit-datasource

コンテキストフィルタを関連するデータに追加

この作業を行う事で、抽出よりも高速になります。コンテキストフィルタはワークブックが開かれた時点で自動的にハンドリングされ、データの大半をフィルタリングして絞り込む(フィルタリングする)様なケースで最も効果を発揮します。また、対象データの変更が緩やか、または全く変更が無いディメンションに最も良く作用します。

予めフィルタリングしようとしている、データのサブセット(時系列、地域や顧客など)が分かっている場合は、そのディメンションをコンテキストフィルタに指定しましょう。

フィルタに落とし込んだ要素を右クリックし、[コンテキストに追加]を選択する事で、結果が事前にフィルタリングされるようになり、以前よりも高速になります。

context-filter-01

コンテキストフィルタとなった要素。要素の色がグレーになっています。 context-filter-02

その他関連する情報としては以下を御参照ください。

結合を具体化する為にコンテキストフィルタを追加

『具体化』は全ての結合を事前に計算しておき、クエリ毎に再計算をする必要がない、という事を意味します。このtipsは少々トリッキーです。基本的にコンテキストフィルタは全てのデータを含む形で設定します。ここではディメンションに含まれるメンバーを何も設定せず(none)、除外する(exclude)設定を行います。

context-filter-03

この設定で、データ結合時にパフォーマンスを向上させる事が出来ます。例えば以下ページにあるサンプルデータの『コーヒーチェーン』データソースは2つの結合を含んでいます。上記で設定したコンテキストフィルタを適用する時、Tableauは一時的に非正規化されたテーブルをデータベースに作成します。

これは、結合した3つのテーブルではなく、1つのテーブルに集約された形で構成するという事を意味します。この設定で数倍のパフォーマンス改善を見込めるでしょう。

抽出(Extracts)

Tableauではアーキテクチャを認識する抽出エンジンを使用して非常に高速にアクセス可能な抽出ファイルを作成する事が出来ます。

抽出を作成する際の幾つかテクニックがあります。まずは、データウインドウから、使っていない不要なフィールドを非表示にしておいてください。Tableauは表示されている項目を抽出対象として処理します。不要なフィールドを非表示とする事で抽出ファイルのサイズを減らす事が出来ます。また、Tableauは必要な詳細レベルに集計された抽出を作成する事が出来ます。

tableau-extract

抽出の作成は、[データ]→[データの抽出]メニューから行えます。表示出来るディメンションの集計データを選択し、[使用していないフィールドをすべて非表示]とする事でデータ量を減らす事が出来ます。必要な詳細レベルを維持しながらデータを小さくする事が可能です。また抽出では、月毎等のデータのサブセットとして作成する事も出来ます。

フィルタを使う時の注意

フィルタを使う場合、[除外]オプションの使用は避けてください。[除外]オプションを使用すると、Tableauは選択されたデータを全てスキャンしなければならなくなり、TableauがINDEXを使う機会が無くなってしまうからです。

時間のディメンションでフィルタリングする場合、[個別の日付と時刻]は選択しないでください。このフィルタは利用可能な日付時刻それぞれに対して明示的にクエリを実行してしまいます。

必要であれば、年や月、日のカスケードクイックフィルタを使用して探しているデータを表示するようにしましょう。また、相対日付フィルターは、ブックの編集やTableau Serverへの再パブリッシュの必要がなく、現在の週または月のデータを表示する簡単な方法です。 関連する値のクイックフィルタはとてもリソースを食いますので、必要な部分だけに使用するようにしましょう。

コンテンツ

Tableau Desktopでコンテンツを作成する際、同じ分析を達成する際に他の手法よりもパフォーマンス面で優れているものが存在します。この項ではそれらについて幾つか御紹介。

可能な限り、Boolean値を返す計算式を用いる

標準的なIF THENステートメントは以下の様に2つの値を返します。

IF [Date]= TODAY() then “Today”
ELSE “Not Today”
END

より早い計算式は以下の様になります。

[Date]=Today()

TRUEFALSEの値をが"Today"や"Not Today"にリネームするようなエイリアスを活用しましょう。

別名の設定方法

計算フィールドを新規に作成し、以下の様な計算式を設定しておきます。

tableau-boolean-01

そのまま利用すると、以下の様に真偽値がそのまま表示される形に。

tableau-boolean-02

そこで、要素のプロパティ値を編集し、別名を割り当てる事にします。

tableau-boolean-03

このような形で文字列を設定しておくと...

tableau-boolean-04

以下の様に別の値を表示させる事が可能となります。この辺りは色々な局面で活用出来そうですね。

tableau-boolean-05

グルーピングの代替

アドホックなグルーピングではなく明示的なディメンションのグループメンバーに対して計算フィールドを使う事が出来ます。

Case left([Product 3 - Name], 5)
  When "Xerox" then "Xerox"
  When "Avery" then "Avery"
  When "Canon" then "Canon"
  When "Eldon" then "Eldon"
  else [Product 3 - Name]
end

上記のようなCASE文は同じグループ化を実現するグループ作成よりも早く動作するでしょう。また、もし上記CASE文に一致する新しいプロダクトがあった場合、自動的にグルーピングされるようになります。

論理式を用いる際は『ELSE IF』より『ELSEIF』を用いる

IF文が入れ子になるようなケースでは、ELSE IFよりELSEIFを使うほうがより高速に処理出来ます。

Before:

IF [Region] = "East" and [Customer Segment] = "consumer"
  then "East-Consumer"
Else IF [Region] = "East" and Customer Segment] <>"consumer"
   then "East-All Others"
end

After:

IF [Region] = "East" and [Customer Segment] = "consumer"
  then "East-Consumer"
Elseif [Region] = "East" and [Customer Segment] <>"consumer"
  then "East-All Others"
end

判定を冗長化させない

以下にある計算式は一見完全な様に見えますが、実は冗長な計算が含まれています。

IF [Sales] < 10 Then "Bad"
Elseif [Sales]>= 10 and [Sales] < 30 Then "OK"
Elseif [Sales] >= 30 then "Great"
end

こうする事で、より高速に処理出来るようになります。

IF [Sales] < 10 Then "Bad"
Elseif [Sales] >= 30 then "Great"
else "OK"
end

抽出とカスタム集計を用いる場合、計算は復数に分割します。1つ目の計算フィールドで行レベルの計算を行い、集計を行う計算フィールドは2つ目の集計フィールドで行うようにする、等です。こうする事で、抽出は行レベルの計算を最適化(事前計算)出来るようにます。

ダッシュボードのオススメ利用法

クイックフィルタの代わりにフィルタリングアクションを使うようにしましょう。クイックフィルタはフィルタの一覧を作成するためのクエリを必要とします。(フィルタリング)アクションはビュー自身をフィルターのエージェントとして活用する為、クエリが発行されてから保存されます。

フィルタリングアクションを使う場合、『すべての値を除外』を選択します。このチェックボックスを選択する事で、表示する事が出来る全てのデータを求めるような『高価なクエリ』の実施を避けられます。

tableau-filter-action

ダッシュボードやその他コンテンツをTableau Serverにパブリッシュする際は、復数の値リストで多くのメンバーを選択させるような大きなクイックフィルタを作成するのは避け、代わりにコンパクトなリストで代用しましょう。

また、大規模データのクロスタブを作成しないようにしてください。これはTableauの動的フィルタアクションでで簡単に回避する事が出来ます。(※ちなみに『クロスタブ』とはこんな感じの表の事を指します。そもそも大量のデータをこの形式で見せる必要があるのかというのと、見せる場合はもっと絞った形で見せるべき、という部分があるのでしょう。)

CreatingCrosstabQuickly_All

まとめ

以上、Tableau Desktop周りのパフォーマンス改善に関するTips解説でした。Tableau&Redshiftの組み合わせで弊社では積極的に展開をしておりますが、Tablaeuサイド(今回の場合はDesktop)だけでもこれだけ改善ポイントがあるんですね。この他にもまだまだ色々ありそうなので適宜ご紹介して行きたいと思います。こちらからは以上です。