((:prm is null) or (field=:prm)) и индексы
((:prm is null) or (field=:prm)) и индексы
возможно ли задействовать индекс по полю field
в запросе -
select * from table
where ((:prm is null) or (field=:prm)) and .....
в таком виде естественно работает
select * from table
where (field=:prm) and .....
в запросе -
select * from table
where ((:prm is null) or (field=:prm)) and .....
в таком виде естественно работает
select * from table
where (field=:prm) and .....
оптимизатор строит план в момент выполнения prepare. На этот момент значения параметров неизвестны. Допустим, в :prm оказался null. Тогда надо выбрать все записи. Если при этом использовать индекс, то это будет совершенно лишним (выборка всех с использованием индекса - это лишь дополнительные затраты на чтение страниц индекса).
Так что тут использование индекса под вопросом, в смысле как это дело ввести в ядро, причем менять план запроса на этапе execute...
Так что тут использование индекса под вопросом, в смысле как это дело ввести в ядро, причем менять план запроса на этапе execute...
избавиться от Null

Vemerу от нула избавится не получится,
т.к. запрос внутри процедуры, а prm один из
ее параметров, если пользователь не указал его,
то и учитывать в запросе его бы нехотелось.
здесь есть 3 варианта:
Первый - тот что уже указал
Второй - по if выполнять различные запросы
Третий - составлять запрос в процедуре и
выполнять - execute statement
у всех свои минусы..
Первый - запрос не оптимизируется.
Второй - при большом количестве параметров процедуры сильно усложняются
Третий - минусы execute statement.
т.к. запрос внутри процедуры, а prm один из
ее параметров, если пользователь не указал его,
то и учитывать в запросе его бы нехотелось.
здесь есть 3 варианта:
Первый - тот что уже указал
Второй - по if выполнять различные запросы
Третий - составлять запрос в процедуре и
выполнять - execute statement
у всех свои минусы..
Первый - запрос не оптимизируется.
Второй - при большом количестве параметров процедуры сильно усложняются
Третий - минусы execute statement.