2010-08-04 35 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

相关问题