クエリ最適化

Snowflakeで学ぶデータモデリング入門

Nuno Rocha

Director of Engineering

クエリ実行順序

クエリ実行順序、フルクエリ

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (1)

クエリ実行順序:FROM

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (2)

クエリ実行順序:JOIN

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (3)

クエリ実行順序:WHERE

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (4)

クエリ実行順序:AGGREGATIONS

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (5)

クエリ実行順序:HAVING

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (6)

クエリ実行順序:SORT

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (7)

クエリ実行順序:LIMIT

Snowflakeで学ぶデータモデリング入門

クエリ実行順序 (8)

最終的なクエリ実行順序

  • ベストプラクティス:
    • SELECT * は避け、必要な列のみ指定
    • データ量削減のために LIMIT を活用
    • 早期に WHERE で行を絞り込み、メモリを節約
    • 絞り込んだデータに対して集計と GROUP BY を実施し処理を最適化
Snowflakeで学ぶデータモデリング入門

サブクエリ

サブクエリの概念図

Snowflakeで学ぶデータモデリング入門

サブクエリ

ホテルチェーンのロイヤルティデータモデル

Snowflakeで学ぶデータモデリング入門

サブクエリ

  • 1000ポイント超のロイヤルティを持つゲストを取得
SELECT *
FROM guests
WHERE id IN (SELECT guest_id 
                  FROM loyalty_program 
                  WHERE loyalty_points > 1000);
Snowflakeで学ぶデータモデリング入門

共通テーブル式(CTE)

CTE

Snowflakeで学ぶデータモデリング入門

共通テーブル式(CTE)

  • 直近の予約詳細を取得
WITH latest_booking AS (
    SELECT guest_id, 
           MAX(checkout_date) AS latest_checkout
    FROM booking_details
    GROUP BY guest_id
)
SELECT bd.*, 
       bd.checkout_date AS latest_booking_date
FROM booking_details bd
    JOIN latest_booking lb 
        ON bd.guest_id = lb.guest_id 
        AND bd.checkout_date = lb.latest_checkout;
Snowflakeで学ぶデータモデリング入門

CTEとサブクエリ

CTE

  • 長所

    • 複雑なクエリの可読性が向上
    • 同一クエリ内で再利用可能
    • 構造化しやすい
  • 短所

    • 追加のオーバーヘッドが発生する場合あり
    • 1つのクエリ内に限定

サブクエリ

  • 長所

    • 単発用途に簡潔で直接的
    • SQL文の様々な位置で柔軟に使用可能
  • 短所

    • 複雑になると可読性が低下
    • 入れ子で性能低下の恐れ
Snowflakeで学ぶデータモデリング入門

クエリ実行時間の可視化

クエリプロファイル画面

Snowflakeで学ぶデータモデリング入門

用語と機能の概要

  • クエリ最適化: 効率と性能を最大化するようクエリを調整
  • サブクエリ: 主クエリ内で特定データに焦点を当てる小さなクエリ
  • 共通テーブル式 (CTE): クエリ中の一時的な仮想テーブル
  • WITH .. AS: CTE を定義するSQL構文
  • LIMIT: 返す行数を制限する句
  • HAVING: SUM や MAX などの集計後にフィルタする句
  • WHERE: グループ化前に行を絞り、効率を向上
Snowflakeで学ぶデータモデリング入門

CTEとサブクエリのひな形

  • サブクエリ
SELECT *
FROM table_name
WHERE column_name IN (SELECT column_name 
                  FROM table_name
                  WHERE column_name condition value);
  • CTE
WITH latest_booking_dates AS (
    SELECT column_name
    FROM table_name)
SELECT *
FROM table_name a
    JOIN other_table_name b 
    ON a.key_column = b.key_column;
Snowflakeで学ぶデータモデリング入門

Passons à la pratique !

Snowflakeで学ぶデータモデリング入門

Preparing Video For Download...