Postgresql
視圖對 PostgreSQL 的性能有害嗎?
以下摘自一本關於 db design 的書(Beginning Database Design ISBN: 0-7645-7490-6):
使用視圖的危險在於過濾針對視圖的查詢,期望讀取非常大的表的一小部分。任何過濾都應該在視圖中完成,因為對視圖本身的任何過濾都是在視圖中的查詢完成執行後應用的。視圖通常可用於加快開發過程,但從長遠來看會完全破壞數據庫性能。
以下是 PostgreSQL 9.5 文件的摘錄:
自由使用視圖是良好 SQL 數據庫設計的一個關鍵方面。視圖允許您在一致的介面後面封裝表結構的細節,這些細節可能會隨著應用程序的發展而改變。
這兩個來源似乎相互矛盾(“不要用視圖設計”與“用視圖做設計”)。
但是,在 PG 中,視圖是使用規則係統實現的。因此,可能(這是我的問題)對視圖的任何過濾都被重寫為視圖內的過濾器,從而導致對基礎表執行單個查詢。
我的解釋是否正確並且 PG 將 WHERE 子句組合到視圖中和視圖之外?還是一個接一個地單獨執行它們?任何簡短的、獨立的、正確的(可編譯的)範例?
書錯了。
從視圖中選擇與執行底層 SQL語句一樣快或慢——您可以使用
explain analyze
.Postgres 優化器(以及許多其他現代 DBMS 的優化器)將能夠將視圖上的謂詞下推到實際的視圖語句中——只要這是一個簡單的語句(同樣,這可以使用 來驗證
explain analyze
)。關於性能的“壞名聲”——我認為——源於你過度使用視圖並開始建構使用視圖的視圖時使用視圖。與沒有視圖的手工定制的語句相比,這通常會導致語句做得太多,例如因為不需要一些中間表。在幾乎所有情況下,優化器都不夠聰明,無法刪除那些不需要的表/連接或將謂詞下推到多個視圖級別(其他 DBMS 也是如此)。