子查询上的select *如何影响性能

时间:2018-01-22 18:29:03

标签: sql

我正在编写一个涉及使用WITH子句使用多个子查询的查询。

即。

WITH z as 
 (WITH x AS 
   (SELECT col1, col2 FROM foo LEFT JOIN bar on foo.col1 = bar.col1) 
  SELECT foo, bar 
  FROM x 
  INNER JOIN table2 
  ON x.col2 = table.col2)
SELECT *
FROM z
LEFT JOIN table3
ON z.col1 = table3.col2  

实际上,还有一些子查询和更多列。在子查询表(在本例中为x或z)上使用SELECT *是否存在任何性能问题?

我想避免在一个查询中多次重新键入相同的列名,但也需要优化性能。

1 个答案:

答案 0 :(得分:3)

答案取决于数据库。 CTE可以通过以下方式处理:

  • 实现中间表并存储结果
  • 将CTE代码与查询的其余部分合并
  • 结合这两种方法

在第一种方法中,额外的列可能会对性能产生很小的影响。在第二个,应该没有效果。

也就是说,通常支配查询性能的是joingroup by的工作。假设列不是非常大,我不担心在CTE中使用select *的性能影响。

我会问你如何写CTE。不需要嵌套的CTE,因为它们可以按顺序定义。