在聚合连接上快速刷新创建oracle实体化视图

时间:2013-06-05 03:41:51

标签: oracle join views aggregate materialized

我有这个非常讨厌的观点,我试图通过物化视图提前执行一些连接来加快速度。我的问题是最昂贵的连接,因此最值得预先执行,不要与物化视图一起玩。

应用程序的目标是提供可能的实时数据,因此如果我创建mat视图,他们需要在提交时快速刷新(可能我没有考虑过其他我不知道的方法)。快速刷新有局限性,特别是你必须有rowid。见这个帖子here;但我的问题有点不同,因为我加入的性质要求我汇总我的联接以获得正确的记录。

这就是我想要“预执行”(或优化另一种天才方式):

     CREATE MATERIALIZED VIEW testing
     NO LOGGING
     CACHE
     BUILD IMMEDIATE
     REFRESH FAST ON COMMIT 
     AS
       SELECT br.id, br.rowid, max(mr.id) as modifier_id --somehow fit mr.rowid in here
        FROM tableA br --base record
        LEFT OUTER JOIN tableA mr --modifier record
            ON br.external_key = mr.external_key
            AND mr.record_type_code in ('SOME','TYPE')
            AND mr.status_code in ('SOME','STATUS');

基本上,它是一个自连接,因为对实体进行了0-*n*修改,所有修改都在同一个表的后续行中完成。我正在选择最新的给定类型。 (我为其他类型做了额外的时间)。为了完成上述工作,我必须包括br和mr的rowid,我无法将我的大脑包裹起来。我考虑过rank()ROWNUM而不是汇总w / MAX(),但无法使逻辑正确。

编辑: 不确定快速刷新MV是否适合我,即使我按需刷新并完全删除聚合(假设确实有1行),oracle告诉我查询过于复杂,无法快速刷新。所以,现在我需要其他想法......

2 个答案:

答案 0 :(得分:1)

它可能不适用于您的情况,但可能会使您的表格反规范化。

例如,如果您有多个与语言相关的名称,则可以为每种语言指定列。

例如,如果您的访问权限是基于索引的,请考虑varraynested tables

另一个想法是使用触发器:在插入/更新/删除时,更新另一个表(或多个表),并将该表用于查询。可能你也可以用这种方式预先计算聚合。

答案 1 :(得分:0)

我会考虑使用物化视图来进行聚合,所以你只需要存储EXTERNAL_KEY和MAX(ID)。

如果您在主表上发生了删除,那么也包括count(*)。

这应该为您提供快速刷新功能。

相关问题