Почему вложенные представления имеют другой план объяснения, чем одно объединенное представление? - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть представление 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, но с соответствующими ограничениями. Теперь.

Не могут ли вложенные представления не передавать предикаты вплоть до таблиц? Кроме того, насколько последовательным является использование предикатов? У меня есть несколько взглядов, где, если предикаты не выдвинуты, это ухудшило бы производительность. Сейчас они работают нормально, но какая гарантия, что они будут продолжать это делать?

Я бы хотел вкладывать / наследовать представления, а не дублировать одни и те же запросы с небольшими отличиями, чтобы сохранить вещи СУХИМЫМИ.

1 Ответ

2 голосов
/ 29 ноября 2010

Какую версию Oracle вы используете?Для какого параметра OPTIMIZER_SECURE_VIEW_MERGING установлено значение?Вы можете попытаться установить для него значение ЛОЖЬ или предоставить пользователю привилегию MERGE ANY VIEW.

Если это не поможет, вы можете опубликовать два плана запросов?

...