Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Написать запрос к таблице с null параметрами  [new]
risk
Member

Откуда: Харьков->Киев
Сообщений: 973
Relogin
risk
nvl(table.city,-1) = nvl(:p_city,-1)

Индекс на заюзается - функции в условии. :(

Может тогда все нулы убрать с таблицы - проапдейтить на какое-то дефолтное значение ? :)
20 фев 09, 11:42    [6843728]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
risk
Может тогда все нулы убрать с таблицы - проапдейтить на какое-то дефолтное значение ? :)

Это предлагалось.
20 фев 09, 11:45    [6843752]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Elic
Member

Откуда:
Сообщений: 29988
risk
Может тогда все нулы убрать с таблицы - проапдейтить на какое-то дефолтное значение ? :)
Парниша, ты, как и другие, не догоняешь. Задачи поиска null-ов нет
20 фев 09, 11:45    [6843756]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
risk
Member

Откуда: Харьков->Киев
Сообщений: 973
Elic
risk
Может тогда все нулы убрать с таблицы - проапдейтить на какое-то дефолтное значение ? :)
Парниша, ты, как и другие, не догоняешь. Задачи поиска null-ов нет

Да я их и не ищу Я понимаю так, что их надо как то оптимально заскипать при значении параметра null ?
20 фев 09, 11:50    [6843796]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
avas
Guest
Вовка-Морковка,

собирай селект динамически и не парься
20 фев 09, 12:00    [6843883]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
Давайте уточним задачу.
Надо отобрать записи :
1)при заданном, например сити = 45 - выбрать такие
2)при незаданном, например сити = null - выбрать все сити
20 фев 09, 12:01    [6843895]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
avas
Вовка-Морковка,

собирай селект динамически и не парься


Динамически это не мой вариант. Доступ у пользователей до таблиц на прямую нет. только до представлений.

To Elic.

Подскажите как сделать имея, только то что есть.
Я пока навалял большой селект. работает отлично. но меня просто не устраивает такое большое решение, с перебором возмжных вариантов. чтобы работали индексы.
20 фев 09, 12:10    [6843976]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Вовка-Морковка
Я пока навалял большой селект. работает отлично. но меня просто не устраивает такое большое решение, с перебором возмжных вариантов. чтобы работали индексы.

Удовлетвориться большим и не эффективным решением. Потому как у одного запроса может быть только один план. А автомобиль-амфибия, хоть и умеет ездить и плавать, тем не менее он плохо ездит и плохо плавает.

Выход - динамика. Либо под каждый кейс свой запрос.
Выход уже был предложен.
20 фев 09, 12:18    [6844047]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
avas
Guest
Вовка-Морковка

Динамически это не мой вариант. Доступ у пользователей до таблиц на прямую нет. только до представлений.


а как же работает запрос если нет доступа то? ))
20 фев 09, 12:23    [6844107]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
avas
Вовка-Морковка

Динамически это не мой вариант. Доступ у пользователей до таблиц на прямую нет. только до представлений.


а как же работает запрос если нет доступа то? ))


а ты сам подумай.

могу расказать, у юзеров доступ до представлений, представления работают с таблицами. а до таблиц прямого доступа нет.
20 фев 09, 13:46    [6844734]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
avas
Guest
да, действительно, был неправ - можно так сделать. (сделал сейчас тест). Мда, специфика организации базы накладывает свой отпечаток на то что помнишь из документации ))
20 фев 09, 14:25    [6845040]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and house=:house_ and :flat_ is null
union 
select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and house=:house_ and :flat_ is null
union
select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and :house_ is null and :flat_ is null
union
select city, street, house, flat
from adresa
where city=:city_ and :street_ is null and :house_ is null and :flat_ is null
union
select city, street, house, flat
from adresa
where :city_ is null and :street_ is null and :house_ is null and :flat_ is null

наткнулся с таким запросом на одну задницу.

один из запросов (а я думаю и остальные могут себя так повести)

select city, street, house, flat
from adresa
where city=:city_ and :street_ is null and :house_ is null and :flat_ is null

выполняется долго, хотя один из параметров null.
Думаю что Oracle в данному случае вычисляет функцию для каждой строки ( а у меня там не параметры а функции которые возвращают число)
функции типа: function getparam return number is begin return null; end;


так что совсем не до конца решена задача
20 фев 09, 16:15    [6845889]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
толку то от советов ;)
20 фев 09, 17:00    [6846181]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
niv76
Member

Откуда: Киев
Сообщений: 115
Вовка-Морковка
добрый день.

