2

Итак, вопрос в том, есть ли возможность избежать полных сканирований при работе с входящими параметрами запроса NULL в хранимой процедуре? Предположим, у меня есть 4 параметра, которые пользователь отправляет из формы и пытается найти точное совпадение в таблице, как это:Планы выполнения Oracle FTS с параметрами запросов NULL (pl/sql)

SELECT * 
FROM table1 t1 
WHERE ((:qParam1 is null) OR (t1.col1 = :qParam1)) AND 
((:qParam2 is null) OR (t1.col2 = :qParam2)) AND 
((:qParam3 is null) OR (t1.col3 = :qParam3)) AND 
((:qParam4 is null) OR (t1.col4 = :qParam4)); 

Так что, когда эта часть процедуры выполняется из-за проверки NULL, это будет выполнять FTS, поскольку процедура уже скомпилирована и определен план выполнения. Внутри процедуры понадобилось бы 2^4 разных запроса, чтобы всегда использовать наиболее эффективный план с учетом входящих параметров запроса (и значительно больше, если число входных параметров увеличивается). Мой вопрос: есть ли какой-либо путь, кроме динамического sql, чтобы избежать FTS в этих типах запросов?

+0

't1.col = nvl (: qParam1, t1.col)' обычно отлично работает. Oracle использует операцию 'FILTER' для создания двух отдельных подпланов, один с FTS и один с индексом, и выберет соответствующий план во время выполнения. Я бы отметил это как дубликат [этого вопроса] (http://stackoverflow.com/q/3649036/409172), за исключением того, что принятый ответ неверен. –

ответ

0

Возможно нет. Oracle не хранит нули в индексе, поэтому никогда не может использовать индекс, когда существует вероятность null в предикате. Если ваши столбцы имеют значение NULL, то нет. Сказав это, есть хороший шанс, что это лучший план в любом случае - ваш запрос настолько расплывчатый (нормально - гибкий), что в любом случае было бы сложно создать единый полезный план. Oracle довольно умна с гибкими планами, но здесь не так уж и много.

Если у вас есть NULLABLE столбцы и индекс вы может быть в состоянии чинить его

t1.col1 = :qParam2 and t1.col1 is not null 

в случае, если это не достаточно умны, чтобы работать, что за себя.

Смежные вопросы