セマンティックビューを作りながら基本的な構文を確認してみる #SnowflakeDB

セマンティックビューを作りながら基本的な構文を確認してみる #SnowflakeDB

2026.02.04

はじめに

セマンティックビューについて、基本的な構文を理解するために試しながら問い合わせとその回答がどのようになるか試してみた内容を記事としました。
セマンティックビューなので以下に記載がある SQL での定義可能な範囲に絞り代表的な部分を見ていきます。

https://docs.snowflake.com/en/sql-reference/sql/create-semantic-view

ユースケースの例

ここでは Account Usage 内の以下のビューを使用し、クエリに関して簡単な集計ができるエージェントを作成してみます。

サンプルデータ

  • QUERY_ATTRIBUTION_HISTORY ビュー
    • 過去1年間にウェアハウスで実行された特定のクエリのコンピューティングコストや各種情報を確認できる
    • 主な項目として以下がある
      • クエリID
      • 時間範囲
      • (クエリを発行した)ユーザー、ウェアハウス
      • ウェアハウスのアイドル時間を除く、クエリ実行時のクレジット使用量
    • 特徴として「実行時間の短いクエリ(~100ms以下)は、現在、クエリごとのコスト属性には短すぎるため、ビューには含まれません」とあり、すべてのクエリがこのビューに含まれるわけではありません
  • QUERY_HISTORY ビュー
    • 過去1年間以内のクエリ履歴を確認できる
    • 主な項目として以下がある
      • クエリID
      • 時間範囲
      • (クエリを発行した)ユーザー、ウェアハウス
      • クエリのテキスト、タイプ、発行先のデータベース・スキーマ など

問い合わせの内容

簡単ではありますが、問い合わせ評価のためのテストケースとして、以下を使用します。また、SQL ベースでの回答としても以下の内容がそれぞれ正しい集計結果と仮定します。

-- Q1 クエリを発行したユーザー数を教えてください。
-- ※QUERY_HISTORY を基準とする
SELECT
    COUNT(DISTINCT USER_NAME) AS UNIQUE_USER_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY;

-- Q2 最もクエリを多く実行しているユーザーは誰ですか。
SELECT
    USER_NAME,
    COUNT(*) AS TOTAL_QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
GROUP BY
    1
ORDER BY
    TOTAL_QUERY_COUNT DESC
LIMIT 1;

-- Q3 過去7日間のクエリ数を教えてください。
SELECT
    COUNT(*) AS TOTAL_QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP());

-- Q4 過去7日間のクエリタイプごとの内訳を教えてください。
SELECT
    QUERY_TYPE,
    COUNT(*) AS QUERY_COUNT,
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP())
GROUP BY
    QUERY_TYPE
ORDER BY
    QUERY_COUNT DESC;

-- Q5 [ユーザー名]について、過去7日間のクエリタイプを集計してください
SELECT
    QUERY_TYPE,
    COUNT(*) AS QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP())
    AND USER_NAME = '<ユーザー名>' -- 対象のユーザー名(大文字)
GROUP BY
    1
ORDER BY
    QUERY_COUNT DESC;

-- Q6 ユーザーごとのクレジット消費額を教えてください。   
SELECT
    qh.USER_NAME,
    SUM(
        qah.CREDITS_ATTRIBUTED_COMPUTE + 
        COALESCE(qah.CREDITS_USED_QUERY_ACCELERATION, 0)
    ) AS TOTAL_CREDITS
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY qh
INNER JOIN
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY qah
    ON qh.QUERY_ID = qah.QUERY_ID
GROUP BY
    1
ORDER BY
    TOTAL_CREDITS DESC;

-- Q7 利用者のごとのクレジット消費額を教えてください。
-- Q6 と同じクエリ

試してみる

前提条件

ここでは、以下の通り問い合わせを行うこととします。

  • Snowflake Intelligence 経由で問い合わせを行う
    • セマンティックビューを作成し、Cortex Agents オブジェクトを作成する
    • アカウントの Snowflake Intelligence オブジェクトに上記の Cortex Agents オブジェクトを追加する

事前準備

Snowflake Intelligence 経由で問い合わせを行うために、最低限のセマンティックビューの内容で各種オブジェクトを作成します。