Допустим есть таблица адресов

select city, street, house, flat
from adresa
where (city=:city_ or :city_) and (street=:street_ or :street_ is null)
         and (house=:house_ or :house_ is null) and (flat=:flat_ or :flat_ is null)

запрос если параметры не установлены, то есть имеют значение null выполнятеся по не допустимое время. Соответственно если убираю условие проверки на null, то отрабатывает быстро. но не всего все четыре параметра можно задать.

Самый тупой вариант( по моему мнению) которой пришел на ум это

select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and house=:house_ and :flat_ is null
union 
select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and house=:house_ and :flat_ is null
union
select city, street, house, flat
from adresa
where city=:city_ and street=:street_ and :house_ is null and :flat_ is null
union
select city, street, house, flat
from adresa
where city=:city_ and :street_ is null and :house_ is null and :flat_ is null
union
select city, street, house, flat
from adresa
where :city_ is null and :street_ is null and :house_ is null and :flat_ is null

я думаю что может есть какой-нить хинт для этих целей.

Как по мне сильно много неясностей в задаче.
Выполняется медленно когда все параметры null, или когда часть параметров null?
Медленно работает для выборки, которая выбирает мало или много строк?
Какие из полей имеют ограничение not null ?
Есть ли цель селекта ВСЕГДА выбирать не большое число строк или также нужно чтобы выбирал и большое число строк? Если второе то одним селектом вы двух зайцев не убьете. Чтобы выбирать не большое число строк нужно использовать индекс, если большое число строк то фулскан, соответственно 2 разных плана....
20 фев 09, 18:40    [6846684]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
niv76

Как по мне сильно много неясностей в задаче.
Выполняется медленно когда все параметры null, или когда часть параметров null?


прочти самое начало

niv76

Медленно работает для выборки, которая выбирает мало или много строк?


Какой идиот оценивает запрос по времени его общего выполнения в зависимости от условий?!

niv76

Какие из полей имеют ограничение not null ?


ни какое.

niv76

Есть ли цель селекта ВСЕГДА выбирать не большое число строк или также нужно чтобы выбирал и большое число строк? Если второе то одним селектом вы двух зайцев не убьете. Чтобы выбирать не большое число строк нужно использовать индекс, если большое число строк то фулскан, соответственно 2 разных плана...


СПРАВОЧНИК АДРЕСОВ ДЛЯ ПОИСКА. КАК ТЫ ДУМАЕШЬ ЧТО НУЖНО?
21 фев 09, 08:52    [6847306]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Мое предложение использовать where nvl(:param, field)=field было связано с тем, что такой метод позволяет получить аналог ветвления по if ... then ... else в плане, благодаря конструкции CONCATENATION и предикатам. Соответственно в зависимости от параметров может выполняться например либо fullscan, либо доступ по индексу. Проблема в том, что этот метод хорошо работает с условием по одному полю и делать ветвление с условием по нескольким полям не может. Т.к. автор не предоставил ни скриптов ни планов, попытаюсь сделать ряд предположений на основе имеющихся данных.
Насколько я понял, предполагается что условие по city будет всегда (это следует из предоставленных запросов). Также кажется что автору хочется всегда использовался доступ по индексу, т.к. именно fullscan приводит к проблеме с производительностью. Варианты с вызовом функций на каждую строку не рассматриваю, т.к. не ясно что это за функции, почему они не deterministic и т.д. Исходя из этих предположений, я бы предложил решить задачу вот так:
create table adresa as select rownum  city, rownum street, rownum house, rownum flat from dual connect by level <= 10000;
create index idx_adresa on adresa(city, street);
explain plan for select * from adresa where city = :city_ and nvl(:street_, street)=street and nvl(:house_, house)=house and nvl(:flat_, flat)=flat;

select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
Plan hash value: 2638498704

--------------------------------------------------------------------------------------------
| Id  | Operation                     | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |            |     2 |   104 |     5   (0)| 00:00:01 |
|   1 |  CONCATENATION                |            |       |       |            |          |
|*  2 |   FILTER                      |            |       |       |            |          |
|*  3 |    TABLE ACCESS BY INDEX ROWID| ADRESA     |     1 |    52 |     3   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IDX_ADRESA |     1 |       |     2   (0)| 00:00:01 |
|*  5 |   FILTER                      |            |       |       |            |          |
|*  6 |    TABLE ACCESS BY INDEX ROWID| ADRESA     |     1 |    52 |     2   (0)| 00:00:01 |
|*  7 |     INDEX RANGE SCAN          | IDX_ADRESA |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(:STREET_ IS NULL)
   3 - filter("HOUSE"=NVL(:HOUSE_,"HOUSE") AND "FLAT"=NVL(:FLAT_,"FLAT"))
   4 - access("CITY"=TO_NUMBER(:CITY_))
       filter("STREET" IS NOT NULL)
   5 - filter(:STREET_ IS NOT NULL)
   6 - filter("FLAT"=NVL(:FLAT_,"FLAT") AND "HOUSE"=NVL(:HOUSE_,"HOUSE"))
   7 - access("CITY"=TO_NUMBER(:CITY_) AND "STREET"=:STREET_)
