見出し画像

【Tableau Knowledge】リレーションシップと結合の違い

今回の記事では、バージョン2020.2で追加された「リレーションシップ」について整理します。「結合」と比較されることが多いですが、私自信は内部処理の違いがあるくらいの理解度で、「結合はSQLと同じようなJOINの仕組みで成り立っていて、リレーションシップはよくわからんから「結合」を使っておこう。」という悲しい意思決定をしている状況でした。

何事もそうですが、本来的にはリレーションシップと結合それぞれを理解したうえで使い分けができることが理想ですが、忙しいビジネスマンの皆様は、いろいろ文献探したうえでクエリの挙動をパターン分けして確認する時間もないと思うのと、Tableauオフィシャル説明の日本語がわかりくい部分もありましたので(ごめんなさい)…私が調べる中でのまとめをこちらのブログにしたためておきます。

基本的には結論しか書かないため、より詳細情報を確認・理解を深めたい方は参照リンク先の情報まで確認していただくとよいかと思いますmm
(※実務で活用する1ユーザーとしてのまとめになるので、情報が主観的な可能性がある前提でお読みくださいmm)


■結論

 -私自身がどのようなシーンでどっちを使おうと思ったか

いきなりですが、結論となります。
私自身はようやくSQLにおけるJOINとその際のデータ挙動がイメージできる状態になったのと、扱うレコード件数・データの複雑さを考えると基本的には「結合」を使っていこうという印象となりました。

様々な文章を読み理解を深めようとしたのですが、リレーションにおけるデータ挙動を頭に入れておくことが不可能に近い印象を持ったため、この結論に至っています。

以下に結論に至った説明を記載しようと思います。メリデメから利用する手段を選択いただければと思いますが、下のセクションに気持ちばかりの「リレーションの仕組み」について記載しました。

■メリット

  • 人が陥りやすい集計の誤りを回避してくれる
    SQLを正しく理解しきれていない方にとっては「結合」における間違いが起きにくい「リレーションシップ」を使うことでより早く結論を導き出せる手段になり得ます。

  • ワークシートに配置するディメンションとメジャーの配置によって、Tableau が実行する "結合" が自動最適化される
    1点目が挙げられる所以ですが、"リレーション" を作成した時、"結合"で行っていた [結合種類の設定] は存在しません。"リレーション" での結合は、ワークシートに配置したフィールドによって、最適な状態で行われます。これは "結合" がよく理解出来ていないユーザーにとってはメリットになると考えます。

  • 大量データを扱うワークシート作成時のパフォーマンス向上
    2点目の自動最適化の際に、Tableau自身がパフォーマンスを意識した最適なクエリに書き換えること。また、ワークシート上で必要なクエリのみが実行されることによって、処理負荷が軽減される構造になっています。

■デメリット

  • 自分の意思で結合をコントロールできない
    SQLにおける"結合" は難解なことも多く、Tableauを使い始めて間もないユーザーにとっては結合の種類を意識することなく "データの突合" を行うことができます。一方、従来の "結合" に慣れ親しんだユーザーにとっては、上記により混乱する方もいるように思います。データベースに詳しい方ほど陥る不信感に繋がっているようです。

■どんなシーンでの活用に最適か?

向かない利用シーンとしては、特に以下のようなケースが挙げられると考えています。

  • 精緻なデータ集計が必要な時
    前述の通り、結合がコントロールできないことにより意図と異なる集計結果になっていたり、ミスに気付きにくい状況も生まれやすいととらえています。

  • 探索型のワークシート作成 
    モニタリングシートなど様々なディメンションを、複数テーブルから引用して1つのワークシートを作成する場合など、最終的に複雑な作りになる場合は結局のところ裏側で実行されるクエリも複雑になるためパフォーマンスの向上が期待しにくくなり、メリット部分が弱くなります。

■リレーションの仕組み ざっくり3点

①ワークシート上のフィールドの配置によって、テーブルごとに集計が行われてから結合が行われる

②ワークシート上のフィールドの配置によって、結合の種類が変わる

  • ワークシート上で集計が行われない場合
    INNER JOIN

  • ワークシート上で集計が行われた場合
    LEFT JOIN
    ※集計する値がGUI上で右側にあったとしても、主テーブルをクエリ上で左右入れ替えて処理するため RIGHT JOIN は行わない。

  • ワークシート上で集計する値の引用元が突合したいテーブル両方にある場合
    別々に LEFT JOIN が行われ、2つの集計結果をマージ

②の詳細説明は、言葉で説明しようとすると非常にわかりにくいのですが、以下の記事を参考に記載しました。

③データ接続画面でリレーションの定義が行われていても、実際に使うテーブルしかクエリで使われない

結合では、ディメンションに配置した時の集約・集計 (GROUP BY) や、フィルターは、結合後に発生します。リレーションシップは、テーブルの関係性を保ちながらも、その時必要なテーブルに対して集計やフィルター作成が出来るため、この点がパフォーマンスの向上につながっています。


■【Tips】リレーションシップにおけるクエリを確認する方法

①Tableauのパフォーマンスモニター

自分が作成したワークブックに対して、この手法を使えば全クエリは可視化しきれないそうなのですが、どの処理にどれくらい負荷がかかっているのか可視化できます。

ワークブック パフォーマンスの記録と分析

※詳細の使い方は↓の記事の方がわかりやすかったです

②Snowflake

Snowflakeを使用したことがないので、少し粗い書き方になりますが、サンプルデータと同じものをSnowflake上に置くと、Tableauから発行されるSQLが確認できるようです。Tableau のパフォーマンスモニターと比較して操作が簡単とのこと。

Snowflake 上の UIサンプル

■【Tips】カーディナリティと参照情報

リレーションシップのパフォーマンスをチューニングできるオプションとして存在する「カーディナリティ」。このカーディナリティは、一意に定義できるのであれば、予めリレーションシップのカーディナリティを1に設定しておいたほうがパフォーマンス向上が見込めるそうです。(以下リンク参照)

また、同じく「参照整合」については、 すべてのレコードが一致 対 すべてのレコードが一致 の場合、SQL がシンプルです。即ち、この状態が一番パフォーマンス的に良いと言えます。

■終わりに

お会いしたこともないですが、今回のまとめを書くのに色々文章を読みましたが、もりたひろあき先生の説明が一番わかりやすかったです。この場でお礼をさせていただきますmm

みなさまのTableauライフがより良きものになりますように。。。
(万が一記載変えた方がいい部分などあればtwitterに是非ご連絡ください)


この記事が気に入ったらサポートをしてみませんか?