-- セマンティックビューとエージェント作成先となるデータベース・スキーマを作成
CREATE DATABASE IF NOT EXISTS sv_test;
CREATE SCHEMA IF NOT EXISTS sv_test.semantic_views;
CREATE SCHEMA IF NOT EXISTS sv_test.agents;

-- セマンティックビューを作成
USE SCHEMA sv_test.semantic_views;

CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    )
  DIMENSIONS (
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME
  );

上記のセマンティックビュー定義の構文に関するポイントは以下です。

  • テーブルの定義
    • TABLES 句内で [ <logical_table_name> AS ] <physical_table_name> の形式で記述
    • AS の前にセマンティックビュー内での論理的な名称(エイリアス)を指定し、AS の後ろに実在する物理テーブル名を指定
  • ディメンション
    • DIMENSIONS句を定義する際は、最初にセマンティックビュー内での論理的な名称をTABLES 句内指定したエイリアスとあわせて指定し、その定義内容(expression)として物理カラム名をAS以降に指定

セマンティックビューを作成したら、エージェントを作成します。ここでは GUI から指定のスキーマ(sv_test.agents)に作成しました。
この際、エージェントが使用するツールのみ上記のセマンティックビューを指定し、その他はデフォルト(特に指示はなし)でエージェントを作成しました。

image

image 1

エージェントを作成後は、Snowflake Intelligence オブジェクトに追加し、Snowflake Intelligence 経由での問い合わせに使用できるようにしておきます。

-- Agentを追加
ALTER SNOWFLAKE INTELLIGENCE SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT ADD AGENT sv_test.agents.test_agent;

この時点で、権限のあるユーザーであれば、Snowflake Intelligence から対象のエージェントを選択し、問い合わせを行うことができます。

image 2

なお、この時点でセマンティックビューで定義されていない項目や指標を含む問い合わせを行うと失敗します。

過去1週間のクエリ数を教えてください。

image 3

Q1 クエリを発行したユーザー数を教えてください。

上記のセマンティックビューに対して、以下の問い合わせを行います。

クエリを発行したユーザー数を教えてください。
評価クエリ
-- Q1 クエリを発行したユーザー数を教えてください。
SELECT
    COUNT(DISTINCT USER_NAME) AS UNIQUE_USER_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY;

実行結果は下図のようになり、評価用の SQL と同じ結果が返りました。その他の情報も加えてくれています。

image 4

Snowflake Intelligence の詳細から確認できるクエリは以下のようになっており、COUNT(DISTINCT user_name)として、まさにほしいクエリ内容でした。

WITH __query_history AS (
  SELECT
    user_name,
    user_name AS warehouse_name
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  COUNT(DISTINCT user_name) AS distinct_user_count,
  COUNT(*) AS total_queries,
  COUNT(DISTINCT warehouse_name) AS distinct_warehouses
FROM __query_history
 -- Generated by Cortex Analyst (request_id: 675a5551-e24e-4728-9ed6-b9c65a1ca537)
;

Q2. 最もクエリを多く実行しているユーザーは誰ですか。

続けて、以下の内容で問い合わせてみます。

最もクエリを多く実行しているユーザーは誰ですか。
評価クエリ
-- Q2 最もクエリを多く実行しているユーザーは誰ですか。
SELECT
    USER_NAME,
    COUNT(*) AS TOTAL_QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
GROUP BY
    1
ORDER BY
    TOTAL_QUERY_COUNT DESC
LIMIT 1;

この場合、下図の結果となりました。

image 5

そこで、セマンティックビューを以下のように変更します。

CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    )

   FACTS (
    QUERY_HISTORY.QUERY_ID AS QUERY_HISTORY.QUERY_ID
      COMMENT = 'Unique identifier for each query execution'
    )

  DIMENSIONS (
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME
    );

変更点としてFACTS句を追加しました。セマンティックビューにおけるファクトは、ドキュメントからまとめると以下の定義です。

  • データモデル内の行レベルの属性
  • 特定のビジネスイベントやトランザクションを表し、常に論理テーブルの個々の行レベルの属性として提示される

つまり、ファクトを定義することで AI 側にテーブルの最小粒度(1行は何を表すか)を提示できると理解しています。

https://docs.snowflake.com/en/user-guide/views-semantic/overview#understanding-semantic-views

