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)
答
在第一种情况时,PostgreSQL “变平”子查询,以便它可以被优化更好。结果等同于第二个查询。
如果您想避免这种情况,请将优化屏障如OFFSET 0
放入子查询中。
查询(2)的任何输出都是查询(1)的有效输出(相反不成立),因此Postgresql可以选择为(1)提供与(2)相同的输出,因此执行的操作相同计划。 –
当然,他们使用相同的计划,因为他们正在做同样的事情。 –
SQL是***声明式***而非***势在必行***。这意味着SQL没有执行,它是一种允许你表达问题空间的语言,数据库引擎从那个问题声明中产生一个计划*(它选择自己的方式来解决它,通常使用成本估计)* 。在你的例子中,两个SQL语句都是相同的问题,所以可以用同样的方法解决。 – MatBailie