SNOWFLAKE.ACCOUNT_USAGEは、Snowflakeが提供する共有データベースSNOWFLAKE内のスキーマで、アカウント内のあらゆるメタデータ・利用履歴・監査ログを最大365日間保持します。 クエリ履歴、ログイン履歴、ストレージ使用量、クレジット消費、アクセス監査など、 運用監視とガバナンスに不可欠な情報を一元的に提供します。
| ビュー名 | 内容 | 保持期間 | 遅延 |
|---|---|---|---|
| QUERY_HISTORY | 全クエリの実行履歴(SQL文・実行時間・バイト数等) | 365日 | 最大45分 |
| LOGIN_HISTORY | ログイン試行の記録(成功/失敗・IP・クライアント) | 365日 | 最大2時間 |
| STORAGE_USAGE | 日次のストレージ使用量(アクティブ/Time Travel/Fail-safe) | 365日 | 最大3時間 |
| WAREHOUSE_METERING_HISTORY | ウェアハウスのクレジット消費履歴 | 365日 | 最大3時間 |
| ACCESS_HISTORY | 列レベルのデータアクセス監査 | 365日 | 最大3時間 |
| TABLES | 全テーブルのメタデータ(行数・サイズ・クラスタリング等) | ドロップ後365日 | 最大3時間 |
| COLUMNS | 全カラムの定義情報 | ドロップ後365日 | 最大2時間 |
| GRANTS_TO_ROLES | ロールに付与された権限の履歴 | 365日 | 最大2時間 |
| GRANTS_TO_USERS | ユーザーに付与されたロールの履歴 | 365日 | 最大2時間 |
| DATA_TRANSFER_HISTORY | リージョン間データ転送の履歴 | 365日 | 最大2時間 |
| 比較項目 | ACCOUNT_USAGE | INFORMATION_SCHEMA |
|---|---|---|
| データソース | SNOWFLAKE共有データベース | 各データベース内のスキーマ |
| 保持期間 | 365日(1年間) | 7〜14日(テーブル関数による) |
| データ反映遅延 | 45分〜3時間 | なし(リアルタイム) |
| スコープ | アカウント全体 | 当該データベースのみ |
| ドロップ済みオブジェクト | 含む(365日間) | 含まない |
| 必要権限 | IMPORTED PRIVILEGES on SNOWFLAKE DB | 対象オブジェクトへの権限 |
| アクセス方法 | SELECT文(通常のビュー) | テーブル関数(TABLE()構文) |
-- ACCOUNTADMINで監視用ロールにアクセスを許可
USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS monitoring_role;
GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE
TO ROLE monitoring_role;
-- 監視担当ユーザーにロールを付与
GRANT ROLE monitoring_role TO USER monitoring_user;-- 過去7日間で最もコストの高いクエリ TOP 20
SELECT
query_id,
user_name,
warehouse_name,
warehouse_size,
execution_time / 1000 AS exec_sec,
bytes_scanned / POWER(1024, 3) AS gb_scanned,
partitions_scanned,
partitions_total,
ROUND(partitions_scanned / NULLIF(partitions_total, 0) * 100, 1) AS scan_pct,
query_text
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
AND execution_status = 'SUCCESS'
AND warehouse_name IS NOT NULL
ORDER BY execution_time DESC
LIMIT 20;
-- ユーザー別クエリ実行統計
SELECT
user_name,
COUNT(*) AS total_queries,
AVG(execution_time) / 1000 AS avg_exec_sec,
SUM(bytes_scanned) / POWER(1024, 4) AS tb_scanned,
SUM(credits_used_cloud_services) AS cloud_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time >= DATEADD(DAY, -30, CURRENT_TIMESTAMP())
GROUP BY user_name
ORDER BY total_queries DESC;-- ログイン失敗の検出(不正アクセスの兆候)
SELECT
user_name,
client_ip,
reported_client_type,
error_code,
error_message,
event_timestamp
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE is_success = 'NO'
AND event_timestamp >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
ORDER BY event_timestamp DESC;
-- ユーザー別ログインパターン分析
SELECT
user_name,
COUNT_IF(is_success = 'YES') AS success_count,
COUNT_IF(is_success = 'NO') AS fail_count,
COUNT(DISTINCT client_ip) AS distinct_ips,
LISTAGG(DISTINCT reported_client_type, ', ') AS client_types
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE event_timestamp >= DATEADD(DAY, -30, CURRENT_TIMESTAMP())
GROUP BY user_name
HAVING fail_count > 5
ORDER BY fail_count DESC;-- ストレージ使用量の推移(日次)
SELECT
usage_date,
ROUND(storage_bytes / POWER(1024, 4), 2) AS active_tb,
ROUND(failsafe_bytes / POWER(1024, 4), 2) AS failsafe_tb,
ROUND(stage_bytes / POWER(1024, 4), 2) AS stage_tb
FROM SNOWFLAKE.ACCOUNT_USAGE.STORAGE_USAGE
WHERE usage_date >= DATEADD(MONTH, -3, CURRENT_DATE())
ORDER BY usage_date;-- ウェアハウス別の日次クレジット消費
SELECT
start_time::DATE AS usage_date,
warehouse_name,
SUM(credits_used) AS total_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
WHERE start_time >= DATEADD(MONTH, -1, CURRENT_TIMESTAMP())
GROUP BY 1, 2
ORDER BY total_credits DESC;-- 過去30日間の権限変更履歴
SELECT
created_on,
privilege,
granted_on,
name AS object_name,
granted_to,
grantee_name,
granted_by
FROM SNOWFLAKE.ACCOUNT_USAGE.GRANTS_TO_ROLES
WHERE created_on >= DATEADD(DAY, -30, CURRENT_TIMESTAMP())
AND deleted_on IS NULL
ORDER BY created_on DESC;Security & Governance
問題 1
セキュリティチームが過去90日間のログイン失敗履歴を分析して不正アクセスの兆候を検出したい。INFORMATION_SCHEMA.LOGIN_HISTORY()テーブル関数を使用したところ、14日以前のデータが取得できなかった。最も適切な対応はどれか。
正解: B
INFORMATION_SCHEMAのテーブル関数は保持期間が7〜14日に限定されるため、90日前のデータは取得できません。SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORYビューは365日間の履歴を保持しているため、過去90日間の分析に対応できます。AのDATA_RETENTION_TIME_IN_DAYSはTime Travel用のパラメータでありINFORMATION_SCHEMAの保持期間には影響しません。CのTime TravelはINFORMATION_SCHEMAには適用できません。
ACCOUNT_USAGEのデータ反映が遅延する理由は何ですか?
ACCOUNT_USAGEスキーマのビューは、Cloud Services Layerで集約・最適化された後にSNOWFLAKE共有データベースに書き込まれるため、実際のイベント発生から最大45分〜2時間(ビューによって異なる)の遅延があります。たとえばQUERY_HISTORYは最大45分、LOGIN_HISTORYは最大2時間、STORAGE_USAGEは最大3時間の遅延が発生します。リアルタイムに近い情報が必要な場合はINFORMATION_SCHEMAのテーブル関数を使用してください。ただしINFORMATION_SCHEMAの保持期間は7〜14日に限定されます。
ACCOUNT_USAGEにアクセスするにはどのロールが必要ですか?
デフォルトではACCOUNTADMINロールのみがSNOWFLAKE.ACCOUNT_USAGEスキーマへのアクセス権を持っています。他のロールにアクセスを許可するには、ACCOUNTADMINで GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO ROLE <role_name> を実行します。セキュリティ上の理由から、すべてのユーザーにACCOUNTADMINを付与するのではなく、監視専用のカスタムロールを作成して必要なビューのみにアクセスさせることが推奨されます。
ORGANIZATION_USAGEとACCOUNT_USAGEの違いは何ですか?
ACCOUNT_USAGEは単一アカウント内のメタデータ・利用履歴を提供するのに対し、ORGANIZATION_USAGEはOrganization配下の全アカウントの利用状況を横断的に集約します。ORGANIZATION_USAGEにはUSAGE_IN_CURRENCY_DAILY(日次の利用金額)やWAREHOUSE_METERING_HISTORY(全アカウントのウェアハウスクレジット)などのビューが含まれ、組織全体のコスト管理やチャージバックに活用されます。ORGADMINロールでのみアクセス可能です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...