admin

在WITH子句中添加无关表是否会减慢PostgreSQL中的查询速度?

sql

我有一个(可能)关于Postgres如何执行包含WITH子句的查询的基本问题。我想知道WITH子句中是否包含无关表实际上会减慢查询速度。也就是说,如果在WITH子句中从未调用过在子句中创建的“临时”表,那么该“临时”表是否WITH实际上已创建?

在第一个示例中,我将WITH联接使用子句创建的两个“临时”表:

--Example 1
WITH temp1 as (
SELECT * from table_1
),
temp2 as (
select * from table_2
)
select * 
from temp1
join temp2;

在第二个示例中,除了在WITH子句中创建了一个多余的表“ temp3”之外,我正在执行完全相同的查询。

--Example 2
WITH temp1 as (
SELECT * from table_1
),
temp2 as (
select * from table_2
),
temp3 as (
select * from table_3
)
select * 
from temp1
join temp2;

这两个查询之间是否有性能差异?如果table_3表很大,这是否会使示例2和示例1中的查询速度变慢?如果没有,为什么不呢?

似乎它 不会 影响查询时间。我仍然对为什么感到好奇,尽管…


阅读 154

收藏
2021-06-07

共1个答案

admin

您可以使用Explain来显示查询优化器将如何处理您的查询。

http://www.postgresql.org/docs/9.2/static/sql-
explain.html

在上述情况下,PSQL应该看到未使用temp3,并且不包括它。

在一个我的数据库上使用上面的示例。

explain with temp1 as (select * from cidrs), temp2 as (select * from contacts), temp3 as ( select * from accounts )  select * from temp1 join temp2 on temp1.id = temp2.id;
                             QUERY PLAN
---------------------------------------------------------------------
 Hash Join  (cost=22.15..25.44 rows=20 width=4174)
   Hash Cond: (temp1.id = temp2.id)
   CTE temp1
     ->  Seq Scan on cidrs  (cost=0.00..11.30 rows=130 width=588)
   CTE temp2
     ->  Seq Scan on contacts  (cost=0.00..10.20 rows=20 width=3586)
   ->  CTE Scan on temp1  (cost=0.00..2.60 rows=130 width=588)
   ->  Hash  (cost=0.40..0.40 rows=20 width=3586)
         ->  CTE Scan on temp2  (cost=0.00..0.40 rows=20 width=3586)
(9 rows)

您会发现没有提及temp3。在回答您的编辑为何不影响查询时间的问题时,优化器足够聪明,可以看到它没有被使用,也不会理会它。因此,它是优化程序的原因。

2021-06-07