select * from A where (:param is null OR A.param=:param)
суть такова. входной параметр может быть либо пустым (тогда мы должны вернуть все записи, либо не пустым — и тогда мы должны по нему отфильтровать выборку.
Тут где-то в соседних темах прозвучало что OR нельзя использовать в джойнах, поэтому я задмуаласмь — может по производительности или по другим характеристикам — я не должна так делать?
По идее я эту логику (пусто-непусто) могу сделать на клиенте, откуда вызываю запрос. Но это кода больше .. Либо оставить так как выше . Посоветуйте, какой best practice применяется у оракловодов в данном случае
Лучше сделать на клиенте. Если по фильтруемому полю есть индекс, то выполнение запроса в зависимости от значения параметра должно идти двумя разными способами: в одном случае — прочитать и вернуть первые несколько блоков таблицы, в другом — прочитать индекс и вернуть первые найденные по нему записи. В последних версиях Оракла предприняты некоторые меры для того, чтобы такие запросы приемлемо выполнялись при любых значениях параметров, но лучше и надёжнее чётко и точно сказать серверу, что именно нужно получить.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, зиг, Вы писали:
S>Лучше сделать на клиенте. Если по фильтруемому полю есть индекс, то выполнение запроса в зависимости от значения параметра должно идти двумя разными способами: в одном случае — прочитать и вернуть первые несколько блоков таблицы, в другом — прочитать индекс и вернуть первые найденные по нему записи. В последних версиях Оракла предприняты некоторые меры для того, чтобы такие запросы приемлемо выполнялись при любых значениях параметров, но лучше и надёжнее чётко и точно сказать серверу, что именно нужно получить.
господа оракловоды, вы уж определитесь. наверху пишут что исходный запрос тоже нормальный. кому верить?
Re[3]: oracle: теоретический вопрос про OR операнд
Здравствуйте, зиг, Вы писали:
зиг>Есть вот такой простой запрос: зиг>
зиг>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 операнд
Здравствуйте, BlackEric, Вы писали:
BE>Ваш запрос вполне нормальный.
Этот запрос не такой уж страшно плохой, но ненормальный.
Если гворить в целом о подходе для решения такой задачи -- генерация ad-hoc параметрических запросов
с многочисленными параметрами, когда параметр может быть либо пустым, либо не пустым — и тогда мы должны по нему отфильтровать выборку --
то такой подход просто становится неприемлимым.
Re[2]: oracle: теоретический вопрос про OR операнд