У меня есть представление V2
, которое выбирает из другого представления V1
и добавляет пару фильтров предикатов.
V2 IS SELECT * FROM V1
WHERE ACTIVE='Y'
AND TYPE = '1';
Когда я выполняю соединение между V2
и таблицей FOO
в столбце USER_ID
(индексированном в FOO
), я обнаруживаю, что он сначала вычисляет все результаты для V2
перед объединением с FOO
в индексированном столбце (индексированном также в исходной таблице V1
).
SELECT * FROM FOO
INNER JOIN V2
ON FOO.USER_ID = V2.USER_ID
WHERE FOO.SCHOOL = '3'
Но когда я выполняю соединение между V1
и FOO
, он сначала находит запись в FOO
, а затем использует индекс для быстрого извлечения строки из V1
с использованием предикатов и индексов.
Я сузил разницу до того факта, что V2
строится поверх V1
с помощью предикатов. Я изменил V2
так, чтобы он был точной копией V1
, но поместил в него два дополнительных фильтра предикатов и обнаружил, что при объединении с FOO
он ведет себя так же, как и V1
, но теперь с соответствующими ограничениями.
Не могут ли вложенные представления протолкнуть предикаты в таблицы? Кроме того, насколько последовательным является нажатие предикатов? У меня есть несколько представлений, в которых, если предикаты не будут нажаты, это приведет к снижению производительности. Сейчас они работают нормально, но есть ли гарантия, что они будут работать и дальше?
Я хотел бы вкладывать/наследовать представления, а не дублировать одни и те же запросы с небольшими различиями, чтобы все было СУХИМ.