GVKun编程网logo

在Spring数据存储库中刷新Oracle物化视图(oracle物化视图实时刷新)

13

这篇文章主要围绕在Spring数据存储库中刷新Oracle物化视图和oracle物化视图实时刷新展开,旨在为您提供一份详细的参考资料。我们将全面介绍在Spring数据存储库中刷新Oracle物化视图的

这篇文章主要围绕在Spring数据存储库中刷新Oracle物化视图oracle物化视图实时刷新展开,旨在为您提供一份详细的参考资料。我们将全面介绍在Spring数据存储库中刷新Oracle物化视图的优缺点,解答oracle物化视图实时刷新的相关问题,同时也会为您带来mysql触发器实现oracle物化视图示例代码、oracle – 创建新的物化视图,而不清除物化视图日志、oracle – 创建物化视图,每天刷新记录、oracle – 物化视图 – 识别最后一次刷新的实用方法。

本文目录一览:

在Spring数据存储库中刷新Oracle物化视图(oracle物化视图实时刷新)

在Spring数据存储库中刷新Oracle物化视图(oracle物化视图实时刷新)

在查询Spring Data
Repository之前,我需要刷新Oracle数据库中的实例化视图。我正在尝试通过存储库中的函数使用本机查询来执行此操作,如下所示。

@Query("BEGIN DBMS_SNAPSHOT.REFRESH(''MY_VIEW'', ''C''); END;", nativeQuery = true)fun refreshMaterializedView()

但是,java.lang.NegativeArraySizeException尽管在直接在数据库上运行时它可以正常工作,但我在调用此方法时却遇到了麻烦。我在这里做错了什么?是否有其他方法可以强制实例化视图刷新?

答案1

小编典典

您需要使用注释您的方法@Modifying。它确实适用于DML语句,但也适用于此。

@Modifying@Query("BEGIN DBMS_SNAPSHOT.REFRESH(''MY_VIEW'', ''C''); END;", nativeQuery = true)fun refreshMaterializedView()

mysql触发器实现oracle物化视图示例代码

mysql触发器实现oracle物化视图示例代码

oracle数据库支持物化视图--不是基于基表的虚表,而是根据表实际存在的实表,即物化视图的数据存储在非易失的存储设备上。
下面实验创建ON COMMIT 的FAST刷新模式,在MysqL中用触发器实现insert,update,delete 刷新操作
1、基础表创建,Orders 表为基表,Order_mv为物化视图表

复制代码 代码如下:

MysqL> create table Orders(
-> order_id int not null auto_increment,
-> product_name varchar(30)not null,
-> price decimal(10,0) not null,
-> amount smallint not null,
-> primary key (order_id));
Query OK,0 rows affected
MysqL> create table Order_mv(
-> product_name varchar(30) not null,
-> price_sum decimal(8.2) not null,
-> amount_sum int not null,
-> price_avg float not null,
-> order_cnt int not null,
-> unique index(product_name));
Query OK,0 rows affected

2、insert触发器
复制代码 代码如下:

delimiter $$
create trigger tgr_Orders_insert
after insert on Orders
for each row
begin
set @old_price_sum=0;
set @old_amount_sum=0;
set @old_price_avg=0;
set @old_orders_cnt=0;

