2

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

该应用程序的目标是尽可能提供最活跃的数据,因此如果我制作 mat 视图,它们需要在提交时快速刷新(也许我没有考虑过我不知道的其他方法)。快速刷新有限制,特别是你必须有 rowid。在这里看到这个线程;但我的问题有点不同,因为我加入的性质要求我汇总我的加入以获得正确的记录。

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

     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 告诉我查询对于快速刷新来说太复杂了。所以,现在我需要其他想法......

4

2 回答 2

1

它可能不适用于您的情况,但可能您可以对表进行非规范化。

例如,如果您有多种语言相关名称,您可以只为每种语言命名列。

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

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

于 2013-06-05T09:12:51.410 回答
0

我会考虑使用物化视图仅进行聚合,因此您只需存储 EXTERNAL_KEY 和 MAX(ID)。

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

这应该会给你快速刷新的能力。

于 2013-06-05T10:08:00.053 回答