❄️

Snowflakeでビューが何から作られているかグラフで表示してみる

2023/03/23に公開

ビューが何からできているのか調べてみるという趣旨では、すでにOBJECT_DEPENDENCIESビューを再帰CTEでSELECTする@indigo13loveさんのこちらの記事①GET_OBJECT_REFERENCES()を使用したさがらさんのこちらの記事②があるのでご参照ください。
https://zenn.dev/indigo13love/articles/40b1ac97162eae
https://dev.classmethod.jp/articles/snowflake-get-object-references/

これらを読んでいて、Mermaidでグラフィカルに表示できないかと考え試してみました。
ビューの構成は上記の記事の例をそのまま借用させて頂いております。

以下のようなSQLでOBJECT_DEPENDENCIESビューを元にMermaidのテキストを生成することができました。

with ref as (
select referenced_database || '.' || referenced_schema  || '.' || referenced_object_name  referenced
    , referencing_database || '.' || referencing_schema || '.' || referencing_object_name referencing
    , iff(referenced_object_domain='VIEW',referenced||'(['||referenced||'])',referenced) 
      ||' --> '|| 
      iff(referencing_object_domain='VIEW',referencing||'(['||referencing||'])',referencing) text
from snowflake.account_usage.object_dependencies
where referencing_object_domain='VIEW'
  and referencing_database='TEST01' and referencing_schema='DEPENDENCY_TEST' -- ビューが存在するスキーマを指定
)
select 'flowchart LR\n' || listagg(text,'\n') within group (order by referencing, referenced) 
from ref;

Snowflakeアカウント上にある全てのビューについて一覧することも可能なはずですが、対象が広すぎると結果として表示されるダイアグラムが複雑になりすぎるので、実際に使う場合は対象となるビューが存在するデータベースやスキーマで絞って検索した方が良いと思われます。

出力結果

①のケース
生成されるテキスト
flowchart LR
TEST01.DEPENDENCY_TEST.T1 --> TEST01.DEPENDENCY_TEST.V1([TEST01.DEPENDENCY_TEST.V1])
TEST01.DEPENDENCY_TEST.V1([TEST01.DEPENDENCY_TEST.V1]) --> TEST01.DEPENDENCY_TEST.V12([TEST01.DEPENDENCY_TEST.V12])
TEST01.DEPENDENCY_TEST.V2([TEST01.DEPENDENCY_TEST.V2]) --> TEST01.DEPENDENCY_TEST.V12([TEST01.DEPENDENCY_TEST.V12])
TEST01.DEPENDENCY_TEST.V12([TEST01.DEPENDENCY_TEST.V12]) --> TEST01.DEPENDENCY_TEST.V123([TEST01.DEPENDENCY_TEST.V123])
TEST01.DEPENDENCY_TEST.V23([TEST01.DEPENDENCY_TEST.V23]) --> TEST01.DEPENDENCY_TEST.V123([TEST01.DEPENDENCY_TEST.V123])
TEST01.DEPENDENCY_TEST.V123([TEST01.DEPENDENCY_TEST.V123]) --> TEST01.DEPENDENCY_TEST.V1234([TEST01.DEPENDENCY_TEST.V1234])
TEST01.DEPENDENCY_TEST.V234([TEST01.DEPENDENCY_TEST.V234]) --> TEST01.DEPENDENCY_TEST.V1234([TEST01.DEPENDENCY_TEST.V1234])
TEST01.DEPENDENCY_TEST.T2 --> TEST01.DEPENDENCY_TEST.V2([TEST01.DEPENDENCY_TEST.V2])
TEST01.DEPENDENCY_TEST.V2([TEST01.DEPENDENCY_TEST.V2]) --> TEST01.DEPENDENCY_TEST.V23([TEST01.DEPENDENCY_TEST.V23])
TEST01.DEPENDENCY_TEST.V3([TEST01.DEPENDENCY_TEST.V3]) --> TEST01.DEPENDENCY_TEST.V23([TEST01.DEPENDENCY_TEST.V23])
TEST01.DEPENDENCY_TEST.V23([TEST01.DEPENDENCY_TEST.V23]) --> TEST01.DEPENDENCY_TEST.V234([TEST01.DEPENDENCY_TEST.V234])
TEST01.DEPENDENCY_TEST.V34([TEST01.DEPENDENCY_TEST.V34]) --> TEST01.DEPENDENCY_TEST.V234([TEST01.DEPENDENCY_TEST.V234])
TEST01.DEPENDENCY_TEST.T3 --> TEST01.DEPENDENCY_TEST.V3([TEST01.DEPENDENCY_TEST.V3])
TEST01.DEPENDENCY_TEST.V3([TEST01.DEPENDENCY_TEST.V3]) --> TEST01.DEPENDENCY_TEST.V34([TEST01.DEPENDENCY_TEST.V34])
TEST01.DEPENDENCY_TEST.V4([TEST01.DEPENDENCY_TEST.V4]) --> TEST01.DEPENDENCY_TEST.V34([TEST01.DEPENDENCY_TEST.V34])
TEST01.DEPENDENCY_TEST.T4 --> TEST01.DEPENDENCY_TEST.V4([TEST01.DEPENDENCY_TEST.V4])

