查詢最佳化

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 資料建模入門

Common Table Expressions(CTE)

CTE

Snowflake 資料建模入門

Common Table Expressions(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

  • 優點

    • 提升複雜查詢的可讀性
    • 可在同一查詢中重複使用
    • 改善 SQL 查詢的結構組織
  • 缺點

    • 可能帶來效能負擔
    • 僅限單一查詢的使用範圍

子查詢

  • 優點

    • 單次用途時簡潔直觀
    • 可彈性出現在 SQL 敘述的各部分
  • 缺點

    • 複雜時可讀性下降
    • 巢狀層級可能造成效能問題
Snowflake 資料建模入門

視覺化查詢執行時間

查詢剖析頁面

Snowflake 資料建模入門

術語與函式總覽

  • 查詢最佳化:微調查詢以提升效率與效能
  • 子查詢:巢狀於主查詢中的小查詢,用於鎖定特定資料
  • Common Table Expressions(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 資料建模入門

一起來練習吧!

Snowflake 資料建模入門

Preparing Video For Download...