Oracle中的视图和物化视图有什么区别?
PostgreSQL是否支持计算/计算列,如MS SQL Server?我在文档中找不到任何内容,但由于此功能包含在许多其他DBMS中,我认为我可能会遗漏某些内容.
postgresql materialized-views calculated-columns sql-view generated-columns
我在PostgreSQL 9.3数据库上有一个物化视图,该数据库很少发生变化(大约每天两次).但是当它发生时,我想及时更新其数据.
以下是我到目前为止的想法:
有一个物化视图mat_view
,它从表中获取数据table1
并table2
使用一些连接语句.
无论何时进入table1
或table2
更改,我已经有一个触发器更新一个config
由...组成的配置表
table_name | mat_view_name | need_update
-----------+---------------+------------
table1 | mat_view | TRUE/FALSE
table2 | mat_view | TRUE/FALSE
Run Code Online (Sandbox Code Playgroud)
因此,如果有任何table1
更改(每个语句的UPDATE和DELETE都有触发器),need_update
则第一行中的字段设置为TRUE
.同样适用table2
于第二行.
显然,如果need_update
为TRUE,则必须刷新实体化视图.
更新:由于物化视图不支持规则(如下面评论中提到的@pozs),我会更进一步.我创建了一个v_mat_view
带有定义" SELECT * FROM mat_view
" 的虚拟视图.当用户在此视图上执行SELECT时,我需要创建一个ON SELECT规则,它执行以下操作:
mat_view
应该更新(SELECT 1 FROM config WHERE mat_view_name='mat_view' AND need_update=TRUE
)need_update
标志UPDATE config SET need_update=FALSE where mat_view_name='mat_view'
REFRESH MATERIALIZED VIEW …
我尝试使用以下方法刷新物化视图:
DBMS_MVIEW.REFRESH('v_materialized_foo_tbl')
Run Code Online (Sandbox Code Playgroud)
但是它抛出了无效的sql语句.
然后我创建了一个这样的存储过程:
CREATE OR REPLACE
PROCEDURE MAT_VIEW_FOO_TBL
IS
BEGIN
DBMS_MVIEW.REFRESH('v_materialized_foo_tbl')
END MAT_VIEW_FOO_TBL IS;
Run Code Online (Sandbox Code Playgroud)
此过程已成功创建,但在我调用此过程时
MAT_VIEW_FOO_TBL;
Run Code Online (Sandbox Code Playgroud)
它再次抛出错误.
请为此问题提出解决方案.
谢谢,Srinivas
我很清楚为什么物化视图比查询基表更可取.不仅仅是创建另一个具有与MV相同数据的表的优势还不是很清楚.MV的唯一优势是否只是易于创建/维护?
是不是MV等效于具有匹配模式的表和使用MVs SELECT语句的INSERT INTO?
意思是,您可以按如下方式创建MV
CREATE MATERIALIZED VIEW ... AS
SELECT * FROM FOO;
Run Code Online (Sandbox Code Playgroud)
您可以创建一个等效表:
CREATE TABLE bar (....);
INSERT INTO bar
SELECT * FROM FOO;
Run Code Online (Sandbox Code Playgroud)
并不是说创造/维护的便利性不足,我只是想确保我没有遗漏任何东西.
我需要调用REFRESH MATERIALIZED VIEW
所涉及的表的每次更改,对吧?我很惊讶在网上找不到这方面的讨论.
我应该怎么做呢?
我认为答案的上半部分是我正在寻找的:https://stackoverflow.com/a/23963969/168143
这有什么危险吗?如果更新视图失败,是否会回滚调用更新,插入等事务?(这是我想要的......我想)
我从2005年开始在MySQL论坛上发帖,但没有比这更新的了.基于此,这是不可能的.但是很多都可以在3 - 4年内改变.
我正在寻找的是一种方法,在视图上有一个索引,但是查看的表仍然没有索引.索引会损害写入过程,并且会经常写入此表(直到索引将所有内容减慢到爬行的程度).但是,缺少索引会使我的查询变得非常缓慢.
我使用"自定义"格式(-Fc)的pg_dump创建了数据库转储.此格式允许使用"jobs"选项(-j8)调用pg_restore.作业选项启动8个进程,并在10分钟内恢复数据库中的绝大多数关系.
我留下了4个进程.其中一个是物化视图的刷新,另外三个是应用于物化视图用作数据源的3个表的索引.索引根据pg_stat_activity"等待",可能是因为REFRESH
物化视图仍在访问源表.
索引到位后,视图的刷新只需几分钟.因为索引在这期间没有到位,所以REFRESH
我REFRESH
在17小时后关闭了这个过程,这使得pg_restore失败了.
我怎么能够
REFRESH MATERIALIZED VIEW
声明并将其扔进垃圾桶或任何其他完成工作的解决方案?
我目前访问了一系列观点和物化观点.具体化由第三方维护,第三方提供关于实现的频率和成功的信息很少.最近,物化视图无法刷新,我发送了大量报告,其中包含不正确/延迟的数据.
目前我正在查询我打算用什么来确定何时在事务系统中发生最新更新,如果它还没有刷新,那么剩下的代码就不会执行,但是这会浪费很多精力并且有时会导致一个不正确的假设(物化视图可能已刷新,但没有进行额外的事务 - 因此代码的其余部分不执行),我宁愿另一种方法.
有没有办法确定是否使用Oracle系统表刷新了物化视图?如果没有,有没有人有任何想法我怎么会这样做,而不必联系第三方?
我在我的代码中创建了多个视图,每次运行代码时,我都想删除到目前为止生成的所有物化视图.是否有任何命令会列出Postgres的所有物化视图或删除所有这些视图?