見出し画像

Tableau のリレーションシップ機能 その8 ~ カーディナリティって何?② ~

前回記事で、カーディナリティはテーブルの関係の一意性を示すものだということを説明しました。今回は、それによって Tableauが発行するクエリーがどう変わるか?を見ていきましょう。

話を解りやすくするために、今回もサンプルデータにある TRAN_01.CSVCST_01.CSV を使っていきます。

内容は4行だけのデータ

CST_CD でリレーションを行い、カーディナリティを変えると Tableau が発行するSQL がどう変化するを見ていきます。先ず、以下のように "リレーション" 結び、カーディナリティが 多対多になっていることを確認(参照整合は "一部のレコードが一致" にしておいて下さい)。

この状態でワークシートに進み、次のような簡単な集計表を作成してみましょう。行に T_CST_CD と C_CST_CD を配置。メジャーは TRAN_01 (カウント) と CST_01 (カウント) を使いテキスト表を作成しましょう。両方のテーブルにあるメジャーを集計しているから、以前説明した完全外部結合の状態です。

上記の操作を行うと、Tableau は次の2つの SQL を発行します。

多対多 1つ目のSQL
多対多 2つ目SQL

完全外部結合なので2つのクエリーが作成されます。SQLの中身は解らなくて構いません。なんとなく複雑なクエリーになっていることはお解り頂けると思います。

次にカーディナリティを 多対1 に変えてみましょう。
発行されるクエリーは以下に変わります。

N対1 1つ目のSQL
N対1 2つ目のSQL

多対多よりも SQL が短くなっています。どこが変わったでしょうか?
FROM句の中にあるサブクエリーがなくなっています。また、2つ目のSQLの SELECT句にある SUM(1)  (レコード数のカウント) が 1 に変わっています。CST_01 側のテーブルにカーディナリティ: 1 を設定したのでレコード数の集計が不要となり 1 という固定値になっています。カーディナリティを適切に設定することで不要な集計もなくなっているのです。

今後は逆に 1対多 にしてみましょう。

1対N 1つ目のSQL
1対N 2つ目のSQL

こちらも、FROM句の中にあるサブクエリーがなくなっています。また、1つ目のSQLの SELECT句にある SUM(1)  (レコード数のカウント) が 1 に変わりました。

最後に 1対1 の場合

1対1 1つ目のSQL
1対1 2つ目のSQL

GROUP BY がなくなっていることが解ります。どちらのテーブルもレコードが一意であることがカーディナリティで定義されているので、Tableau は、グループ化が不要と判断しています。これにより SELECT句にある TRAN_01の MIN(T_CST_CD) も T_CST_CD に変わり不要な集計がなくなっています。

今回の場合、どれで実行しても得られる結果は同じです。しかし、多対多 → 多対1 → 1対1 に進むにつれて SQL がシンプルになっていくことが確認できます。これは何を意味するかというと「クエリーの結果が速く返ってくる」ということです。パフォーマンスの向上に繋がります。「リレーションシップを使ったら何か遅くなった気がする」というお話も良く聞きます。Tableau のリレーションシップは、多対多の関係性でも適切な集計結果を返すために工夫されています。そのため一方で無駄な処理も行っています。これがリレーションシップだと遅いと感じる理由の一つです。データ量が少ないうちは多対多でも、パフォーマンスへの影響はほとんど有りません。然しながら、データが数千万行、数億行に増えていくと、この違いでクエリー実行時間が数分変わってきます。

データを扱う時は、このような特徴を理解し適切な準備をしておくことがとても大切です。カーディナリティを一意に定義できるのであれば、予めリレーションシップのカーディナリティを1に設定しておいたほうが効率が良くなる、というお話でした。

いいなと思ったら応援しよう!