oracle: теоретический вопрос про OR операнд
От: зиг Украина  
Дата: 08.05.15 12:05
Оценка:
Есть вот такой простой запрос:
select * from A where (:param is null OR A.param=:param)


суть такова. входной параметр может быть либо пустым (тогда мы должны вернуть все записи, либо не пустым — и тогда мы должны по нему отфильтровать выборку.
Тут где-то в соседних темах прозвучало что OR нельзя использовать в джойнах, поэтому я задмуаласмь — может по производительности или по другим характеристикам — я не должна так делать?
По идее я эту логику (пусто-непусто) могу сделать на клиенте, откуда вызываю запрос. Но это кода больше .. Либо оставить так как выше . Посоветуйте, какой best practice применяется у оракловодов в данном случае
Re: oracle: теоретический вопрос про OR операнд
От: BlackEric http://black-eric.lj.ru
Дата: 08.05.15 12:22
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>Есть вот такой простой запрос:

зиг>
зиг>select * from A where (:param is null OR A.param=:param)
зиг>


Ваш запрос вполне нормальный.

Про OR in (+) читайте первоисточники
Joins
https://github.com/BlackEric001
Re: oracle: теоретический вопрос про OR операнд
От: Softwarer http://softwarer.ru
Дата: 08.05.15 12:22
Оценка:
Здравствуйте, зиг, Вы писали:

Лучше сделать на клиенте. Если по фильтруемому полю есть индекс, то выполнение запроса в зависимости от значения параметра должно идти двумя разными способами: в одном случае — прочитать и вернуть первые несколько блоков таблицы, в другом — прочитать индекс и вернуть первые найденные по нему записи. В последних версиях Оракла предприняты некоторые меры для того, чтобы такие запросы приемлемо выполнялись при любых значениях параметров, но лучше и надёжнее чётко и точно сказать серверу, что именно нужно получить.
Re: oracle: теоретический вопрос про OR операнд
От: wildwind Россия  
Дата: 08.05.15 13:02
Оценка: 2 (1)
Здравствуйте, зиг, Вы писали:

зиг> Посоветуйте, какой best practice применяется у оракловодов в данном случае

select * from A where A.param = NVL(:param, A.param)


В последних версиях (10.2 и выше) такой код обрабатывается правильно (выбирается наиболее эффективный план).
avalon/1.0.442
Re[2]: oracle: теоретический вопрос про OR операнд
От: зиг Украина  
Дата: 08.05.15 13:03
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, зиг, Вы писали:


S>Лучше сделать на клиенте. Если по фильтруемому полю есть индекс, то выполнение запроса в зависимости от значения параметра должно идти двумя разными способами: в одном случае — прочитать и вернуть первые несколько блоков таблицы, в другом — прочитать индекс и вернуть первые найденные по нему записи. В последних версиях Оракла предприняты некоторые меры для того, чтобы такие запросы приемлемо выполнялись при любых значениях параметров, но лучше и надёжнее чётко и точно сказать серверу, что именно нужно получить.


господа оракловоды, вы уж определитесь. наверху пишут что исходный запрос тоже нормальный. кому верить?
Re[3]: oracle: теоретический вопрос про OR операнд
От: BlackEric http://black-eric.lj.ru
Дата: 08.05.15 13:37
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>господа оракловоды, вы уж определитесь. наверху пишут что исходный запрос тоже нормальный. кому верить?


Это зависит от версии оракла, индексов и размера таблицы. А так, в принципе, будет работать все перечисленное
https://github.com/BlackEric001
Re: oracle: теоретический вопрос про OR операнд
От: MasterZiv СССР  
Дата: 18.05.15 12:59
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>Есть вот такой простой запрос:

зиг>
зиг>select * from A where (:param is null OR A.param=:param)
зиг>


зиг>суть такова. входной параметр может быть либо пустым (тогда мы должны вернуть все записи, либо не пустым — и тогда мы должны по нему отфильтровать выборку.

зиг>Тут где-то в соседних темах прозвучало что OR нельзя использовать в джойнах, поэтому я задмуаласмь — может по производительности или по другим характеристикам — я не должна так делать?
зиг>По идее я эту логику (пусто-непусто) могу сделать на клиенте, откуда вызываю запрос. Но это кода больше .. Либо оставить так как выше . Посоветуйте, какой best practice применяется у оракловодов в данном случае

Лучшая практика (и не только для Oracle, а для любой СУБД) -- условно выполнить один из двух запросов:

select * from A where A.param=:param


или

select * from A
Re[2]: oracle: теоретический вопрос про OR операнд
От: MasterZiv СССР  
Дата: 18.05.15 13:10
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Ваш запрос вполне нормальный.


Этот запрос не такой уж страшно плохой, но ненормальный.
Если гворить в целом о подходе для решения такой задачи -- генерация ad-hoc параметрических запросов
с многочисленными параметрами, когда параметр может быть либо пустым, либо не пустым — и тогда мы должны по нему отфильтровать выборку --
то такой подход просто становится неприемлимым.
Re[2]: oracle: теоретический вопрос про OR операнд
От: MasterZiv СССР  
Дата: 18.05.15 13:11
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Лучше сделать на клиенте.


Можно сделать и на сервере, в процедуре, особенно если это -- oracle.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.