Из плана видно, что CONCATENATION объединяет две ветки с предикатами :STREET_ IS NULL и :STREET_ IS NOT NULL. Одновременно только одно из этих условий может быть истинно и соответственно будет выполняться какая-то одна ветка. Если, например, будет запрос на все адреса в пос. Гражданка Анучинского района Приморского края, то будет использоваться доступ по индексу через access("CITY"=TO_NUMBER(:CITY_)). Если на все дома по ул. Ладыгина г. Владивостока, то уже будет работать доступ через access("CITY"=TO_NUMBER(:CITY_) AND "STREET"=:STREET_). Естественно, запрос всех домов в г. Владивосток будет работать несколько медленно, но и сам запрос не очень вменяем. Индексы по полям house и flat создавать нельзя, т.к. оптимизатор может посчитать их более селективными и включить их в CONCATENATION, да и смысла в них никакого.
21 фев 09, 11:55    [6847404]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
niv76
Member

Откуда: Киев
Сообщений: 115
Вовка-Морковка
niv76

Как по мне сильно много неясностей в задаче.
Выполняется медленно когда все параметры null, или когда часть параметров null?


прочти самое начало

niv76

Медленно работает для выборки, которая выбирает мало или много строк?


Какой идиот оценивает запрос по времени его общего выполнения в зависимости от условий?!

niv76

Какие из полей имеют ограничение not null ?


ни какое.

niv76

Есть ли цель селекта ВСЕГДА выбирать не большое число строк или также нужно чтобы выбирал и большое число строк? Если второе то одним селектом вы двух зайцев не убьете. Чтобы выбирать не большое число строк нужно использовать индекс, если большое число строк то фулскан, соответственно 2 разных плана...


СПРАВОЧНИК АДРЕСОВ ДЛЯ ПОИСКА. КАК ТЫ ДУМАЕШЬ ЧТО НУЖНО?

Во первых, когда просишь людей о помощи, нужно хотя бы уважительно к ним относиться, и не употреблять таких слов как идеот, а то желания помогать отпадает.
Как по мне то задачка слишком простая и я не могу понять, то чего ты не можешь сделать.
Угадывать, что ты там разрабатываешь, лично мне не интересно....
Вобщем имеем 2 варианта:
1. Если не получается заюзать индекс, то подумай как использовать индекс на функцию. Заразом посмотрим насколько умный ты.
2. Второй вариант см. предыдущий пост.
:)
21 фев 09, 12:42    [6847443]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
Угадывать, что ты там разрабатываешь, лично мне не интересно....
а гадать не надо написано в посте все что надо

автор
Мое предложение использовать where nvl(:param, field)=field было связано с тем, что такой метод позволяет получить аналог ветвления по if ... then ... else в плане, благодаря конструкции CONCATENATION и предикатам.


Если я правильно понял, то вы предлагаете использовать подсказку USE_CONCAT. Я смотрел и так и сяк.
where nvl(:param, field)=field
и при этом условие не происходило обединение. ( то есть ставил такую подсказку)

автор
Соответственно в зависимости от параметров может выполняться например либо fullscan, либо доступ по индексу. Проблема в том, что этот метод хорошо работает с условием по одному полю и делать ветвление с условием по нескольким полям не может. Т.к. автор не предоставил ни скриптов ни планов, попытаюсь сделать ряд предположений на основе имеющихся данных.


просто навалял таблица и заполнил ее случайным образом

автор
Также кажется что автору хочется всегда использовался доступ по индексу, т.к. именно fullscan приводит к проблеме с производительностью.


да вы правы

автор
Варианты с вызовом функций на каждую строку не рассматриваю, т.к. не ясно что это за функции, почему они не deterministic и т.д.


я думал так сделать. но еще не пробывал. Меня пугает то что, доверительная функция возвращает одно и тоже. и не получится ли, если в текущей сессии сказать ей возвращать другое значение. не будет ли она брать старое. Хотя сейчас могу эксперементально проверить. Спасиб за пердложение.

