Настройки фильтра в Oracle Views - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть 2 вида, как это (упрощенно):

CREATE VIEW BASE_VIEW AS
(
      -- Simplified version, view actually does a lot more.
      SELECT * FROM MYTABLE;
);

CREATE VIEW OUTER_VIEW AS
(
      -- The where clause here makes this view return half the rows as the above BASE_VIEW
      SELECT * FROM BASE_VIEW where SomeField = 'something'
);

Мой вопрос: разве OUTER_VIEW не должен выполняться примерно в два раза быстрее, чем BASE_VIEW? Я не вижу такого поведения. Это почти занимает все время, необходимое для выполнения BASE_VIEW.

Поскольку Oracle компилирует ссылочные представления в ваше внешнее представление, я подумал, что будет достаточно разумно оптимизировать запрос на основе внешнего выражения where. Разве это не так?

РЕДАКТИРОВАТЬ: На самом деле запрос «базового представления» с предложением where из «внешнего представления» занимает половину времени.

1 Ответ

0 голосов
/ 24 апреля 2018

Представьте, что у вас есть целая комната, полная разных видов фруктов, разбросанных повсюду. Представление BASE_VIEW похоже на выражение: «Извлеките все фрукты в этой комнате».

OUTER_VIEW - это как сказать: «Извлеките все апельсины из этой комнаты». Если фрукт не заказан каким-либо образом, вы потратите примерно столько же времени, сколько и BASE_VIEW на поиск всех апельсинов.

Теперь представьте, что у вас есть все фрукты в корзинах. Схватить все апельсины становится легко, потому что вы точно знаете, где они.

Добавление индекса в SomeField - это то, что упорядочивает данные так, чтобы им не приходилось искать всю комнату фруктов. Существуют некоторые ограничения на то, когда индекс может помочь или нет. На основании количества строк в вашей таблице оптимизатор оракула может решить, что быстрее все равно просто захватить все строки. Я предлагаю вам прочитать это руководство, чтобы определить правильный способ индексации таблиц: Используйте The Index, Люк . Это мне очень помогло при начале индексации.

Если SomeField напрямую не приходит из MYTABLE и является просто созданным полем в BASE_VIEW, то это может помочь индексировать поле, которое создает SomeField. Нам трудно знать, не видя данных.

...