我有这个非常讨厌的视图,我试图通过物化视图提前执行一些连接来加快速度。我的问题是最昂贵的连接,因此最值得预先执行,不要与物化视图很好地配合。
该应用程序的目标是尽可能提供最活跃的数据,因此如果我制作 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 告诉我查询对于快速刷新来说太复杂了。所以,现在我需要其他想法......