PostgreSQL 9.6查看性能和副作用

PostgreSQL 9.6查看性能和副作用,sql,postgresql,postgresql-9.6,Sql,Postgresql,Postgresql 9.6,我们的项目使用不同的模式来保持事物的组织性和安全性。我们授予对整个模式的访问权,而不是选择可能导致数据意外泄漏的单个组件。此外,如果我们可以从一个模式编写查询,那么我们的生活会更轻松,因为这有助于维护性和减少错误 例如,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_foo和schema_bar中的数据在交付给最终用户之前需要处理时,这是有意义的;但是,在某些情况下,不需要额外处理

在这种情况下,在schema_baz中创建一个视图是否有意义,只需在schema_foo或schema_bar中调用该表,如果是这样,它们之间的性能差异/副作用是什么

SELECT * FROM schema_foo.table_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版,但如果其他版本的工作方式有所不同,我会感到惊讶。

这似乎是使用*的原因,因为我们不希望在多个地方进行相同的更改。本例中的视图仅用于使表可以从其他架构访问。为什么需要在多个位置进行更改?您只创建了一个视图,对吗?如果您说当基表改变时,您不想改变视图,这是很不幸的。在这种情况下,您可以使用*,但这不是最佳做法。在这种情况下,老实说,这听起来并不重要。哇。。。这是一个例外的反应。如果您对问题的第一部分有任何见解,即视图是否适合从另一个架构访问表,我很想听听。@losthorse-我认为性能不会是一个问题,尽管设置一个测试来验证这不是最糟糕的想法。在我看来,更大的问题是系统的可维护性—涉及多少架构/视图,它们多久更改一次,是否会在同义词视图之上构建其他视图,等等—如果这不是问题,那么。。。当然,为什么不呢。
(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)