Snowflakeでviewが何から作られているかを知るGET_OBJECT_REFERENCESを試してみた #SnowflakeDB

2021.12.03

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

※本エントリは、Snowflakeをより使いこなそう! Advent Calendar 2021の3日目の記事となります。

さがらです。

SnowflakeでGET_OBJECT_REFERENCESという関数を試してみたので、その内容をまとめてみます。

GET_OBJECT_REFERENCES関数って何?

指定されたオブジェクトが参照するオブジェクトのリストを返すテーブル関数です。

現在はviewにのみ対応しているため、引数に入れたviewが参照するテーブルやviewを一覧として返す関数となっています。

試してみる

下記の公式Docの例に沿って、どういうデータを返すのか見ていきたいと思います。 ※わかりやすくするため、y_view_dy_view_eは省略します。

まずは下記のクエリを一通り実施します。

-- create a database
create or replace database ex1_gor_x;
use database ex1_gor_x;
use schema public;

-- create a set of tables
create or replace table x_tab_a (mycol int not null);
create or replace table x_tab_b (mycol int not null);
create or replace table x_tab_c (mycol int not null);

-- create views with increasing complexity of references
create or replace view x_view_d as
select * from x_tab_a
join x_tab_b
using ( mycol );

create or replace view x_view_e as
select x_tab_b.* from x_tab_b, x_tab_c
where x_tab_b.mycol=x_tab_c.mycol;

--create a second database
create or replace database ex1_gor_y;
use database ex1_gor_y;
use schema public;

-- create a table in the second database
create or replace table y_tab_a (mycol int not null);

-- create more views with increasing levels of references
create or replace view y_view_b as
select * from ex1_gor_x.public.x_tab_a
join y_tab_a
using ( mycol );

create or replace view y_view_c as
select b.* from ex1_gor_x.public.x_tab_b b, ex1_gor_x.public.x_tab_c c
where b.mycol=c.mycol;

create or replace view y_view_f as
select e.* from ex1_gor_x.public.x_view_e e, ex1_gor_x.public.x_tab_c c, y_tab_a
where e.mycol=y_tab_a.mycol
and e.mycol=c.mycol;

すると、下図のようなリレーションでviewとテーブルが作られます。

このとき、y_view_fがどのviewとテーブルから作られているかを、GET_OBJECT_REFERENCES関数を使って確かめてみます。

-- retrieve the references for the last view created
select * from table(get_object_references(database_name=>'ex1_gor_y', schema_name=>'public', object_name=>'y_view_f'));

すると、下図のようにREFERENCED_OBJECT_NAMEというカラムに、このviewがどのテーブルとviewから作られているかがわかります。

この関数の良いところは、引数に入れたviewの構成物にviewがあった場合は、そのviewの構成物であるテーブルも結果として返してくれる点です。

少しわかりづらいので、今回の例を用いて説明します。

今回の例では、関数に入れたy_view_fは、y_tab_ax_tab_cx_view_eの3つから作られています。

そしてこの内、x_view_ex_tab_bx_tab_cで構成されています。

その上で、今回の例で関数が返した結果は、y_tab_ax_tab_cx_view_ex_tab_bの4つであり、x_view_eを構成しているテーブルも漏れなく結果として返しているのです。

viewがネストされた構造となっていても、漏れなく返してくれるのはありがたいですよね!

どういうときに使えるのか?

Snowflakeはコンピューティングの性能が高いので、データマートにあたるテーブルを作らずとも複数のviewを定義するだけで十分な動作速度を得られることも多いと思います。

しかし、viewが多くなりすぎてネストされたviewを参照する構成となった時、「あれ、このviewはどのテーブルから作ったんだっけ…?」とわからなくなってしまう時があるかもしれません。

そんな時、このGET_OBJECT_REFERENCES関数を使うことで、定義が不明のviewがどのテーブルから作られているかを確認することが出来ます。

※もちろん本来は、こんな事態とならないようにドキュメントを整備したり、データリネージの機能を持つ製品を導入していることが理想です!

次回

Snowflakeをより使いこなそう! Advent Calendar 2021、次回の4日目では、「SnowflakeのSecure Viewを試してみた」というタイトルで執筆します。お楽しみに!