[英]PostgreSQL 9.6 View Performance & Side Effects
我們的項目使用不同的架構來保持事物的組織性和安全性。 我們GRANT
訪問整個架構而不是選擇這可能導致數據的無意泄漏單個組件。 此外,如果我們可以從單個模式編寫查詢,這將使我們的生活更加輕松,因為這將有助於維護和減少錯誤。
例如, schema_foo
和schema_bar
包含原始規范化數據(最終用戶無法訪問),而schema_baz
包含從schema_foo
和schema_bar
返回數據的函數(最終用戶可以訪問)。 當schema_foo
和schema_bar
數據需要在交付給最終用戶之前進行處理時, schema_foo
schema_bar
。 但是,在某些情況下,不需要其他處理。
在這種情況下,在schema_baz
僅通過調用schema_foo
或schema_bar
的表來創建視圖是否schema_bar
,如果這樣,兩者之間的性能差異/副作用是什么?
SELECT * FROM schema_foo.table_bin;
和
CREATE VIEW schema_baz.view_bin AS SELECT * FROM schema_foo.table_bin;
SELECT * schema_baz.view_bin;
如果可以接受,那么通過名稱而不是*
標識每個列是否更好(出於任何原因)?
注意:結果視圖也將在其他查詢中使用。 我知道查詢計划器很棒; 但是,我擔心(濫用)僅出於使表可從另一模式訪問的目的而使用視圖可能會產生意想不到的后果。
我的經驗傾向於“如有疑問,請明確表達”。 在生產系統中使用select *
通常只是在尋求麻煩。
同樣,在Postgres中將列添加到基表中也不會更改視圖中的列-它們不會神奇地出現。 舉個例子:
(postgres@lh:5432) # create table foo (col1 integer, col2 text);
CREATE TABLE
(postgres@lh:5432) # create view bar as select * from foo;
CREATE VIEW
(postgres@lh:5432) # alter table foo add col3 date;
ALTER TABLE
(postgres@lh:5432) # insert into foo values (1, 'One', current_date);
INSERT 0 1
(postgres@lh:5432) [~] # select * from foo;
col1 | col2 | col3
------+------+------------
1 | One | 2017-08-17
(1 row)
(postgres@lh:5432) # select * from bar;
col1 | col2
------+------
1 | One
(1 row)
這是9.5版,但如果其他版本的工作方式有所不同,我會感到驚訝。
是的,表可以而且確實經常改變。 如果您只寫*,那么如果在基表中添加或刪除列怎么辦? 您的視圖在您不知情的情況下發生了變化。
最佳做法是在編寫任何類型的視圖時始終列出列名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.