Мне нужно было выполнить выборку в Oracle 11G, которая выглядела так:
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
and t1.p_date > to_date('010113','ddmmrr')
В какой-то момент я понял, что фильтр по p_date делал запрос очень медленным, в то время как тот же запрос без фильтра p_date был практически мгновенным. Кроме того, я понял, что запрос без фильтра возвращает небольшой набор результатов, около 30 строк, поэтому я подумал о переносе фильтра даты за пределы запроса.
Я пробовал эти два варианта:
with temp as (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) select * from temp where p_date > to_date('010113','ddmmrr')
и
select * from (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) where p_date > to_date('010113','ddmmrr')
ожидая, что он будет почти таким же быстрым, как внутренний запрос, поскольку он должен сначала выполнить его, а затем применить фильтр p_date только к 30 возвращенным строкам.
Однако в обоих случаях время выполнения было огромным (не могу сказать сколько, потому что у меня не хватило терпения дождаться результатов).
Может кто-нибудь сказать мне, почему это происходит?
В качестве примечания: таблица «table1» имеет индекс над p_date, который выглядит не так, как ожидалось (я также об этом позабочусь). Но может ли механизм Oracle определить это и ошибочно перестроить запрос во время выполнения, чтобы попытаться его использовать?
Заранее спасибо,
Карлес