select ifnull(price_sum,0),ifnull(amount_sum,ifnull(price_avg,ifnull(order_cnt,0)
from Order_mv
where product_name=new.product_name
into @old_price_sum,@old_amount_sum,@old_price_avg,@old_orders_cnt;

set @new_price_sum=@old_price_sum+new.price;
set @new_amount_sum=@old_amount_sum+new.amount;
set @new_orders_cnt=@old_orders_cnt+1;
set @new_price_avg=@new_price_sum/@new_orders_cnt;

replace into Order_mv
values(new.product_name,@new_price_sum,@new_amount_sum,@new_price_avg,@new_orders_cnt);
end;
$$
delimiter ;

3、update触发器
复制代码 代码如下:

delimiter $$
create trigger tgr_Orders_update
before update on Orders
for each row
begin
set @old_price_sum=0;
set @old_amount_sum=0;
set @old_price_avg=0;
set @old_orders_cnt=0;

set @cur_price=0;
set @cur_amount=0;

select price,amount from Orders where order_id=new.order_id
into @cur_price,@cur_amount;

select ifnull(price_sum,@old_orders_cnt;

set @new_price_sum=@old_price_sum-@cur_price+new.price;
set @new_amount_sum=@old_amount_sum-@cur_amount+new.amount;
set @new_orders_cnt=@old_orders_cnt;
set @new_price_avg=@new_price_sum/@new_orders_cnt;

replace into Order_mv
values(new.product_name,@new_orders_cnt);
end;
$$
delimiter ;

4、delete触发器
复制代码 代码如下:

delimiter $$
create trigger tgr_Orders_delete
after delete on Orders
for each row
begin
set @old_price_sum=0;
set @old_amount_sum=0;
set @old_price_avg=0;
set @old_orders_cnt=0;

set @cur_price=0;
set @cur_amount=0;

select price,amount from Orders where order_id=old.order_id
into @cur_price,0)
from Order_mv
where product_name=old.product_name
into @old_price_sum,@old_orders_cnt;

set @new_price_sum=@old_price_sum - old.price;
set @new_amount_sum=@old_amount_sum - old.amount;
set @new_orders_cnt=@old_orders_cnt - 1;

if @new_orders_cnt>0 then
set @new_price_avg=@new_price_sum/@new_orders_cnt;
replace into Order_mv
values(old.product_name,@new_orders_cnt);
else
delete from Order_mv where product_name=@old.name;
end if;
end;
$$
delimiter ;

5、这里delete触发器有一个bug,就是在一种产品的最后一个订单被删除的时候,Order_mv表的更新不能实现,不知道这算不算是MysqL的一个bug。当然,如果这个也可以直接用sql语句生成数据,而导致的直接后果就是执行效率低。
复制代码 代码如下:

-> insert into Order_mv
-> select product_name,sum(price),sum(amount),avg(price),count(*) from Orders
-> group by product_name;

oracle – 创建新的物化视图,而不清除物化视图日志

oracle – 创建新的物化视图,而不清除物化视图日志

我想在预建表上使用物化视图,以便在迁移之前保持表同步.数据不断变化,因此需要跟踪导出开始和导入完成之间的变化.不言而喻,桌子很大,所以完全刷新太慢了.

步骤id喜欢执行:

>在新数据库上创建表.
>在旧的db表上创建mv日志.
>将旧数据库中的数据导入新数据库.
>在prebuild表上的新数据库上创建物化视图,并从创建mv日志时的点开始刷新它.

问题是,在创建实体化视图的那一刻,将清除旧表上的mv日志.

老DB:
    create table kvrtest(id number,cat number);

alter table kvrtest add ( constraint pkkvrtest primary key (id) using index);

insert into kvrtest (id,cat) values (1,1);
commit;

CREATE MATERIALIZED VIEW LOG ON kvrtest WITH PRIMARY KEY;

insert into kvrtest (id,cat) values (2,1);
insert into kvrtest (id,cat) values (3,2);
commit;

select * from MLOG$_KVRTEST; --Yields 2,these should be caught by a fast refresh.

新数据库:
    create table kvrtest(id number,1); --Simulate import. commit; CREATE MATERIALIZED VIEW kvrtest ON PREBUILT TABLE WITHOUT REDUCED PRECISION USING INDEX REFRESH FORCE ON DEMAND AS select * from kvrtest@oldDb;

此时清除mv日志

select * from MLOG$_KVRTEST; --Yields 0,a fast refresh from here does not catch these records.

有什么建议?

解决方法

当您使用REFRESH标记创建新的MATERIALIZED VIEW时,日志表正在清除,因为我们的视图实际上是在创建之后.

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
REFRESH FORCE ON DEMAND
AS

如果不想清除您的日志表使用NEVER REFRESH然后更改为REFRESH ON DEMAND,如下所示:

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
NEVER REFRESH
AS 
select * from kvrtest@oldDb;

让我们看看我们的日志表

select * from MLOG$_KVRTEST;

我们有两排,真好!然后

ALTER MATERIALIZED VIEW kvrtest 
    REFRESH ON DEMAND;

然后刷新视图日志表将再次清除.

oracle – 创建物化视图,每天刷新记录

oracle – 创建物化视图,每天刷新记录

目前我使用REFRESH ON DEMAND创建的Materialized视图所以在这种情况下我需要使用以下命令显式刷新MV:
BEGIN DBMS_MVIEW.REFRESH('MV_DATA'); END;

但是现在我需要每天刷新这个MV,所以任何人都可以帮忙写这个.我已经看到我们可以使用编写显式Job或在MV本身中使用COMPLETE / FAST REFRESH语句来刷新此MV.

提前致谢!

您需要使用START WITH和NEXT子句创建物化视图
create materialized view <mview_name>
refresh on demand 
start with sysdate next sysdate + 1
as select ............

因此,如果您想每天刷新mview,您需要按需刷新它,并将下一个刷新时间设置为sysdate 1.您可以设置任何间隔.

执行此操作后,将创建物化视图,并在Oracle中设置一个作业,每24小时刷新一次mview(sysdate 1).

有关如何执行此操作的详细信息,请按照this link

oracle – 物化视图 – 识别最后一次刷新

oracle – 物化视图 – 识别最后一次刷新

我目前访问了一系列意见和物化视图。实质化由第三方维护,第三方提供关于物化的频率和成功的很少信息。最近,物化视图未能刷新,并且发出了大量不正确/延迟数据的报告。

目前,我正在查询每个实现的内容,我打算用什么来确定在事务系统内发生最新更新的时间,如果没有被刷新,那么代码的其余部分就不会执行,但是这很多浪费的努力有时会导致到一个不正确的假设(物化视图可能已刷新,但没有额外的事务 – 因此其余的代码不执行),我宁愿另一种方法。

有没有办法确定实体化视图是否已使用Oracle系统表刷新?如果没有,有没有人有任何想法,我不会这样做,而不必联系第三方?

看来doc_180已经在评论中回答了这一点,我不知道为什么它没有被添加为答案
SELECT owner,mview_name,last_refresh_date
  FROM all_mviews
 WHERE owner = <<user that owns the materialized view>>
   AND mview_name = <<name of the materialized view>>

如果您有权访问DBA表,则可以将DBA_MVIEWS替换为ALL_MVIEWS。这将允许您访问有关每个物化视图何时刷新的信息,而不仅仅是您可以访问的物化视图的子集。当然,这在大多数情况下尤为重要。

关于在Spring数据存储库中刷新Oracle物化视图oracle物化视图实时刷新的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于mysql触发器实现oracle物化视图示例代码、oracle – 创建新的物化视图,而不清除物化视图日志、oracle – 创建物化视图,每天刷新记录、oracle – 物化视图 – 识别最后一次刷新等相关内容,可以在本站寻找。

本文标签:

上一篇带有Spring-boot CLI的RepositoryRestResource(springboot包含)

下一篇SQL Server中的str_to_date函数?