Страница 1 из 1
((:prm is null) or (field=:prm)) и индексы
Добавлено: 26 ноя 2004, 12:57
sasha
возможно ли задействовать индекс по полю field
в запросе -
select * from table
where ((:prm is null) or (field=:prm)) and .....
в таком виде естественно работает
select * from table
where (field=:prm) and .....
Добавлено: 26 ноя 2004, 13:44
dimitr
В настоящее время невозможно.
Добавлено: 26 ноя 2004, 14:12
kdv
оптимизатор строит план в момент выполнения prepare. На этот момент значения параметров неизвестны. Допустим, в :prm оказался null. Тогда надо выбрать все записи. Если при этом использовать индекс, то это будет совершенно лишним (выборка всех с использованием индекса - это лишь дополнительные затраты на чтение страниц индекса).
Так что тут использование индекса под вопросом, в смысле как это дело ввести в ядро, причем менять план запроса на этапе execute...
Добавлено: 26 ноя 2004, 14:43
dimitr
Дим, даже Оракл делает в этом случае фулл-скан

избавиться от Null
Добавлено: 27 ноя 2004, 11:20
Vemer

Не проще от
Null избавиться, заменив его на 0 или ''?
Добавлено: 27 ноя 2004, 14:29
kdv
to dimitr - это я помню

to Vemer - в данном случае null тут абсолюно ни при чем.
ключевой момент именно в
where ((:prm is null) or
замени на
where ((:prm = 0) or
и будет то же самое.
Добавлено: 29 ноя 2004, 08:48
sasha
Vemerу от нула избавится не получится,
т.к. запрос внутри процедуры, а prm один из
ее параметров, если пользователь не указал его,
то и учитывать в запросе его бы нехотелось.
здесь есть 3 варианта:
Первый - тот что уже указал
Второй - по if выполнять различные запросы
Третий - составлять запрос в процедуре и
выполнять - execute statement
у всех свои минусы..
Первый - запрос не оптимизируется.
Второй - при большом количестве параметров процедуры сильно усложняются
Третий - минусы execute statement.