この上で再度同じ問い合わせを行うと、こちらも正解と同じ結果が返るクエリを生成してくれました。COUNT(DISTINCT query_id) AS unique_queries が追加されている点がポイントと思います。

image 6

Snowflake Intelligence の詳細から確認できるクエリ:

WITH __query_history AS (
  SELECT
    user_name,
    query_id
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  user_name,
  COUNT(query_id) AS total_queries,
  COUNT(DISTINCT query_id) AS unique_queries,
  RANK() OVER (ORDER BY COUNT(query_id) DESC NULLS LAST) AS rank_by_queries
FROM __query_history
GROUP BY
  user_name
ORDER BY
  total_queries DESC NULLS LAST
 -- Generated by Cortex Analyst (request_id: 08b28d4c-a752-4d8f-9d5e-f55b5fddf78a)
;

Q3. 過去7日間のクエリ数を教えてください。

続けて、以下の内容で問い合わせてみます。

過去7日間のクエリ数を教えてください。
評価クエリ
-- Q3 過去7日間のクエリ数を教えてください。
SELECT
    COUNT(*) AS TOTAL_QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP());

この場合、下図の結果となりました。

image 7

そもそも時系列集計用のカラムをセマンティックビュー定義に追加していないため、以下のようにセマンティックビューにディメンションとして追加しました。

CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    )

   FACTS (
    QUERY_HISTORY.QUERY_ID AS QUERY_HISTORY.QUERY_ID
      COMMENT = 'Unique identifier for each query execution'
    )

  DIMENSIONS (
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME,
    -- 追加
    QUERY_HISTORY.QUERY_START_TIME AS QUERY_HISTORY.START_TIME,
    QUERY_HISTORY.QUERY_END_TIME   AS QUERY_HISTORY.END_TIME
    );

この上で問い合わせると以下の SQL をベースに回答を作成してくれました。

WITH __query_history AS (
  SELECT
    end_time AS query_end_time,
    start_time AS query_start_time,
    user_name,
    query_id
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  COUNT(query_id) AS query_count,
  MIN(query_start_time) AS min_query_time,
  MAX(query_end_time) AS max_query_time,
  COUNT(DISTINCT user_name) AS unique_users
FROM __query_history
WHERE
  query_start_time >= DATEADD(DAY, -7, CURRENT_DATE)
  AND query_start_time <= CURRENT_TIMESTAMP()
 -- Generated by Cortex Analyst (request_id: c00988a8-25db-46b1-9a85-4ba77912c925)
;

ただし、当初想定していたクエリでは開始時点を以下のようにしていたため、結果に差異がありました。

--評価クエリ
WHERE START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP());
-- Agent
WHERE START_TIME >= DATEADD(DAY, -7, CURRENT_DATE);

ここでは問い合わせの内容を変えてみました。

現在の日時から数えてちょうど7日以内のクエリ数を教えてください。

この場合、以下のように評価クエリと同様のクエリとしてくれました。プロンプトも含め細かなフィルタ条件周りは注意が必要と思いました。

WITH __query_history AS (
  SELECT
    end_time AS query_end_time,
    start_time AS query_start_time,
    user_name,
    warehouse_name,
    query_id
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  COUNT(query_id) AS query_count,
  MIN(query_start_time) AS min_query_time,
  MAX(query_end_time) AS max_query_time,
  COUNT(DISTINCT user_name) AS unique_users,
  COUNT(DISTINCT warehouse_name) AS unique_warehouses
FROM __query_history
WHERE
  query_start_time >= DATEADD(HOUR, -168, CURRENT_TIMESTAMP())
  AND query_start_time <= CURRENT_TIMESTAMP()
 -- Generated by Cortex Analyst (request_id: 78af448b-a2b6-4b5a-9d16-1499b2bfc99a)
;

Q4. 過去7日間のクエリタイプごとの内訳を教えてください。

以下の問い合わせを行います。

過去7日間のクエリタイプごとの内訳を教えてください。
評価クエリ
-- Q4 過去7日間のクエリタイプごとの内訳を教えてください。
SELECT
    QUERY_TYPE,
    COUNT(*) AS QUERY_COUNT,
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP())
GROUP BY
    QUERY_TYPE
