代码之家  ›  专栏  ›  技术社区  ›  Bartłomiej Sobieszek

PostgreSQL子查询/CTE是否缓存?

  •  2
  • Bartłomiej Sobieszek  · 技术社区  · 6 年前

    几个例子

    -- Simple query
    SELECT * FROM (
        SELECT * FROM accounts
    ) AS subquery;
    
    -- Subquery with function
    SELECT * FROM (
        SELECT AVG(id_groups) FROM accounts
    ) AS subquery;
    
    -- More messy queries
    SELECT * FROM (
      SELECT id_groups, AVG(id_accounts) OVER (PARTITION BY id_groups)
      FROM accounts
    ) AS subquery
    GROUP BY subquery.id_groups, subquery.avg;
    

    而且

    两者有区别吗

    SELECT * FROM (
        SELECT * FROM accounts
    ) AS subquery;
    

    以及

    WITH everything_about_accounts AS (
        SELECT * FROM accounts
    )
    SELECT * FROM everything_about_accounts;
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Laurenz Albe    6 年前

    FROM 条款:

    子查询将 每返回一行执行一次;在这种情况下这是没有意义的。

    在您介绍的三种情况下,PostgreSQL甚至 子查询:优化器意识到子查询是不必要的,并相应地转换查询。

    使用 EXPLAIN

    关于CTE:

    与中的子查询不同 条款,CTE作为

    相反,CTE被执行,结果 物化 ,查询执行 CTE扫描 具体化的结果。

    看它的实际行动。

    PostgreSQL社区正在努力消除cte总是具体化的限制(或特性,因为这是一种指导优化器的方法)。