この記事では、Tableau で効率的な計算を作成するためのさまざまなヒントやガイドラインを取り上げます。これらのガイドラインはワークブックのパフォーマンスを最適化することを目的としています。ワークブックのパフォーマンス向上を行えるすべての方法については、ワークブックのパフォーマンスの最適化シリーズを参照してください。

一般的なルール: 別の計算で計算フィールドを複数回使用するのを避ける

別の計算で同一の計算フィールドを複数回参照すると、パフォーマンスの問題が発生します。計算で計算フィールドを使用する (ネストされた計算の作成としても知られる) 場合には、その計算で 1 回のみ参照するようにしてみてください。

計算でフィールド (ターミナル フィールド) を複数回参照しても、パフォーマンスが低下することはありません。

複数行の複雑な計算を使用する計算フィールドを作成し、ツイートに含まれるメンションまたは Twitter ハンドルを見つけるとします。計算フィールドはタイトルの付いた Twitter ハンドルです。返される各ハンドルは '@' 記号で始まります (@ユーザーなど)。

分析のため、'@' 記号を削除する必要があります。

これを実行するには、以下の計算を使用して文字列から最初の文字を削除します。

RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)

この計算はとてもシンプルです。ですが、Twitter ハンドル計算を 2 回参照しているため、データ ソースの各レコードで計算を 2 回実行します。1 回は RIGHT 関数、もう 1 回は LEN 関数です。

同じ計算を 2 回以上実行するのを回避するには、Twitter ハンドル計算を 1 回のみ使用するように計算を書き直すことができます。この例では、以下のように MID を使用すると、同じ目標を達成できます。

MID([Twitter Handle], 2)

ヒント 1: 複数の等価比較を 1 つの CASE 計算式またはグループに変換する

計算で以下のように、計算フィールド、Person (calc) を複数回使用し、OR 関数が並んでいるとします。この計算の論理式はシンプルではありますが、Person (calc) 計算を最低 10 回実行しているためクエリ パフォーマンスの問題が生じる原因となります。

IF [Person (calc)] = 'Henry Wilson'
OR [Person (calc)] = 'Jane Johnson'
OR [Person (calc)] = 'Michelle Kim'
OR [Person (calc)] = 'Fred Suzuki'
OR [Person (calc)] = 'Alan Wang'
THEN 'Lead'
ELSEIF [Person (calc)] = 'Susan Nguyen'
OR [Person (calc)] = 'Laura Rodriguez'
OR [Person (calc)] = 'Ashley Garcia'
OR [Person (calc)] = 'Andrew Smith'
OR [Person (calc)] = 'Adam Davis'
THEN 'IC'
END

等価比較を使用するのではなく、以下の解決策を試してみてください。

解決策 1

CASE 式を使用します。例:

CASE [Person (calc)]
WHEN 'Henry Wilson' THEN 'Lead'
WHEN 'Jane Johnson' THEN 'Lead'
WHEN 'Michelle Kim' THEN 'Lead'
WHEN 'Fred Suzuki' THEN 'Lead'
WHEN 'Alan Wang' THEN 'Lead'

WHEN 'Susan Nguyen' THEN 'IC'
WHEN 'Laura Rodriguez' THEN 'IC'
WHEN 'Ashley Garcia' THEN 'IC'
WHEN 'Andrew Smith' THEN 'IC'
WHEN 'Adam Davis' THEN 'IC'
END

この例で計算フィールド、Person (calc) は 1 回しか参照されていません。このため、実行されるのは 1 回のみです。また、クエリ パイプラインで CASE 式もさらに最適化されるため、パフォーマンスにおけるメリットはさらに大きくなります。

解決策 2

計算フィールドではなくグループを作成します。詳細については、データのグループ化を参照してください。

ヒント 2: 複数の文字列計算を単一の REGEXP 式に変換する

: REGEXP 計算は、Tableau データ抽出を使用している場合のみ、またはテキスト ファイル、Hadoop Hive、Google BigQuery、PostgreSQL、Tableau Data Extract、Microsoft Excel、Salesforce、Vertica、Pivotal Greenplum、Teradata (バージョン 14.1 以上)、および Oracle データ ソースに接続している場合のみ利用できます。詳細については、その他の関数を参照してください。


例 1: CONTAINS

計算で以下のように、計算フィールド、Category (calc) を複数回使用しているとします。この計算の論理式はやはりシンプルではありますが、Category (calc) 計算を複数回実行しているためクエリ パフォーマンスの問題が生じる原因となります。

