Postgresql的不同查询为何同样解释?

问题描述:

查询1:Postgresql的不同查询为何同样解释?

select c_bh,c_xzdm,c_twhbm,d_tjrq 
from (
    select c_bh,c_xzdm,c_twhbm,d_tjrq 
    from t_table 
    order by d_tjrq desc 
) t1 
limit 10 

问题2:

select c_bh,c_xzdm,c_twhbm,d_tjrq 
from t_table 
order by d_tjrq desc 
limit 10 

相同的计划:

Limit (cost=0.44..18.79 rows=10 width=59) 
    -> Index Scan using i_t_table_d_tjrq on t_table (cost=0.44..32135085.58 rows=17507700 width=59) 
+0

查询(2)的任何输出都是查询(1)的有效输出(相反不成立),因此Postgresql可以选择为(1)提供与(2)相同的输出,因此执行的操作相同计划。 –

+0

当然,他们使用相同的计划,因为他们正在做同样的事情。 –

+1

SQL是***声明式***而非***势在必行***。这意味着SQL没有执行,它是一种允许你表达问题空间的语言,数据库引擎从那个问题声明中产生一个计划*(它选择自己的方式来解决它,通常使用成本估计)* 。在你的例子中,两个SQL语句都是相同的问题,所以可以用同样的方法解决。 – MatBailie

在第一种情况时,PostgreSQL “变平”子查询,以便它可以被优化更好。结果等同于第二个查询。

如果您想避免这种情况,请将优化屏障OFFSET 0放入子查询中。