PostgreSQL 9.6查看性能&副作用

时间:2017-08-17 12:33:29

标签: sql postgresql postgresql-9.6

我们的项目使用不同的模式来保持组织和安全。我们GRANT访问整个模式,而不是选择可能导致无意中泄露数据的单个组件。此外,如果我们可以从单个模式编写查询,它将使我们的生活更轻松,因为它有助于可维护性和错误减少。

例如,schema_fooschema_bar包含原始规范化数据(最终用户无法访问),schema_baz包含从{{返回数据的函数(可由最终用户访问)的函数) 1}}和schema_foo。当schema_barschema_foo中的数据在交付给最终用户之前需要处理时,这是有意义的;但是,在某些情况下,不需要额外的处理。

在这种情况下,在schema_bar中简单地调用schema_bazschema_foo中的表格来制作视图是否有意义?如果是,那么两者之间的性能差异/副作用是什么?

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; 来识别每一列?

注意:生成的视图也会用于其他查询。我知道查询规划器很棒;但是,我担心(ab)使用视图可能会产生意想不到的后果,其唯一目的是使表格可以从另一个模式访问。

2 个答案:

答案 0 :(得分:1)

我的经验倾向于"如果有疑问,请明确"。在生产系统中使用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版本,但如果其他版本的工作方式不同,我会感到惊讶。

答案 1 :(得分:0)

是的,表格经常可以改变。如果您只是编写*,那么如果在基表中添加或删除列会怎么样?您的视图会在您不知情的情况下发生变化。

最佳做法是在编写任何类型的视图时始终列出列名称。