首页/数据/SQL 速查/CTE 物化与内联的选择
本包目录(311 条)

CTE 物化与内联的选择

CTE 是内联展开还是物化成临时结果会影响性能:PostgreSQL 12 起默认按引用情况决定,MySQL 由优化器自行决定。

SQL 速查数据更新于 2026-10-12

PostgreSQL 控制

PostgreSQL 控制
WITH heavy AS MATERIALIZED (
    SELECT user_id, COUNT(*) AS cnt
    FROM logs
    GROUP BY user_id
)
SELECT * FROM heavy WHERE cnt > 100;

WITH light AS NOT MATERIALIZED (
    SELECT * FROM small_table WHERE flag = 1
)
SELECT * FROM light l JOIN big b ON b.k = l.k;
PostgreSQL12 之前总是物化;12+ 默认内联,可用 MATERIALIZED / NOT MATERIALIZED 控制
MySQL无显式关键字,优化器决定合并或物化
判断看 EXPLAIN 中是否出现物化/临时表节点

易错点

  • 把 CTE 当“只算一次的缓存”是常见误解:PG 12+ 可能内联导致重复计算
  • 希望大聚合只执行一次时,显式写 MATERIALIZED(PG)或改用临时表

数据来源与参考

  • PostgreSQL Documentation · WITH Queries · Materialization
  • MySQL 8.0 Reference Manual · Optimizing WITH
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