概要
本記事では、Snowflake Semantic Views において SEMANTIC_VIEW 句で FACTS と DIMENSIONS を相互に指定できるかを検証した結果を共有します。結論として、Semantic Views 側で定義した FACTS は SEMANTIC_VIEW 句で FACTS/DIMENSIONS のいずれとしても指定でき、同様に Semantic Views 側で定義した DIMENSIONS も FACTS/DIMENSIONS のいずれとしても指定可能であることを確認しました。
本記事で扱う SEMANTIC_VIEW 句における FACTS と DIMENSIONS の動作は、以下のドキュメントに記載されています。文章だけでは理解しづらい場合は、記事末尾のクエリ結果まで読めば動作が把握できるはずです。
出所:SEMANTIC_VIEW | Snowflake Documentation
出所:SEMANTIC_VIEW | Snowflake Documentation
疑問の発端
Snowflake Semantic Views のコードを確認していたところ、FACTS と DIMENSIONS の指定があることに気づきました。
出所:SQL を使用してセマンティック表示を作成する例 | Snowflake Documentation
続けてドキュメントを読むと、DIMENSIONS と FACTS の主な違いとして「DIMENSIONS 句で指定されたディメンションと式で結果がグループ化される」という説明がありました。
DIMENSIONS および FACTS を使用した場合の主な違いの1つは、クエリが DIMENSIONS 句で指定されたディメンションと式によって結果をグループ化することです。
出所:セマンティックビューのクエリ | Snowflake Documentation
SEMANTIC_VIEW 句には GROUP BY を明示的に指定する方法がないため、クエリ時の集約有無は FACTS/DIMENSIONS のどちらで指定するかに委ねられると理解しました。
出所:SEMANTIC_VIEW | Snowflake Documentation
ここで次の疑問が生じます。Semantic Views 定義時点で、列を FACTS と DIMENSIONS のどちらで使うかをあらかじめ決める必要があるのか。この疑問を解消するため、検証を行いました。
出所:SQL を使用してセマンティック表示を作成する例 | Snowflake Documentation
検証
事前準備
検証用のカタログとスキーマを作成します。
CREATE DATABASE IF NOT EXISTS sf_semantic_views_01;
CREATE SCHEMA IF NOT EXISTS sf_semantic_views_01.SCHEMA_01;
カタログとスキーマのデフォルトを変更します。
USE DATABASE SF_SEMANTIC_VIEWS_01;
USE SCHEMA SCHEMA_01;
検証用の Semantic Views を作成します。NATION テーブルの N_NAME 列を FACTS と DIMENSIONS の双方に設定しています。
CREATE OR REPLACE SEMANTIC VIEW FACTS_AND_DIMENSIONS
TABLES (
orders AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
PRIMARY KEY (o_orderkey),
customer AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER
PRIMARY KEY (c_custkey),
nation AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION
PRIMARY KEY (n_nationkey)
)
RELATIONSHIPS (
orders_to_cust AS orders(o_custkey) REFERENCES customer(c_custkey),
cust_to_nation AS customer(c_nationkey) REFERENCES nation(n_nationkey)
)
FACTS (
nation.FACTS__N_NAME AS n_name,
-- FACTS と METRICS であれば PRIVATE を指定可能。
PRIVATE nation.private__FACTS__N_NAME AS n_name
)
DIMENSIONS (
nation.DIMENSIONS__N_NAME AS n_name,
-- 下記は結合処理用の項目
orders.order_date AS CAST(o_orderdate AS DATE)
)
METRICS (
orders.orders_placed AS COUNT(o_orderkey)
);
想定結果の確認
FACTS にて項目を指定したときの想定結果
FACTS を指定した場合、NATION テーブルの N_NAME で集計しないため、ORDERS テーブルの 600 レコードという結果が返る想定です。
-- FACTS を指定した時の想定動作
SELECT
COUNT(*)
FROM
SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS AS orders
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER customer ON orders.O_CUSTKEY = customer.C_CUSTKEY
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION AS nation ON customer.C_NATIONKEY = nation.n_nationkey
WHERE
CAST(orders.o_orderdate AS DATE) = DATE '1993-01-01'
DIMENSIONS にて項目を指定したときの想定結果
DIMENSIONS を指定した場合、NATION テーブルの N_NAME ごとに集計されるため、25 レコードという結果が返る想定です。
-- DIMENSIONS を指定した時の想定動作
WITH SRC AS (
SELECT
nation.N_NAME
FROM
SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS AS orders
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER customer ON orders.O_CUSTKEY = customer.C_CUSTKEY
INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION AS nation ON customer.C_NATIONKEY = nation.n_nationkey
WHERE
CAST(orders.o_orderdate AS DATE) = DATE '1993-01-01'
GROUP BY
ALL
)
SELECT
COUNT(*)
FROM
SRC
Semantic Views の FACTS の項目の検証
Semantic Views の FACTS を FACTS として指定
想定どおり 600 レコードと一致。
SELECT COUNT(*)
FROM SEMANTIC_VIEW(
FACTS_AND_DIMENSIONS
FACTS
nation.FACTS__N_NAME
WHERE
orders.order_date = DATE'1993-01-01'
)
Semantic Views の FACTS を DIMENSIONS として指定
想定どおり 25 レコードと一致。
SELECT COUNT(*)
FROM SEMANTIC_VIEW(
FACTS_AND_DIMENSIONS
DIMENSIONS
nation.FACTS__N_NAME
WHERE
orders.order_date = DATE'1993-01-01'
)
Semantic Views の DIMENSIONS の項目の検証
Semantic Views の DIMENSIONS を FACTS として指定
想定どおり 600 レコードと一致。
SELECT COUNT(*)
FROM SEMANTIC_VIEW(
FACTS_AND_DIMENSIONS
FACTS
nation.DIMENSIONS__N_NAME
WHERE
orders.order_date = DATE'1993-01-01'
)
Semantic Views の DIMENSIONS を DIMENSIONS として指定
想定どおり 25 レコードと一致。
SELECT COUNT(*)
FROM SEMANTIC_VIEW(
FACTS_AND_DIMENSIONS
DIMENSIONS
nation.DIMENSIONS__N_NAME
WHERE
orders.order_date = DATE'1993-01-01'
)
まとめ
- Semantic Views で
FACTSとして定義した列は、クエリ側のSEMANTIC_VIEW句でFACTS/DIMENSIONSのどちらとしても指定可能。 - 同様に、Semantic Views で
DIMENSIONSとして定義した列も、SEMANTIC_VIEW句でFACTS/DIMENSIONSのいずれとしても指定可能。 -
SEMANTIC_VIEW句にGROUP BYは存在せず、DIMENSIONS指定時に自動でグループ化される。今回の検証では、FACTS指定で 600 レコード、DIMENSIONS指定で 25 レコードという想定どおりの結果を確認できた。