ORDER BY
    QUERY_COUNT DESC;

image 8

先と同様で、クエリタイプが集計軸としてないため、ディメンションに追加します。

CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    )

   FACTS (
    QUERY_HISTORY.QUERY_ID AS QUERY_HISTORY.QUERY_ID
      COMMENT = 'Unique identifier for each query execution'
    )

  DIMENSIONS (
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME,

    QUERY_HISTORY.QUERY_START_TIME AS QUERY_HISTORY.START_TIME,
    QUERY_HISTORY.QUERY_END_TIME   AS QUERY_HISTORY.END_TIME,
    -- 追加
    QUERY_HISTORY.QUERY_TYPE AS QUERY_HISTORY.QUERY_TYPE

    );

再度同じ問い合わせを行うと、以下のようにタイプごとに集計するクエリを返してくれました。ただし、Q3と同様にフィルタの開始時点の定義が評価クエリと異なります。

WITH __query_history AS (
  SELECT
    start_time AS query_start_time,
    query_type,
    query_id
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  query_type,
  COUNT(query_id) AS query_count,
  MIN(query_start_time) AS earliest_query_time,
  MAX(query_start_time) AS latest_query_time,
  COUNT(query_start_time) AS total_queries_with_start_time
FROM __query_history
WHERE
  query_start_time >= DATEADD(DAY, -7, CURRENT_DATE)
  AND query_start_time <= CURRENT_TIMESTAMP()
GROUP BY
  query_type
ORDER BY
  query_count DESC NULLS LAST
 -- Generated by Cortex Analyst (request_id: f9e56497-e07c-497d-9a49-53dd2dbe93d1)
;

Q5. [ユーザー名]について、過去7日間のクエリタイプを集計してください

以下の内容で問い合わせます。

[ユーザー名]について、過去7日間のクエリタイプを集計してください
評価クエリ
-- Q5 [ユーザー名]について、過去7日間のクエリタイプを集計してください
SELECT
    QUERY_TYPE,
    COUNT(*) AS QUERY_COUNT
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE
    START_TIME >= DATEADD(days, -7, CURRENT_TIMESTAMP())
    AND USER_NAME = '<ユーザー名>' -- 対象のユーザー名(大文字)
GROUP BY
    1
ORDER BY
    QUERY_COUNT DESC;

この質問はこれまでのセマンティックビューの内容で回答を返してくれました。※集計開始時点のカウントは先と同様に評価クエリとは異なります。

image 9

Snowflake Intelligence の詳細で確認できたクエリ:

WITH __query_history AS (
  SELECT
    end_time AS query_end_time,
    start_time AS query_start_time,
    query_type,
    user_name,
    query_id
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
)
SELECT
  query_type,
  COUNT(query_id) AS query_count,
  MIN(query_start_time) AS earliest_query_time,
  MAX(query_end_time) AS latest_query_time,
  COUNT(DISTINCT TO_DATE(query_start_time)) AS active_days
FROM __query_history
WHERE
  user_name = '<ユーザー名>'
  AND query_start_time >= DATEADD(DAY, -7, CURRENT_DATE)
  AND query_start_time <= CURRENT_TIMESTAMP()
GROUP BY
  query_type
ORDER BY
  query_count DESC NULLS LAST
 -- Generated by Cortex Analyst (request_id: a2b26dbc-c06e-41f0-a54b-a57ab77c69a0)
;

上記では、プロンプトに与えるユーザー名をアルファベット大文字で与えていました。試しに、プロンプトでは大文字小文字を混在して与えてみます。

[ユーザー名(※大文字小文字混在)]について、過去7日間のクエリタイプを集計してください

この場合でも、ここでは AI 側で解釈し大文字に変換した状態でフィルタ条件に与えて結果を返してくれました。ステップより、ユーザー名のメタデータ情報を参照している可能性があります。

2026-02-04_09h27_44

Q6. ユーザーごとのクレジット消費額を教えてください。

以下の内容で問い合わせます。

ユーザーごとのクレジット消費額を教えてください。
評価クエリ
-- Q6 ユーザーごとのクレジット消費額を教えてください。   
SELECT
    qh.USER_NAME,
    SUM(
        qah.CREDITS_ATTRIBUTED_COMPUTE + 
        COALESCE(qah.CREDITS_USED_QUERY_ACCELERATION, 0)
    ) AS TOTAL_CREDITS
FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY qh
INNER JOIN
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY qah
    ON qh.QUERY_ID = qah.QUERY_ID
GROUP BY
    1
ORDER BY
    TOTAL_CREDITS DESC;

現時点では、QUERY_HISTORY ビューにクレジット消費に関する情報が含まれていないこともあり、結果が返ってきません。

image 11

そこで、セマンティックビューを更新し、テーブル、テーブル間の関係、具体的な指標を追加しました。

CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    -- 参照先(親)テーブルには PRIMARY KEY またはユニークキーの指定が必須
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY 
	    PRIMARY KEY (QUERY_ID) ,   
	  -- クレジット消費量の情報がある QUERY_ATTRIBUTION_HISTORY ビューを追加
    QUERY_ATTRIBUTION_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
    )

  RELATIONSHIPS (
    -- テーブル間の関係を定義
    -- 任意の識別子 AS <外部キー側テーブル> (<結合列>) REFERENCES <参照先テーブル> (<参照列>)
    -- Semantic View では、「多(参照元)」→「一(参照先/マスター)」 の方向で定義
    query_history_rel AS QUERY_ATTRIBUTION_HISTORY (QUERY_ID) REFERENCES QUERY_HISTORY (QUERY_ID)
   )

   FACTS (
    QUERY_HISTORY.QUERY_ID AS QUERY_HISTORY.QUERY_ID
      COMMENT = 'Unique identifier for each query execution'
    )

  DIMENSIONS ( 
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME,

    QUERY_HISTORY.QUERY_START_TIME AS QUERY_HISTORY.START_TIME,
    QUERY_HISTORY.QUERY_END_TIME   AS QUERY_HISTORY.END_TIME,

    QUERY_HISTORY.QUERY_TYPE AS QUERY_HISTORY.QUERY_TYPE
    )

   METRICS ( 
    --  <論理テーブル名>.<メトリック名> AS <集計式>
    -- 「どのテーブルに所属する指標か」を指定し、新しい名前を定義
    -- AS 以降: 物理カラム等を使った「具体的な集計ロジック (SUM, COUNT, AVG等)」を記述
     QUERY_ATTRIBUTION_HISTORY.TOTAL_CREDITS AS SUM(
        QUERY_ATTRIBUTION_HISTORY.CREDITS_ATTRIBUTED_COMPUTE
            + COALESCE(QUERY_ATTRIBUTION_HISTORY.CREDITS_USED_QUERY_ACCELERATION, 0)
        )
      COMMENT = 'Sum of Credits consumption'
  );

