这是一个替代方案。您想要一个不包含 B 的 A 的物化视图。这不是直接可用的......所以相反,物化两个视图。所有 A 之一和仅有 A 和 B 之一。然后,通过除 B 之外的 A 只得到 A 没有 B。这可以有效地完成:
创建两个物化视图(mA 和 mAB)(编辑:mA 可能只是基表)。mA 缺少 A 和 B 之间的连接(因此包含所有 A 的句点 [因此包含那些在 B 中没有匹配项的记录])。mAB 在 A 和 B 之间连接(因此仅包含 A 和 B [因此排除了 B 中没有匹配项的那些记录])。
要在 B 中获取所有没有匹配项的 A,请屏蔽那些匹配项:
with ids as (
select matchId from mA with (index (pk_matchid), noexpand)
except
select matchId from mAB with (index (pk_matchid), noexpand)
)
select * from mA a join ids b on a.matchId = b.matchId;
这应该针对您的聚集索引产生一个左反半连接以获取 ids 和一个聚集索引寻求从您正在寻找的 mA 中获取数据。
本质上,您遇到的是基本规则,即 SQL 在处理存在的数据方面比处理不存在的数据要好得多。通过实现两个来源,您可以获得一些引人注目的基于集合的选项。您必须自己权衡这些观点的成本与这些收益。