прошу прощение. параметр city тоже может быть null.
21 фев 09, 13:38    [6847501]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Вовка-Морковка
Если я правильно понял, то вы предлагаете использовать подсказку USE_CONCAT.
Я не предлагал использовать хинт и в приведенном мной примере CONCATENATION работает без хинта.
Вовка-Морковка
параметр city тоже может быть null.
Я исходил из того, что селективное условие по городу, либо по городу и улице. Поиск например всех домов №2 во всей стране мне кажется противоречит здравому смыслу и если кто-то захотел этого, то пусть подождет и подумает, зачем. Опять же, если переданы все null, то насколько я понял, должны выбраться все записи, а это fullscan и если скорость не устраивает, то надо упростить вопрос до уровня, как оптимизировать select * from adresa.
21 фев 09, 13:58    [6847541]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
wurdu
Я не предлагал использовать хинт и в приведенном мной примере CONCATENATION работает без хинта.

Прошу прощения. просто у меня без хинта не берет по умолчанию.

wurdu
параметр city тоже может быть null.Я исходил из того, что селективное условие по городу, либо по городу и улице. Поиск например всех домов №2 во всей стране мне кажется противоречит здравому смыслу и если кто-то захотел этого, то пусть подождет и подумает, зачем. Опять же, если переданы все null, то насколько я понял, должны выбраться все записи, а это fullscan и если скорость не устраивает, то надо упростить вопрос до уровня, как оптимизировать select * from adresa.


согласен. Но это не решает проблему. Пользователь может задать тип улицы и выбрать все дома. Логически не понятно зачем. Но вдруг ;).

Посмотрите запрос (расширенный), там в каждой последующей строке, параметров со значением null уменьшается последовательно.
21 фев 09, 14:52    [6847619]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
niv76
Member

Откуда: Киев
Сообщений: 115
Вовка-Морковка,

Я так понял Вы хотите написать 1 запрос используя в качестве параметра 4-е бинд-переменные, причем любые из них могут быть пустыми. В результате получаем противоречие. Оптимизатор никогда не знает какие значения вы передаете, поэтому будет всегда использовать один план. А вам в зависимости от того какие параметры не заданы нужно использовать разные индексы, чтобы запрос работал быстро, т.е. разные планы выполнения. Поэтому лучшее решение динамически генерировать разные запросы.
21 фев 09, 15:15    [6847649]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
Вовка-Морковка
Member

Откуда: Оренбург
Сообщений: 202
niv76
Вовка-Морковка,

Я так понял Вы хотите написать 1 запрос используя в качестве параметра 4-е бинд-переменные, причем любые из них могут быть пустыми. В результате получаем противоречие. Оптимизатор никогда не знает какие значения вы передаете, поэтому будет всегда использовать один план. А вам в зависимости от того какие параметры не заданы нужно использовать разные индексы, чтобы запрос работал быстро, т.е. разные планы выполнения. Поэтому лучшее решение динамически генерировать разные запросы.


мне кажется Вы не правы. оптимизатор смотрит на то,что передано и строит план заново, и выбирает по его мнению лучший. (если конечно его нет уже в кеше).

и не моя практика динамически создавать запросы. Их придется делать на клиенте. а мне такой гемор не нужен. если я захочу (или кто по просит ) поменять логику. мне придется и переделывать клиента. а я лучше решу проблему на стороне сервера. и дешевле и правильнее (по крайней мере так считаю).
21 фев 09, 15:35    [6847677]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
niv76
Member

Откуда: Киев
Сообщений: 115
Вовка-Морковка
niv76
Вовка-Морковка,

Я так понял Вы хотите написать 1 запрос используя в качестве параметра 4-е бинд-переменные, причем любые из них могут быть пустыми. В результате получаем противоречие. Оптимизатор никогда не знает какие значения вы передаете, поэтому будет всегда использовать один план. А вам в зависимости от того какие параметры не заданы нужно использовать разные индексы, чтобы запрос работал быстро, т.е. разные планы выполнения. Поэтому лучшее решение динамически генерировать разные запросы.


мне кажется Вы не правы. оптимизатор смотрит на то,что передано и строит план заново, и выбирает по его мнению лучший. (если конечно его нет уже в кеше).

и не моя практика динамически создавать запросы. Их придется делать на клиенте. а мне такой гемор не нужен. если я захочу (или кто по просит ) поменять логику. мне придется и переделывать клиента. а я лучше решу проблему на стороне сервера. и дешевле и правильнее (по крайней мере так считаю).

