查询优化

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)

公用表表达式

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

  • 优点

    • 提升复杂查询的可读性
    • 可在同一查询内复用
    • 改善 SQL 结构组织
  • 缺点

    • 可能带来性能开销
    • 作用域仅限单个查询

子查询

  • 优点

    • 单次使用场景简单直接
    • 可灵活出现在 SQL 各部分
  • 缺点

    • 复杂时降低可读性
    • 深度嵌套可能有性能问题
Snowflake 中的数据建模入门

可视化查询执行时间

查询剖析页面

Snowflake 中的数据建模入门

术语与功能概览

  • 查询优化:微调查询以最大化效率与性能
  • 子查询:嵌入主查询的小查询,用于聚焦特定数据
  • 公用表表达式(CTE):查询期间的临时虚拟表
  • WITH .. AS:定义 CTE 的 SQL 命令
  • LIMIT:限制结果行数的 SQL 子句
  • HAVING:在聚合后筛选数据的 SQL 子句(如 SUM、MAX)
  • WHERE:分组前筛选行,提高效率的 SQL 子句
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...