【发布时间】:2016-06-05 22:09:24
【问题描述】:
我有一个看似简单的问题,物化视图似乎是理想的解决方案,但是我没有让它有效地工作,也许答案很简单:“Oracle 根本不允许”,但我我希望我忽略了一些愚蠢的事情。
问题:由于某些历史性决定,我有一个包含来自两个国家的几何图形的表格,存储在一个国家的坐标系中。我现在想使用共享坐标系创建物化视图。所以实际上,实现这一点的最简单查询是:
select thr_ident, thr_status, geom from
((
select thr_ident, thr_status, sdo_cs.transform(sdo_cs.transform(thr_geometry, 327680), 8307) as geom
from th_threat
where thr_origin in (6,61, 11, 9)
)
union all
(
select thr_ident, thr_status, sdo_cs.transform(thr_geometry, 8307) as geom
from th_threat
where thr_origin not in (6,61,11,9)
))
几何图形只创建一次,但我想保持状态同步(出于可视化目的)。于是我在thr_ident和thr_status上添加了物化视图日志:
create materialized view log on th_threat
with sequence, rowid (thr_ident, thr_status)
including new values;
并创建了物化视图,并希望只要原始源数据发生更改(“提交时”),它就会自动保持同步。
但显然refresh on commit 在使用对象时是不可能的,但如果它足够高效/足够快,拥有fast refresh 就足够接近了。
我假设假设 union all 没有真正帮助,我将其重写为单个查询,如下所示:
create materialized view th_threat_mv
-- refresh fast on demand
as
select
rowid rid, thr_ident, thr_status,
case
when thr_origin in (6,61, 11, 9) then
sdo_cs.transform(sdo_cs.transform(thr_geometry, 327680), 8307)
else
sdo_cs.transform(thr_geometry, 8307)
end as geom
from th_threat;
但仍然没有启用快速刷新。
explain_mview 的结果显示只有完全刷新是可能的,而其他的都被禁用(对我来说有点难以阅读/推断,如果需要我可以转储它,但它会重复三次 object data types are not supported in this context)。
mtune_view 给了我以下错误:
QSM-03113: Cannot tune the MATERIALIZED VIEW statement
QSM-02083: mv references PL/SQL function that maintains state
所以现在我猜这是由 SDO_CS.TRANSFORM 引起的?
理论上我会假设快速刷新是可能的/简单的:
- 在插入时创建行(使用适当的转换)
- 当
thr_status改变时更新状态(或者计算单行的整体
但是要么我没有正确实现它,要么 Oracle 无法推断出它实际上是一个简单的 1-1 物化视图(因为它包含一个几何图形?一个 case 语句?)。
我总是可以使用触发器来酿造自己的解决方案,但我想知道我是否忽略了一些明显的东西以使材料视图有效地工作(因为它似乎非常合适)。非常感谢任何帮助/见解/cmets。
【问题讨论】:
标签: oracle materialized-views oracle-spatial