Почитайте Том Кайта, что ли.
Наводящий вопрос, вчем разница между двумя парами запросов?
1. select * from a where a =12345 и select * from a where a =67890
2. select * from a where a = :1 где в качестве параметров переданы по очереди эти 2 числа 12345, 67890.
21 фев 09, 15:59    [6847694]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
wurdu
Мое предложение использовать where nvl(:param, field)=field было связано с тем, что такой метод позволяет получить аналог ветвления по if ... then ... else в плане, благодаря конструкции CONCATENATION и предикатам.


Well, just one comment. I do not know why, but for some reason optimizer is smart enought to split nvl(:param, field)=field into branches but is not smart enought to check if column is defined NOT NULL:

SQL> create table adresa as select rownum  city, rownum street, rownum house, rownum flat from dual
  2  connect by level <= 10000;

Table created.

SQL> alter table adresa modify(street not null)
  2  /

Table altered.

SQL> create index idx_adresa on adresa(city, street)
  2  /

Index created.

SQL> exec dbms_stats.gather_table_stats('SCOTT','ADRESA')

PL/SQL procedure successfully completed.

SQL> explain plan for select * from adresa where city = :city_ and nvl(:street_, street)=street and 
nvl(:house_, house)=house and nvl(:flat_, flat)=flat;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2638498704

--------------------------------------------------------------------------------------------
| Id  | Operation                     | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |            |     2 |    30 |     5   (0)| 00:00:01 |
|   1 |  CONCATENATION                |            |       |       |            |          |
|*  2 |   FILTER                      |            |       |       |            |          |
|*  3 |    TABLE ACCESS BY INDEX ROWID| ADRESA     |     1 |    15 |     3   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | IDX_ADRESA |     1 |       |     2   (0)| 00:00:01 |
|*  5 |   FILTER                      |            |       |       |            |          |

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
|*  6 |    TABLE ACCESS BY INDEX ROWID| ADRESA     |     1 |    15 |     2   (0)| 00:00:01 |
|*  7 |     INDEX RANGE SCAN          | IDX_ADRESA |     1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(:STREET_ IS NULL)
   3 - filter("HOUSE"=NVL(:HOUSE_,"HOUSE") AND "FLAT"=NVL(:FLAT_,"FLAT"))
   4 - access("CITY"=TO_NUMBER(:CITY_))
       filter("STREET" IS NOT NULL)

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
   5 - filter(:STREET_ IS NOT NULL)
   6 - filter("FLAT"=NVL(:FLAT_,"FLAT") AND "HOUSE"=NVL(:HOUSE_,"HOUSE"))
   7 - access("CITY"=TO_NUMBER(:CITY_) AND "STREET"=:STREET_)

25 rows selected.

SQL> 

SY.
21 фев 09, 16:13    [6847708]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос к таблице с null параметрами  [new]
niv76
Member

Откуда: Киев
Сообщений: 115
Вовка-Морковка
niv76
Вовка-Морковка,

Я так понял Вы хотите написать 1 запрос используя в качестве параметра 4-е бинд-переменные, причем любые из них могут быть пустыми. В результате получаем противоречие. Оптимизатор никогда не знает какие значения вы передаете, поэтому будет всегда использовать один план. А вам в зависимости от того какие параметры не заданы нужно использовать разные индексы, чтобы запрос работал быстро, т.е. разные планы выполнения. Поэтому лучшее решение динамически генерировать разные запросы.


мне кажется Вы не правы. оптимизатор смотрит на то,что передано и строит план заново, и выбирает по его мнению лучший. (если конечно его нет уже в кеше).

и не моя практика динамически создавать запросы. Их придется делать на клиенте. а мне такой гемор не нужен. если я захочу (или кто по просит ) поменять логику. мне придется и переделывать клиента. а я лучше решу проблему на стороне сервера. и дешевле и правильнее (по крайней мере так считаю).

Еще одна подсказка. Попробуйте сделать план вашего запроса, например этого:

select city, street, house, flat
from adresa
where (city=:city_ or :city_) and (street=:street_ or :street_ is null)
and (house=:house_ or :house_ is null) and (flat=:flat_ or :flat_ is null)

Оптимизатор его выполнит НЕ СПРАШИВАЯ ВАС "Введите значения для :city_ ....", а Вы говорить, что он смотрит на то, что передано. Неувязочка, однако.... :)
21 фев 09, 16:36    [6847726]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить