1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake Semantic Views における SEMANTIC_VIEW 句の FACTS と DIMENSIONS の動作確認

Posted at

概要

本記事では、Snowflake Semantic Views において SEMANTIC_VIEW 句で FACTSDIMENSIONS を相互に指定できるかを検証した結果を共有します。結論として、Semantic Views 側で定義した FACTSSEMANTIC_VIEW 句で FACTSDIMENSIONS のいずれとしても指定でき、同様に Semantic Views 側で定義した DIMENSIONSFACTSDIMENSIONS のいずれとしても指定可能であることを確認しました。

本記事で扱う SEMANTIC_VIEW 句における FACTSDIMENSIONS の動作は、以下のドキュメントに記載されています。文章だけでは理解しづらい場合は、記事末尾のクエリ結果まで読めば動作が把握できるはずです。

image.png

出所:SEMANTIC_VIEW | Snowflake Documentation

image.png

出所:SEMANTIC_VIEW | Snowflake Documentation

疑問の発端

Snowflake Semantic Views のコードを確認していたところ、FACTSDIMENSIONS の指定があることに気づきました。

image.png

出所:SQL を使用してセマンティック表示を作成する例 | Snowflake Documentation

続けてドキュメントを読むと、DIMENSIONSFACTS の主な違いとして「DIMENSIONS 句で指定されたディメンションと式で結果がグループ化される」という説明がありました。

DIMENSIONS および FACTS を使用した場合の主な違いの1つは、クエリが DIMENSIONS 句で指定されたディメンションと式によって結果をグループ化することです。

image.png

出所:セマンティックビューのクエリ | Snowflake Documentation

SEMANTIC_VIEW 句には GROUP BY を明示的に指定する方法がないため、クエリ時の集約有無は FACTSDIMENSIONS のどちらで指定するかに委ねられると理解しました。

image.png

出所:SEMANTIC_VIEW | Snowflake Documentation

ここで次の疑問が生じます。Semantic Views 定義時点で、列を FACTSDIMENSIONS のどちらで使うかをあらかじめ決める必要があるのか。この疑問を解消するため、検証を行いました。

image.png

出所:SQL を使用してセマンティック表示を作成する例 | Snowflake Documentation

検証

事前準備

検証用のカタログとスキーマを作成します。

CREATE DATABASE IF NOT EXISTS sf_semantic_views_01;
CREATE SCHEMA IF NOT EXISTS sf_semantic_views_01.SCHEMA_01;

image.png

カタログとスキーマのデフォルトを変更します。

USE DATABASE SF_SEMANTIC_VIEWS_01; 
USE SCHEMA SCHEMA_01;

image.png

検証用の Semantic Views を作成します。NATION テーブルの N_NAME 列を FACTSDIMENSIONS の双方に設定しています。

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)
  );

image.png

想定結果の確認

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'

image.png

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

image.png

Semantic Views の FACTS の項目の検証

Semantic Views の FACTSFACTS として指定

想定どおり 600 レコードと一致。

SELECT COUNT(*)
FROM SEMANTIC_VIEW(
  FACTS_AND_DIMENSIONS
  FACTS
    nation.FACTS__N_NAME
  WHERE
    orders.order_date = DATE'1993-01-01'
)

image.png

Semantic Views の FACTSDIMENSIONS として指定

想定どおり 25 レコードと一致。

SELECT COUNT(*)
FROM SEMANTIC_VIEW(
  FACTS_AND_DIMENSIONS
  DIMENSIONS
    nation.FACTS__N_NAME
  WHERE
    orders.order_date = DATE'1993-01-01'
)

image.png

Semantic Views の DIMENSIONS の項目の検証

Semantic Views の DIMENSIONSFACTS として指定

想定どおり 600 レコードと一致。

SELECT COUNT(*)
FROM SEMANTIC_VIEW(
  FACTS_AND_DIMENSIONS
  FACTS
    nation.DIMENSIONS__N_NAME
  WHERE
    orders.order_date = DATE'1993-01-01'
)

image.png

Semantic Views の DIMENSIONSDIMENSIONS として指定

想定どおり 25 レコードと一致。

SELECT COUNT(*)
FROM SEMANTIC_VIEW(
  FACTS_AND_DIMENSIONS
  DIMENSIONS
    nation.DIMENSIONS__N_NAME
  WHERE
    orders.order_date = DATE'1993-01-01'
)

image.png

まとめ

  • Semantic Views で FACTS として定義した列は、クエリ側の SEMANTIC_VIEW 句で FACTSDIMENSIONS のどちらとしても指定可能。
  • 同様に、Semantic Views で DIMENSIONS として定義した列も、SEMANTIC_VIEW 句で FACTSDIMENSIONS のいずれとしても指定可能。
  • SEMANTIC_VIEW 句に GROUP BY は存在せず、DIMENSIONS 指定時に自動でグループ化される。今回の検証では、FACTS 指定で 600 レコードDIMENSIONS 指定で 25 レコードという想定どおりの結果を確認できた。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?