我有一个非常复杂的Oracle视图,基于其他物化视图,常规视图以及一些表(我无法"快速刷新"它).大多数情况下,此视图中的现有记录基于日期并且是"稳定的",新记录集具有新日期.
偶尔,我会收到回复日期.我知道那些是什么以及如果我维持一张桌子如何处理它们,但我想保持这个"观点".完全刷新大约需要30分钟,但任何给定日期只需25秒.
我是否可以指定只应更新物化视图的一部分(即受影响的日期)?
我是否必须废弃视图并使用表和过程来填充或刷新该表中的给定日期?
我有这样定义的物化视图:
CREATE MATERIALIZED VIEW M_FOO
REFRESH COMPLETE ON COMMIT
AS
SELECT FOO_ID, BAR
FROM FOO
WHERE BAR IS NOT NULL
GROUP BY FOO_ID, BAR
/
COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs';
Run Code Online (Sandbox Code Playgroud)
我写的是一种缓存:源表很大但不同对的数量相当小.我需要这些对来让他们与其他表联系起来.到目前为止一切都很好:它绝对可以加速查询
但我想确保视图不包含过时的数据.基础表每月修改四到五次,但我不一定知道何时.我知道可以定义物化视图,以便在源表更改时更新.但是,文档变得相当复杂.
我需要使用的确切语法是什么?
我是否需要创建物化视图日志?
快速刷新和完全刷新之间有什么区别?
我目前正在使用Postgres 9.3.3.
如果refresh是物化视图,那个物化视图上的索引是否也重新编制索引?或者索引是否需要手动重新编制索引?
在查看以下问题时,它看起来像它但没有答案,我似乎无法找到任何支持文档.
我有一个MATERIALIZED VIEW通过迁移创建的.
class MyView < ActiveRecord::Migration
def up
ActiveRecord::Base.connection.execute <<-SQL
CREATE MATERIALIZED VIEW my_view AS (
SELECT DISTINCT something, something_else, other.thing as real_thing, thing.some_id
FROM some_table
JOIN another_table on another_table.id = something
JOIN one_more_table on some_table.id = other_id
ORDER BY order_column)
WITH DATA;
SQL
add_index :table, [:key_part_one, :key_part_two]
end
...
end
Run Code Online (Sandbox Code Playgroud)
注意:我已经混淆了SELECT语句,只要相信我它的工作原理.
这里要注意的重要部分是我已经明确调用WITH DATA,因此应该立即填充和扫描视图.
这不会发生.迁移运行,如下所示
== MyView: migrating ========================
== MyView: migrated (0.0763s) ===============
Run Code Online (Sandbox Code Playgroud)
稍后db:refresh我们会看到以下内容
Reindexing Something...
Reindex queued
Reindexing Another...
Reindex queued
Reindexing …Run Code Online (Sandbox Code Playgroud) ruby postgresql activerecord ruby-on-rails materialized-views
官方PostgreSQL 9.3文档REFRESH MATERIALIZED VIEW尚未详细描述.
这篇博客的一句话:
Postgres 9.3中的物化视图有一个严重的限制,包括在刷新时使用独占锁.这基本上阻止了在使用来自其父关系的新数据刷新实体化视图时的任何尝试
邮件列表中发布的另一个引用:
如果我理解正确的事情,即使视图已经包含数据,REFRESH MATERIALIZED VIEW也会使用AccessExclusiveLock锁定物化视图.
我的问题:以下序列是否正确:
REFRESH MATERIALIZED VIEW.它会锁定视图,并等待所有使用matview运行的查询完成我有一个实用程序,使用以下内容来检查表的列:
select column_name, data_type from information_schema.columns
where table_name=%s
Run Code Online (Sandbox Code Playgroud)
如何将其扩展到物化视图的内省列?
postgresql materialized-views information-schema postgresql-9.3
我刚刚创建了表DEPT和EMP,如下所示:
create table DEPT
( dept_no number , dept_name varchar(32) , dept_desc varchar(32),
CONSTRAINT dept_pk Primary Key (dept_no) );
create table EMP
( emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no));
insert into dept values (10,'it','desc1');
insert into dept values (20,'hr','desc2');
insert into emp values (1,10);
insert into emp values (2,20);
Run Code Online (Sandbox Code Playgroud)
我使用rowid和物化视图在这些表上创建了物化视图日志,如下所示:
create materialized view log on emp with rowid;
create materialized view log on dept with rowid;
create materialized view empdept_mv refresh fast on commit as
select a.rowid …Run Code Online (Sandbox Code Playgroud) 目前我使用REFRESH ON DEMAND创建的Materialized视图,所以在这种情况下我需要使用以下命令显式刷新MV:
BEGIN DBMS_MVIEW.REFRESH('MV_DATA'); END;
Run Code Online (Sandbox Code Playgroud)
但是现在我需要每天刷新这个MV,所以任何人都可以帮忙写这个.我已经看到我们可以使用在MV本身中编写显式Job或使用COMPLETE/FAST REFRESH语句来刷新此MV.
提前致谢!
我正在尝试将pg_dump(v9.3.4)从一个db和pg_restore转换为另一个(v9.3.6).我有几个物化视图(一些具有索引,一些没有索引).我的一个物化视图被转储为一个表(我已经通过查看pg_dump输出确认了这一点).如何将其作为物化视图转储?
这是我在pg_dump输出中看到的内容:
CREATE TABLE my_mv (
/* ... */
);
/* ... */
CREATE INDEX my_mv_col_1_idx ON my_mv USING btree (col_1);
/* ... */
CREATE RULE "_RETURN" AS
ON SELECT TO my_mv DO INSTEAD WITH tmp_1 AS (
/* ... */
Run Code Online (Sandbox Code Playgroud)
我的其他MV看起来像这样:
CREATE MATERIALIZED VIEW my_good_mv AS
SELECT /* ... */
WITH NO DATA;
/* ... */
CREATE INDEX my_good_mv_job_col_1_idx ON my_good_mv USING btree (col_1);
/* ... */
REFRESH MATERIALIZED VIEW my_good_mv;
Run Code Online (Sandbox Code Playgroud)
我已经证实这是一个MV:
xxx=# SELECT relkind FROM pg_class WHERE oid …Run Code Online (Sandbox Code Playgroud) 这与我问的上一个问题有关,带有时间戳表达式的 Saved View,关于在(非物化)视图中存储信息。当用户执行以下操作时,数据将如何存储和检索:
CREATED MATERIALIZED VIEW mv AS SELECT person_id, name, NOW() as now FROM table
# is this more-or-less the same as:
# CREATED TABLE tb AS SELECT person_id, name, NOW() as now FROM table
# "AND UPDATE EVERY..."
Run Code Online (Sandbox Code Playgroud)
NOW()表达式是否作为值保存到存储中,或者是否在查询时为物化视图评估了任何函数?物化视图是否与表相同,它在存储级别进行了某种优化/刷新,还是我错过了这条船?
这里的这篇文章表明(至少从功能上讲)可以将物化视图模拟为带有触发器的表:https : //www.materialized.info/。
postgresql ×6
oracle ×5
activerecord ×1
indexing ×1
oracle10g ×1
partitioning ×1
pg-dump ×1
refresh ×1
ruby ×1
sql ×1
sql-server ×1
view ×1