テーブル間の関係に関するポイントは以下です。

  • RELATIONSHIPS句で定義。参照先となるテーブルは、その結合カラムに PRIMARY KEY または UNIQUE 制約のどちらかの指定が必要

また、新たにMETRICS句を追加しています。

  • メトリクス
    • ファクト(行レベルの属性)や同一テーブル内の数値列を集約関数(SUM/AVG/COUNT など)で計算した指標。複数行にまたがるデータを集約し、ビジネス上の意味を持つ定量的なパフォーマンス指標を表す
    • 単純な集約だけでなく、複数のファクトを組み合わせた 計算式を含むことができる
    • メトリクスを定義することで、行データをどのように集約し、何を正しい指標として扱うかを決定し、AI や BI 側で独自の解釈で集約してしまうことを防げる

例えば、ここでの「クレジット消費」と言っても、実際には定義が複数存在します。

定義 含まれるもの
Compute Credits CREDITS_ATTRIBUTED_COMPUTE
Compute + Query Acceleration CREDITS_ATTRIBUTED_COMPUTE + CREDITS_USED_QUERY_ACCELERATION

この指標の定義を、ここではCompute + Query Accelerationであるとセマンティックビュー上で定義することで、各々が独自の指標を定義することを防ぐことができます。

上記のようにセマンティックビューを更新し、再度問い合わせると、以下のように確認できました。

image 12

Snowflake Intelligence の詳細で確認できたクエリ(セマンティックビューをクエリしている):

