关于数据库设计:每次查询PostgreSQL VIEWS都是新创建的吗?

Are PostgreSQL VIEWS created newly each time they are queried against?

我正在创建一个具有一些复杂的基础关联的Web应用程序。为了解决几个问题,我创建了一个UNION View。可能还有很多其他方法可以解决。

但是我现在正在考虑设计的效率,我想知道是否在每次查询时重新创建一个VIEW,还是仅创建一次并保持更新。

详细说明,如果我有table_a(100条记录)和table_b(100条记录)并创建UNION视图,那么我已经创建了一个包含200条记录的视图。

我每次对视图进行选择时,都会发生整个过程吗?

显然,每次我更新基础表记录时,视图都会更新,但是视图会更新该记录还是从头开始重新创建整个视图?

戴尔


视图不过是带有名称的查询。可能存在与性能相关的优化,某些DBMS的性能要优于其他DBMS(pgSQL似乎更好),例如重用查询计划,缓存的访问控制等。

但是,在一天结束时,几乎总是可以看到视图的行为类似于直接发布SQL。区别在于您可以授予对该查询的访问权限,而不必授予对基础表的访问权限。

您可以做一些优化来改变行为(使它们变成半个表的形式),并且在pgSQL中可能存在或不存在,例如物化视图(对pgSQL完全不了解),但这只是挑剔。 >


使用EXPLAIN查看如何执行VIEW,您将看到与普通查询相同的结果。

1
2
EXPLAIN
SELECT * FROM name_of_your_view WHERE foo = 23;

PostgreSQL将尝试优化内部查询,即使您加入视图,使用其他视图使用视图等也是如此。请尝试避免在优化器完成其(出色)工作之前必须执行VIEW的情况。聚合,ORDER BY和LIMIT是在内部嵌套视图中使用时潜在问题的示例。只需使用EXPLAIN即可查看发生了什么。


Does this whole process occur each time I do a select against the View?

是的。
非实例化视图(PostgreSQL不支持实例化视图)只是准备好的SQL语句-通过用包含该视图所基于的SELECT的子查询替换视图引用,您将获得相同的性能。 >

这就是为什么每次在视图上运行查询时都会显示基于支持表的值的原因,我不清楚在不刷新视图的情况下是否在PostgreSQL中使列操作可见-IE:如果创建基于视图的视图在SELECT * FROM table_x上,然后在table_x中添加或删除列-大多数数据库将要求您刷新视图以通过视图查看更改。

不建议在视图之上构建视图-它们太脆弱了;如果有问题,您将无法运行直到依赖于另一个视图。而且没有性能提升-相反。代码重用在基于SET的环境中表现不佳...