我想使用刷新的物化视图ON COMMIT。我的支持视图通过 DB Link 连接本地数据库中的两个表和远程数据库中的一个表。如何仅在对两个本地表之一进行更改时才刷新视图?
还有其他方法可以解决这个问题吗?我可以让物化视图只连接两个本地表并为远程数据库中的列设置 NULL,然后在插入/更新物化视图时使用触发器来填充这些字段吗?或者物化视图的更新是否传播回源表?
我正在做这样的事情:
SELECT LOC1.ID, LOC1.NAME, LOC2.PRICING_TYPE, REM1.PURCHASING_ID
FROM LOCAL_TABLE_A LOC1, LOCAL_TABLE_B LOC2, REMOTE_TABLE@SOMEDB.WORLD REM1
WHERE LOC1.ID = LOC2.MASTER_ID
AND LOC1.REM_ID = REM1.ID
AND LOC2.YEAR = REM1.YEAR
Run Code Online (Sandbox Code Playgroud)
这REMOTE_TABLE只是与两个本地表相关的信息的查找表。它不应该在这里驱动任何东西,我只希望物化视图在LOCAL_TABLE_AOR LOCAL_TABLE_BCHANGE 时更新。
我想在不丢失数据的情况下更改 PostgreSQL 10.1 物化视图的名称。刷新这个物化视图需要 12 多个小时。
因此,为了测试更改物化视图语句,我WITH NO DATA在定义中包含该子句的不同物化视图上进行了尝试。
当我运行命令时:
ALTER MATERIALIZED VIEW etl.mv_test
RENAME to etl.vw_test
Run Code Online (Sandbox Code Playgroud)
该WITH NO DATA条款已更改为WITH DATA。所以我假设视图会被刷新。是否可以将WITH NO DATA条款保留在更改后的视图中?
如何在Postgres中的物化视图上创建主键?
ALTER MATERIALIZED VIEW my_mat_view ADD PRIMARY KEY (id)
Run Code Online (Sandbox Code Playgroud)
返回错误:
Error in query: ERROR: "my_mat_view" is not a table
Run Code Online (Sandbox Code Playgroud) 出于性能原因,我的数据库中有一个物化视图。环境的约束已经改变,现在我需要使更新出现得更快,视图本身的性能不再那么重要。如何将物化视图更改为常规视图?寻找类似的东西:
ALTER MATERIALIZED VIEW viewname TO VIEW
Run Code Online (Sandbox Code Playgroud) 拥有包含几百万行的超表。我可以使用以下命令来选择它的大小:
SELECT pg_size_pretty( pg_total_relation_size('towns') );
我还有该超表的连续聚合:
WITH (timescaledb.continuous, timescaledb.materialized_only=true) AS
SELECT time_bucket(INTERVAL '1 minute', timestamp) AS bucket,
/* random query */
FROM towns
GROUP BY bucket, town
WITH NO DATA;
Run Code Online (Sandbox Code Playgroud)
我已刷新视图,数据按预期显示。然而,我似乎无法弄清楚这个新视图占用了多少空间。
SELECT pg_size_pretty( pg_total_relation_size('towns_income') );返回 0 字节,我知道这是不正确的。我认为也许 Total_relation_sizetowns会增加,但这似乎也是一样的。我错过了什么吗?我也尝试过hypertable_size但没有成功,因为 mv 从技术上讲并不是一个超表。
postgresql materialized-views timescaledb continuous-aggregates
我正在尝试在我的应用程序中调整物化视图.我开始执行:
dbms_advisor.tune_mview()
Run Code Online (Sandbox Code Playgroud)
过程,并将以下代码写入Oracle SQL Developer的SQL_Worksheet:
variable mvtask varchar2(100);
variable mvddl varchar2(4000);
execute :mvtask := 'MV_FOO_BAR';
execute select query into :mvddl from user_mviews where view_name = 'MV_FOO_BAR';
execute dbms_advisor.tune_mview(:mvtask, :mvddl);
select * from user_tune_mview;
Run Code Online (Sandbox Code Playgroud)
显然,已经创建了物化视图(refresh fast on commmit然而,其运行速度令人无法接受地慢).顾问报告以下错误:
Error report: ORA-13600: error encountered in Advisor QSM-03112: Invalid CREATE MATERIALIZED VIEW statement ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86 ORA-06512: at "SYS.PRVT_ACCESS_ADVISOR", line 202 ORA-06512: at "SYS.PRVT_TUNE_MVIEW", line 1026 ORA-06512: at "SYS.DBMS_ADVISOR", line 754 ORA-06512: at line 1 13600. 00000 - "error …
如果我在Oracle中有物化视图,定义为REFRESH FAST ON COMMIT每15分钟一次.它在最初创建和快乐刷新时有效.什么可以导致它停止快速刷新?
我可以看到它已基于此停止刷新:
select mview_name, last_refresh_date from all_mviews;
Run Code Online (Sandbox Code Playgroud) 我试图在物化视图上执行刷新,但我无法编译脚本.
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
exec DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Run Code Online (Sandbox Code Playgroud)
我收到消息:
ORA-06550:第3行第9列:PLS-00103:遇到以下其中一项时遇到符号"DBMS_MVIEW":
:=.(@%;立即用符号":="代替"DBMS_MVIEW"继续.
难道我做错了什么 ?需要进口什么?
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
EXECUTE DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Run Code Online (Sandbox Code Playgroud)
(S1917)期待:(; @
IMMEDIATE
CREATE OR REPLACE PROCEDURE REFRESH_MV AS
BEGIN
EXECUTE IMMEDIATE DBMS_MVIEW.REFRESH('my_mat_view_mv','C');
END REFRESH_MV;
Warning: compiled but with compilation errors
Run Code Online (Sandbox Code Playgroud)
这是一个Oracle 10g XE,希望没问题.
提前致谢 !
create or replace TRIGGER REFRESH_REST_VIEW
AFTER
INSERT OR UPDATE
ON tbl_contract
BEGIN
execute DBMS_MVIEW.REFRESH('REST_VIEW');
END REFRESH_REST_VIEW;
commit;
Run Code Online (Sandbox Code Playgroud)
这是我用来刷新Materialized View的sql触发器.但它说......
Warning: execution completed with warning
TRIGGER REFRESH_REST_VIEW Compiled.
Run Code Online (Sandbox Code Playgroud)
PS:当表的数据(由Materialized View使用)进行任何DML操作时,将执行触发器.
我已经google了足够多,很多帖子说这是可能的,但我没有得到如何做到这一点.我尝试使用常规触发器语法,但它不起作用.
更新:
现在我尝试与过程和触发器相同..
create or replace
PROCEDURE Rfresh_mate_views AS
BEGIN
DBMS_MVIEW.REFRESH('REST_VIEW');
END Rfresh_mate_views;
create or replace trigger refresh_company_mview
after insert or update ON BCD.BCD_COMPANY
begin
RFRESH_MATE_VIEWS();
end refresh_company_mview;
Run Code Online (Sandbox Code Playgroud)
所有都已成功编译,但在表中更新时它说:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2449
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2429
ORA-06512: at "BCD.RFRESH_MATE_VIEWS", line 3
ORA-06512: …Run Code Online (Sandbox Code Playgroud) Oracle 10.2中这种快速刷新的视图定义有什么问题:
create table A
(
ID number(19,0) not null constraint A_PK primary key using index
, C number(9,0) not null
);
create table B
(
ID number(19,0) not null constraint B_PK primary key using index
, A_ID number(19,0) not null constraint A_FK references A(ID) on delete cascade
, D number(9,0) not null
);
create index B_FK_IDX on B(A_ID);
create materialized view log on A
with primary key, rowid, sequence (C) including new values;
create materialized view log on B …Run Code Online (Sandbox Code Playgroud) oracle ×6
postgresql ×4
oracle10g ×3
sql ×3
plsql ×2
triggers ×2
ora-06550 ×1
performance ×1
sql-view ×1
timescaledb ×1
view ×1