我正在收集空间点数据,与之相关的时间戳。我想要为过去的24小时创建这个数据的视图。因为我是通过ArcGIS服务器传输这些空间数据,所以在一个直观的视图(这个视图可以很容易地包含100-200k+点)中存在与管道相关的性能问题。为了长话短说,为了缓解这些性能问题,我创建了数据的物化视图。但是,我希望每3-4分钟更新一次这些数据。
我的问题是,当我将current_timestamp添加到查询中时:
SELECT *
FROM points
WHERE timestamp > current_timestamp - interval '24' hour...this不再可以用作快速刷新。是否有任何方法来纠正这一点,或者它将永远是一个完整的刷新?如果显示了,当涉及更新物化视图的性能时,我应该注意什么(同样,这个数据集很容易是100-200 K点,每秒钟添加3-6点)。
发布于 2012-12-12 19:22:54
可快速刷新的物化视图不能包含像current_timestamp这样的非确定性函数.因此,如果要在物化视图中物化过去24小时的数据,则物化视图每次都需要进行完全刷新。
您需要物化视图吗?您能否维护自己的暂存表,并创建一个每隔几分钟运行一次的自定义作业,删除现在已超过24小时的数据,并插入新数据(直接查询表或创建将新数据写入另一个表的触发器)?如果您需要使用物化视图的查询重写功能,但如果您只是想要查询一个较小的表,则定制代码可能更高效。
或者,您是否可以每天对表进行分区,以便过去24小时的查询始终只需访问最近的两个分区?
发布于 2012-12-13 09:52:15
您可以创建一个包含过去24小时数据的物化视图。要做到这一点,您将需要创建一个单行表,其中只包含希望返回数据的日期。在执行快速刷新之前,刷新过程需要将此表更新到您想要的日期:
create table tab (x integer primary key, ins_date date);
create table last_time (datetime date primary key);
create materialized view log on tab with rowid;
create materialized view log on last_time with rowid;
insert into tab
select rownum, sysdate-level/20 from dual connect by level <= 100;
insert into last_time values (sysdate-1);
commit;
create materialized view mv
build immediate
refresh fast on demand
as
select t.*, t.rowid tr, l.rowid lr
from tab t, last_time l
where t.ins_date >= l.datetime;
select count(*) from mv;
COUNT(*)
----------
20
update last_time set datetime = sysdate;
exec dbms_mview.refresh('mv', 'F');
SELECT x FROM mv;
no rows selected
insert into tab values (101, sysdate);
exec dbms_mview.refresh('mv', 'F');
SELECT x FROM mv;
X
----------
101如果发现需要超过24小时的更多(或更少)数据,则只需酌情更新LAST_TIME表即可。
但是,正如Justin所建议的那样,也值得研究分区。
https://dba.stackexchange.com/questions/30302
复制相似问题