IF CONTAINS([Segment (calc)],'UNKNOWN')
OR CONTAINS([Segment (calc)],'LEADER')
OR CONTAINS([Segment (calc)],'ADVERTISING')
OR CONTAINS([Segment (calc)],'CLOSED')
OR CONTAINS([Segment (calc)],'COMPETITOR')
OR CONTAINS([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

何回も繰り返さなくても、REGEXP 式を使用すると同じ結果が得られます。

解決策

IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END


同様のパターンを使用する文字列計算では、同じ REGEXP 式を使用できます。

例 2: STARTSWITH

IF STARTSWITH([Segment (calc)],'UNKNOWN')
OR STARTSWITH([Segment (calc)],'LEADER')
OR STARTSWITH([Segment (calc)],'ADVERTISING')
OR STARTSWITH([Segment (calc)],'CLOSED')
OR STARTSWITH([Segment (calc)],'COMPETITOR')
OR STARTSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'

解決策

IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

この解決策では '^' 記号を使用していることに注意してください。

例 3: ENDSWITH

IF ENDSWITH([Segment (calc)],'UNKNOWN')
OR ENDSWITH([Segment (calc)],'LEADER')
OR ENDSWITH([Segment (calc)],'ADVERTISING')
OR ENDSWITH([Segment (calc)],'CLOSED')
OR ENDSWITH([Segment (calc)],'COMPETITOR')
OR ENDSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

解決策

IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

この解決策では '$' 記号を使用していることに注意してください。

ヒント 3: LEFT、MID、RIGHT、FIND、LEN ではなく REGEXP を使用して文字列を操作する

正規表現はとても強力なツールになります。複雑な文字列操作を実行する場合には、正規表現の使用を検討してください。多くの場合、正規表現を使用すると、計算はより短く効率的になります。正規表現の詳細については、Tableau ブログの記事「正規表現になって不完全なデータを処理する (英語)」(新しいウィンドウでリンクが開く)を参照してください。

例 1

計算で以下のように、URL からプロトコルが削除されているとします。たとえば、"https://www.tableau.com" が "www.tableau.com" になっています。

IF (STARTSWITH([Server], "http://")) THEN
MID([Server], Len("http://") + 1)
ELSEIF(STARTSWITH([Server], "https://")) THEN
MID([Server], Len("https://") + 1)
ELSEIF(STARTSWITH([Server], "tcp:")) THEN
MID([Server], Len("tcp:") + 1)
ELSEIF(STARTSWITH([Server], "\\")) THEN
MID([Server], Len("\\") + 1)
ELSE [Server]
END

解決策

REGEXP_REPLACE 関数を使用し、計算を簡潔にしてパフォーマンスを向上できます。

REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")

例 2

計算で以下のように、IPv4 アドレスの 2 番目の部分が返されるとします。たとえば、"172.16.0.1" は "16" になります。

IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END

解決策

REGEXP_EXTRACT 関数を使用し、計算を簡潔にしてパフォーマンスを向上できます。

REGEXP_EXTRACT([Server], "\.([^\.]*)\.")

ヒント 4: 計算にセットを使用しない

計算にセットを使用している場合、それを等価計算以外の別の要素に置き換えてください。

計算で以下のように、セットである Top Customers (set) が使用されているとします。

IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END

解決策 1

セットがシンプルな場合、同じ結果を返す計算フィールドをセットとして作成できます。例:

CASE [Customer Name]
WHEN 'Henry Wilson' THEN True
WHEN 'Jane Johnson' THEN True
WHEN 'Michelle Kim' THEN True
WHEN 'Fred Suzuki' THEN True
WHEN 'Alan Wang' THEN True
ELSE False
END


: セットの使用によるパフォーマンスの問題が生じないようにするため、この状況では WHEN TRUE … ELSE のパターンを使用することが推奨されます。これは多くのシナリオで推奨されるパターンではありません。

解決策 2

セットがさらに複雑な場合、セットに含まれるすべての要素を 'IN' などの指定した値または属性にマッピングするグループの作成を検討し、その後、その値/属性を確認するように計算を変更してください。例:

IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END

詳細については、データのグループ化およびセットの作成を参照してください。

ヒント 5: データのグループ化にセットを使用しない

セットはデータのサブセットを比較することを目的としています。グループはフィールドに含まれる関連するメンバーを組み合わせることを目的としています。以下の例のようにセットをグループに変換することは推奨されていません。

IF [Americas Set] THEN "Americas"
ELSEIF [Africa Set] THEN "Africa"
ELSEIF [Asia Set] THEN "Asia"
ELSEIF [Europe Set] THEN "Europe"
ELSEIF [Oceania Set] THEN "Oceania"
ELSE "Unknown"
END

以下の理由で推奨されていません。

  • セットは常には排他的でない。一部のメンバーは複数のセットに表示されることがあります。たとえば、ロシアは欧州セットとアジア セットのどちらにも配置される可能性があります。

  • セットはグループに常には変換できない。セットが除外、条件、または制限により定義される場合、同等のグループを作成することが難しい、または不可能な場合さえあるかもしれません。

解決策

グループ機能を使用してデータをグループ化します。詳細については、データのグループ化を参照してください。

関連項目

効果的な計算の作成

ワークブックのパフォーマンスの最適化

Tableau での計算の種類

Tableau で使用する関数

ありがとうございます!