【问题标题】:Common table expressions (CTEs) with large tables大型表的公用表表达式 (CTE)
【发布时间】:2019-05-18 03:58:23
【问题描述】:

考虑使用 CTE 的以下格式的查询:

WITH
    t1 AS (SELECT some_data1 FROM some_table),
    t2 AS (SELECT some_data2 FROM t1)
SELECT some_data3 FROM t2;

问题一:

当查询被执行时,一个临时表t1被完全构建并保存在内存中,然后t2完全基于来自t1的数据构建,然后SELECT可以针对t2运行?

问题 2:

如果t1t2 是无法存储在内存中的大表,是否会将它们写入磁盘导致查询速度变慢?

问题 3:

对于大表是否应该避免这种类型的查询?

【问题讨论】:

标签: sql postgresql common-table-expression query-performance


【解决方案1】:

答案:

  1. 是的。在 PostgreSQL v11 之前,CTE 在 PostgreSQL 中实现。 v12 中的这一变化,从那个版本开始,您的查询可能会表现得更好。

    您可以通过EXPLAIN 查询来验证这一点。

  2. 是的。

  3. 是的。

【讨论】:

    【解决方案2】:
    1. 没有。您实际上可以添加更多 cte 而不是在底部的选择中使用它们,它们没有效果。查询优化器将它们变成最有效的连接并一起执行。因此,CTE 比临时表更好更快。

    2. 这可能是临时表的问题,但对于 CTE 没有问题。 CTE 只是表示在优化器知道您如何选择它们之前不会调用的数据的表达式。

    3. 不。事实上,如果你的桌子很大,这是代替诱惑桌子的方法。如果您无论如何都设置了正确的索引,则表大小应该无关紧要。 CTE 可以做到这一点,因此您不必处理稍后将在查询中过滤掉的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多