SELECT * FROM SEMANTIC_VIEW(
    SV_TEST.SEMANTIC_VIEWS.SV_TEST
    METRICS total_credits
    DIMENSIONS user_name
    WHERE query_end_time <= CURRENT_TIMESTAMP
)
 -- Generated by Cortex Analyst (request_id: 314009f2-0b43-44f2-ac7a-3b3cf1e18ca2)
;

Q7. 利用者ごとのクレジット消費額を教えてください。

以下の問い合わせを行います。ポイントとは、[ユーザー] ではなく [利用者] として別の用語を使用している点です。

利用者ごとのクレジット消費額を教えてください。

この場合、下図の通り AI 側で解釈してくれました。
※その他直前にいくつか試した問い合わせの履歴も考察のステップに入っています。

image 13

[利用者] の他、[社員] や [叩き手] などの用語を試してみましたが、今回のシンプルな例では AI 側でユーザーと解釈し同様の結果を返してくれました。

そこで、あくまで検証時の例として、試しに [ユーザー] の独自用語として [クラスメソッド] という言葉で組織で呼んでいると仮定し、問い合わせてみます。

クラスメソッドごとのクレジット消費額を教えてください。

当然、一般にはユーザーと解釈できないので、下図の応答となります。

image 14

このようなケースでは、synonym として、別名や自然な言い回しを定義できます。そこで、セマンティックビューを以下のように変更します。QUERY_HISTORY.USER_NAMEにシノニムを追加しました。

 CREATE OR REPLACE SEMANTIC VIEW sv_test
  TABLES (
    -- 参照先(親)テーブルには PRIMARY KEY またはユニークキーの指定が必須
    QUERY_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY 
	    PRIMARY KEY (QUERY_ID) ,   
	  -- クレジット消費量の情報がある QUERY_ATTRIBUTION_HISTORY ビューを追加
    QUERY_ATTRIBUTION_HISTORY AS SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
    )

  RELATIONSHIPS (
    -- テーブル間の関係を定義
    -- 任意の識別子 AS <外部キー側テーブル> (<結合列>) REFERENCES <参照先テーブル> (<参照列>)
    -- Semantic View では、「多(参照元)」→「一(参照先/マスター)」 の方向で定義
    query_history_rel AS QUERY_ATTRIBUTION_HISTORY (QUERY_ID) REFERENCES QUERY_HISTORY (QUERY_ID)
   )

   FACTS (
    QUERY_HISTORY.QUERY_ID AS QUERY_HISTORY.QUERY_ID
      COMMENT = 'Unique identifier for each query execution'
    )

  DIMENSIONS ( 
    QUERY_HISTORY.USER_NAME AS QUERY_HISTORY.USER_NAME
	    WITH SYNONYMS = ('クラスメソッド')
      COMMENT = 'Name of the user' ,
    QUERY_HISTORY.WAREHOUSE_NAME AS QUERY_HISTORY.WAREHOUSE_NAME,

    QUERY_HISTORY.QUERY_START_TIME AS QUERY_HISTORY.START_TIME,
    QUERY_HISTORY.QUERY_END_TIME   AS QUERY_HISTORY.END_TIME,

    QUERY_HISTORY.QUERY_TYPE AS QUERY_HISTORY.QUERY_TYPE
    )

   METRICS ( 
    --  <論理テーブル名>.<メトリック名> AS <集計式>
    -- 「どのテーブルに所属する指標か」を指定し、新しい名前を定義
    -- AS 以降: 物理カラム等を使った「具体的な集計ロジック (SUM, COUNT, AVG等)」を記述
     QUERY_ATTRIBUTION_HISTORY.TOTAL_CREDITS AS SUM(
        QUERY_ATTRIBUTION_HISTORY.CREDITS_ATTRIBUTED_COMPUTE
            + COALESCE(QUERY_ATTRIBUTION_HISTORY.CREDITS_USED_QUERY_ACCELERATION, 0)
        )
      COMMENT = 'Sum of Credits consumption'
  );

この上で問い合わせを行うと、ユーザーと解釈し結果を返してくれました。

image 15

さいごに

セマンティックビューを作りながら、応答を比較しつつ基本的な構文を確認してみました。
SQL 定義の試していない設定や検証済みクエリの追加、エージェントそのものの指示など、精度向上のために指定できる設定は他にもあるので、試していきたいと思います。
こちらの記事の内容がどなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事