Я немного погуглил и не смог найти четкого ответа на вопрос о производительности oracle. Возможно мы можем зарегистрировать это здесь. Я строю MV, который довольно прост, но на довольно больших столах. Запрос, как и многие вещи, может быть написан более чем одним способом. В моем случае, когда написано как оператор выбора, два решения имеют схожие затраты / план выполнения, но когда они размещены внутри представления с материализацией создания, время выполнения резко меняется. Любое понимание, почему?
- Tab1 - это приблизительно 40M записей.
- Tab2 - это записи aprox 8M.
- field1 - это первичный ключ на Tab1, он не является PK или уникальным на Tab2, но на вкладке 2 есть индекс для этого поля.
- field2 не является ключом и не индексируется ни в одной из таблиц (boo)
Запросы:
Q1:
SELECT
CR1.Several_Fields
FROM
SCHEMA1.tab1 T1
WHERE T1.field2 like 'EXAMPLE%'
AND T1.field1 not in (
SELECT T2.field1
FROM SCHEMA1.tab2 T2
)
;
Q2:
SELECT
CR1.Several_Fields
FROM
SCHEMA1.tab1 T1
WHERE T1.field2 like 'EXAMPLE%'
AND not exists (
SELECT 1
FROM SCHEMA1.tab2 T2
WHERE T1.field1 = T2.field1
)
;
Два запроса в виде операторов выбора выполняются во времени одинаково, и план объяснения предполагает, что оба они используют сканирование индекса, а не полное сканирование таблицы, как я ожидал. Что неожиданно, так это то, что Q2 работает намного быстрее (47 секунд против 81 дня на v $ session_longops) при запуске в создании mv, например:
CREATE MATERIALIZED VIEW SCHEMA1.mv_blah as
(
Q1 or Q2
);
Есть ли у кого-нибудь понимание, есть ли здесь правило не использовать IN, если это возможно, только для mviews? Я знаю хитрости между и существовать, когда между таблицами не существует индексов, но этот сбил меня с толку. Это работает с базой данных oracle 11g.