2017-12-18 279 views
-1

查詢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

回答

0

在第一種情況時,PostgreSQL 「變平」子查詢,以便它可以被優化更好。結果等同於第二個查詢。

如果您想避免這種情況,請將優化屏障OFFSET 0放入子查詢中。