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