Mermaidがこれを下図のようにビジュアライズしてくれます。

②のケース
生成されるテキスト
flowchart LR
EX1_GOR_X.PUBLIC.X_TAB_A --> EX1_GOR_X.PUBLIC.X_VIEW_D([EX1_GOR_X.PUBLIC.X_VIEW_D])
EX1_GOR_X.PUBLIC.X_TAB_B --> EX1_GOR_X.PUBLIC.X_VIEW_D([EX1_GOR_X.PUBLIC.X_VIEW_D])
EX1_GOR_X.PUBLIC.X_TAB_B --> EX1_GOR_X.PUBLIC.X_VIEW_E([EX1_GOR_X.PUBLIC.X_VIEW_E])
EX1_GOR_X.PUBLIC.X_TAB_C --> EX1_GOR_X.PUBLIC.X_VIEW_E([EX1_GOR_X.PUBLIC.X_VIEW_E])
EX1_GOR_X.PUBLIC.X_TAB_A --> EX1_GOR_Y.PUBLIC.Y_VIEW_B([EX1_GOR_Y.PUBLIC.Y_VIEW_B])
EX1_GOR_Y.PUBLIC.Y_TAB_A --> EX1_GOR_Y.PUBLIC.Y_VIEW_B([EX1_GOR_Y.PUBLIC.Y_VIEW_B])
EX1_GOR_X.PUBLIC.X_TAB_B --> EX1_GOR_Y.PUBLIC.Y_VIEW_C([EX1_GOR_Y.PUBLIC.Y_VIEW_C])
EX1_GOR_X.PUBLIC.X_TAB_C --> EX1_GOR_Y.PUBLIC.Y_VIEW_C([EX1_GOR_Y.PUBLIC.Y_VIEW_C])
EX1_GOR_X.PUBLIC.X_TAB_C --> EX1_GOR_Y.PUBLIC.Y_VIEW_F([EX1_GOR_Y.PUBLIC.Y_VIEW_F])
EX1_GOR_X.PUBLIC.X_VIEW_E([EX1_GOR_X.PUBLIC.X_VIEW_E]) --> EX1_GOR_Y.PUBLIC.Y_VIEW_F([EX1_GOR_Y.PUBLIC.Y_VIEW_F])
EX1_GOR_Y.PUBLIC.Y_TAB_A --> EX1_GOR_Y.PUBLIC.Y_VIEW_F([EX1_GOR_Y.PUBLIC.Y_VIEW_F])

元記事のリレーション図と見比べて頂ければと思います。ノード間の線が交差しないように出力するのは難しいですが、理解の一助にはなるのではないかと思います。全体に左から右へという流れになるので、場合によってはこちらの方が見やすいかもしれません。

Discussion