そもそもデータベースの種類を整理する

まず全体像を理解するために、データベースの用途を2つに分けて考える。

種類 目的 代表例
OLTP(トランザクション処理) アプリの日常的な読み書き MySQL, PostgreSQL
OLAP(分析処理) 大量データの集計・分析 Snowflake, BigQuery, Redshift

RailsアプリのメインDBはOLTP。SnowflakeはOLAPの代表格。


Snowflakeのアーキテクチャ

Snowflakeの最大の特徴は3層に分かれた構造

┌─────────────────────────────┐
│       クラウドサービス層       │  ← 認証・メタデータ管理・クエリ最適化
└─────────────────────────────┘
┌─────────────────────────────┐
│      コンピュート層           │  ← クエリの実行エンジン(仮想ウェアハウス)
│  [WH-A] [WH-B] [WH-C]      │  ← 複数同時に動かせる
└─────────────────────────────┘
┌─────────────────────────────┐
│       ストレージ層            │  ← データの保存(S3など)
└─────────────────────────────┘

ポイントはコンピュートとストレージが分離していること。

他のDBだとデータの保存場所と処理するサーバーが一体化していますが、Snowflakeは別々なので:

  • データはそのままでも、処理能力だけ増やせる
  • 処理していない時間はコンピュートを止めてコスト削減できる

仮想ウェアハウスとは

Snowflakeのコンピュートリソースの単位です。「処理するためのサーバー群」だと思ってください。

同じデータに対して複数のウェアハウスが同時アクセスできる

[分析チーム用WH]  ─┐
[ETLバッチ用WH]   ─┼── 同じストレージのデータを参照
[ダッシュボード用WH]─┘

サイズはXS〜4XLまであり、大きいほど処理が速いですが料金も上がります。クエリを投げていない時間は自動停止させることができる。


データの構造

SQL(RDB)と基本的に同じ構造なので、MySQLを知っていれば馴染みやすい。

アカウント
└── データベース(例: FACILO_DB)
    └── スキーマ(例: PUBLIC, ANALYTICS)
        └── テーブル(例: PROPERTIES, USERS)
            └── カラム・レコード

SQLもほぼ標準的なものが使える。

-- こんな感じで普通に書ける
SELECT
  prefecture,
  COUNT(*) AS property_count,
  AVG(price) AS avg_price
FROM properties
WHERE created_at >= '2024-01-01'
GROUP BY prefecture
ORDER BY property_count DESC;

Snowflake独自の便利機能

① タイムトラベル

過去のデータ状態に戻れます。誤ってDELETEしても復元可能。

-- 1時間前のデータを参照
SELECT * FROM orders AT(offset => -3600);

-- 特定時刻のデータを参照
SELECT * FROM orders AT(timestamp => '2024-01-01 12:00:00'::timestamp);

② ゼロコピークローン

データをコピーせずにテーブルやDBのクローンを作れます。ストレージコストをかけずに本番データのコピー環境を作れるので、テストに便利。

-- 本番DBのクローンを一瞬で作成
CREATE DATABASE dev_db CLONE prod_db;

③ ステージ

S3などのファイルをSnowflakeに取り込む仕組み。CSVやJSONをそのまま読み込んでSQLで扱えます。


データがSnowflakeに届くまでの流れ(全体像)

実際の現場ではこういう構成が多い。

[Railsアプリ]           [外部データ]
  MySQL/PostgreSQL   +   APIログ・CSVなど
         │                    │
         └──────┬─────────────┘
                ▼
         ETLツール(dbt, Airbyte, Embulkなど)
                │  データを変換・整形して流し込む
                ▼
          【Snowflake】
                │
         ┌──────┴──────┐
         ▼             ▼
    BIツール        データサイエンス
 (Looker, Metabase)  (Python分析など)

RailsアプリはMySQLで日常の読み書きをして、そのデータをSnowflakeにコピーして分析するという役割分担。


まとめ

項目 内容
何者か クラウド型データウェアハウス
何に使うか 大量データの分析・集計
Railsとの関係 メインDBとは別で、分析専用に使う
強み スケーリング容易・運用不要・SQL標準対応
キーワード 仮想ウェアハウス・タイムトラベル・ゼロコピークローン

参考文献