在PostgreSQL中哪个是更好的CTE或内部选择

时间:2014-09-04 11:24:43

标签: sql postgresql subquery common-table-expression

以下是我的两个不同查询执行的示例,其中包含相同的结果

使用内部选择选择查询

   select p.product from
   (
      select * from tbl_a where productid not in (select productid from tbl_b)
   ) p 
   order by p.product

使用 CTE 选择查询

   with cte as 
   (
   select * from tbl_a where productid not in (select productid from tbl_b)
   )
   select product from cte order by product
  • 所以我的问题是以上哪个好用?在什么条件下可以使用它们?

1 个答案:

答案 0 :(得分:1)

Postgres始终实现CTE,这意味着CTE版本具有读取和写入数据的额外开销。 (注意:在其他数据库中不一定如此。)Postgres不(必然)实现子查询,因此版本应该更快。

编写此查询的更好方法是完全省略子查询/ CTE:

  select a.product
  from tbl_a a
  where a.productid not in (select productid from tbl_b)
  order by a.product;

(我忽略not existsleft outer join实际上是否会优于not in。)

在编写查询时,没有使用CTE而不是子查询的一般规则。这取决于很多因素,特别是基础表是否被索引以及CTE在查询中出现的次数。