Вот альтернатива.Вам нужно материализованное представление A, не содержащее B. Это не доступно напрямую ... поэтому вместо этого материализуйте два представления.Один из всех А и один только А с B.Затем получите только A, не имеющие B, взяв A, кроме B. Это можно сделать эффективно:
Создать два материализованных представления (mA и mAB) ( edit: mA может быть просто базовой таблицей ).У mA отсутствует соединение между A и B (таким образом, содержит все точки A [и, следовательно, содержит эти записи БЕЗ совпадений в B]).Соединение mAB между A и B (таким образом, содержит только A с B [и, следовательно, исключая эти записи БЕЗ совпадений в B]).
Чтобы получить все A без совпадений в B, замаскируйте те, которые соответствуют:
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;
Это должно привести к левому анти-полусоединению с вашими кластерными индексами, чтобы получить идентификаторы, и с кластеризованным индексом, чтобы получить данные из mA, которые вы ищете.
По сути, кто вы естьЭто основное правило, согласно которому SQL гораздо лучше справляется с данными, которые там есть, чем с данными, которых нет.Материализуя два источника, вы получаете несколько привлекательных опций на основе набора.Вы должны сопоставить стоимость этих взглядов с этими достижениями самостоятельно.