У меня есть представление 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
, используя предикаты push & indexes.
Я сократил разницу до того факта, что V2
построен поверх V1
с предикатами. Я изменил V2
, чтобы он был точной копией V1
, но поместил в него два дополнительных фильтра предикатов напрямую и обнаружил, что он работает так же, когда соединяется с FOO
, что и V1
, но с соответствующими ограничениями. Теперь.
Не могут ли вложенные представления не передавать предикаты вплоть до таблиц? Кроме того, насколько последовательным является использование предикатов? У меня есть несколько взглядов, где, если предикаты не выдвинуты, это ухудшило бы производительность. Сейчас они работают нормально, но какая гарантия, что они будут продолжать это делать?
Я бы хотел вкладывать / наследовать представления, а не дублировать одни и те же запросы с небольшими отличиями, чтобы сохранить вещи СУХИМЫМИ.