Почему у вложенных представлений другой план объяснения, чем у одного объединенного представления?

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

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

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


person aw crud    schedule 29.11.2010    source источник


Ответы (1)


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

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

person Justin Cave    schedule 29.11.2010