2010-08-04 63 views
10

我正在創建一個具有一些複雜的底層關聯的Web應用程序。爲了解決我遇到的幾個問題,我創建了一個UNION視圖。可能還有很多其他方法可以解決這個問題。是否每次查詢PostgreSQL VIEWS時都會新建它們?

但我現在正在考慮我的設計的效率,並且我想知道每次查詢時新創建的視圖,還是隻創建一次,並且保持更新。

詳細說明,如果我有table_a(100條記錄)和table_b(100條記錄)並且創建了一個UNION視圖,那麼我創建了一個包含200條記錄的視圖。

這個整個過程是否會在每次對視圖進行選擇時發生?

很明顯,每次我更新底層表記錄時,視圖都會更新,但視圖是更新這一個記錄還是重新創建整個視圖?

Dale

+0

另外,一個'INSERT'一次只能影響一個表,所以如果你的視圖在多個表上執行'JOIN',你的'INSERT'只能列出其中一個表的列。 – JohnB 2010-08-17 17:56:59

回答

12

一個視圖只不過是一個具有名稱的查詢而已。有可能的性能相關的優化,有些DBMS比其他DBMS更好地實現(pgSQL似乎在更好的一面),如重用查詢計劃,緩存訪問控制等。

但是,在他們一天結束時,幾乎總是,你可以期待一個視圖的行爲就像直接發佈SQL一樣。不同之處在於,您可以授予對此查詢的訪問權限,而不授予對基礎表的訪問權限。

有一些優化可以改變行爲(使它們變成半個表),並且可能存在或不存在於pgSQL中,比如物化視圖(對於pgSQL抱歉不知道),但這只是挑剔。

3

這個整個過程是否每次都是針對視圖進行選擇?

是。
非物化視圖(PostgreSQL不支持實體化視圖)只是一個準備好的SQL語句 - 通過用包含視圖所基於的SELECT的子查詢替換視圖引用,您將獲得相同的性能。

這就是爲什麼基於支持表的值每次在視圖上運行查詢時都會出現,我不清楚在PostgreSQL中是否可以在不刷新視圖的情況下使列操作可見 - IE:如果您創建基於視圖的在SELECT * FROM table_x上,然後在table_x中添加或刪除一列 - 大多數數據庫將要求您刷新視圖以通過視圖查看更改。

建議在意見之上的意見應該是不鼓勵 - 他們脆弱;如果出現問題,直到運行依賴於另一個視圖的視圖纔會知道。沒有性能上的提升 - 反而是相反的。代碼重用在基於SET的環境中表現不佳...

+6

自9.3開始Postgres支持物化視圖http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html – 2015-08-10 00:52:56

3

使用EXPLAIN查看VIEW是如何執行的,您將看到與普通查詢相同的結果。

EXPLAIN 
SELECT * FROM name_of_your_view WHERE foo = 23; 

PostgreSQL將試圖優化內部查詢,甚至當你加入意見,有意見使用其他視圖等,儘量避免其中的一種觀點被執行的情況之前,優化器可以做到這一點的(大)工作。在使用內部嵌套視圖時,聚合,ORDER BY和LIMIT是潛在問題的示例。只需使用EXPLAIN即可查看發生了什麼。

+0

謝謝弗蘭克。試圖使用EXPLAIN方法,但我沒有得到任何明智的答覆。 我現在明白一個View實際上只是一個查詢語句。 我現在想知道的是, - 如果我對視圖執行選擇,查詢是否首先查找所有行以創建視圖,然後查看所有行以進行選擇?還是比這更有效率? – Oscar 2010-08-04 06:31:02

+0

這是我做的EXPLAIN查詢: EXPLAIN SELECT * FROM person_roles WHERE person_id = 3; 而這是結果: 排序(成本= 2.95..2.97行= 9寬度= 42) 排序鍵:public.links.created_at - > HashAggregate(成本= 2.71..2.80行= 9寬度= 42) - >追加(成本= 0.00..2.46行= 9寬度= 42) - >鏈接上的Seq掃描(成本= 0.00..1.19行= 5寬度= 42) 過濾器:(origin_id = 3) - > Seq掃描鏈接(成本= 0.00..1.19行= 4寬度= 42) 過濾器:(rcvd_id = 3) – Oscar 2010-08-04 06:31:38

+0

PostgreSQL非常智能,不用擔心。優化器檢查它對查詢中的表的統計信息,檢查可用的索引和WHERE語句。優化器會重寫您的查詢,然後發現哪些查詢計劃最快。在你的情況下,它使用順序掃描並且不使用任何索引。我猜數據量是非常有限的,但它也可能是你沒有索引的列origin_id和rcvd_id。查看http://www.postgresql.org/docs/current/interactive/planner-stats-details.html,瞭解工作情況。 – 2010-08-04 06:42:45

相關問題