Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Почему не используется индекс запросе..?   Найти похожие ветки 

 
pashtet ©   (2004-04-12 11:14) [0]

Вот такой запрос идет по NATURAL, а не по PRIMARY KEY.

select * from mytable
where (:id is null or id=:id)


как с этим бороться?

СУБД - Yaffil 884


 
Anatoly Podgoretsky ©   (2004-04-12 11:18) [1]

Это вообще не должно работать, метаданные не могут быть параметром.


 
asp ©   (2004-04-12 11:20) [2]

...
WHERE ID = :ID OR CAST(:ID AS INTEGER) IS NULL


 
Кщд   (2004-04-12 11:23) [3]

asp ©   (12.04.04 11:20) [2]
CAST(:ID AS INTEGER) IS NULL
что за отбор такой?


 
stud ©   (2004-04-12 11:24) [4]


> where (:id is null

а это как понимать?


 
pashtet ©   (2004-04-12 11:27) [5]

c null я ошибся... пардон.
так правильнее:

select * from mytable
where (5=6 or id=5)


 
stud ©   (2004-04-12 11:30) [6]


> where (5=6

это что???? что значит 5=6???
если поле=6 это понятно, а иначе какое отношение эта конструкция имеет отношение к данным??

> select * from mytable
> where (5=6 or id=5)

select * from mytable
where (id=6 or id=5) наверное это?


 
Reindeer Moss Eater ©   (2004-04-12 11:36) [7]

where (5=6 or id=5)

Это то же самое чо и
where false or id = 5

Вы что, встаете в ступор от элементарных заглушек типа where 0=0


 
asp ©   (2004-04-12 11:41) [8]

Кщд   (12.04.04 11:23) [3]>
Иногда может быть удобным программирование по схеме: если параметр такой-то содержит конкретное значение, то возвращать выборку по данному значению, в случае если параметр не определен (is null), то его просто игнорировать.


 
pashtet ©   (2004-04-12 11:42) [9]

поясню от куда возник вопрос.

есть ХП которая делает выборку

create procedure ORDERS_GET(
 IDORDER integer)
returns(
 NAME varchar(20))
as
begin
for select NAME from ORDERS
where (:IDORDER is null or ID_ORDER = :IDORDER)
into :NAME
do suspend;
end

такая процедура хороша тем, что если нам надо выбрать все заказы или только один, то мы запускаем процедуру с параметром null либо со значением.

и когда запускаем процедуру с известным параметром то в запросе не используется индекс!!!!


 
pashtet ©   (2004-04-12 12:06) [10]

Разве никто не делал такие выборки??

кто может подсказать как сделать подобные выборки , что бы использовался индекс?


 
Nikolay M. ©   (2004-04-12 12:07) [11]


> for select NAME from ORDERS
> where (:IDORDER is null or ID_ORDER = :IDORDER)

1) В ИБ есть возможность указать оптимизатору запросов испотльзовать какой-либо индекс?
2) А если побить на два запроса и сцепить UNION-ом?


 
Johnmen ©   (2004-04-12 12:09) [12]

С чего ты взял, что не используется ?
И есть ли он вообще ? И какой ?


 
pashtet ©   (2004-04-12 12:12) [13]


> Johnmen ©  


индекс - PRIMARY KEY

не используется
т.к. IBExpert дает след. план:
PLAN (ORDERS NATURAL)


 
Johnmen ©   (2004-04-12 12:28) [14]

>pashtet ©   (12.04.04 12:12) [13]

Это из-за наличия жесткого условия :IDORDER is null


 
Romkin ©   (2004-04-12 12:38) [15]

Это из-за наличия or :))
БЕй на два селекта, а какой запускать - смотри в if :)


 
pashtet ©   (2004-04-12 12:38) [16]


> Johnmen ©   (12.04.04 12:28) [14]
> Это из-за наличия жесткого условия :IDORDER is null


не знаю жесткого или нет, но если оставить "жесткое" условие и вместо or написать and то индекс использоваться БУДЕТ.

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


 
pashtet ©   (2004-04-12 12:42) [17]


> Romkin ©   (12.04.04 12:38) [15]


> БЕй на два селекта, а какой запускать - смотри в if :)


а если входных пареметров - 8 штук
то писать 8! if-ов  ???


 
Johnmen ©   (2004-04-12 13:01) [18]

>pashtet ©   (12.04.04 12:42) [17]
>а если входных пареметров - 8 штук

А в одном ифе разве нельзя проанализировать ?


 
pashtet ©   (2004-04-12 13:33) [19]


> Johnmen ©   (12.04.04 13:01) [18]


а как в условии WHERE поставить if?

или предлагаете на саспенд поставить иф?


 
Johnmen ©   (2004-04-12 13:39) [20]

>pashtet ©   (12.04.04 13:33) [19]

IF ((:P1 IS NULL) OR (:P2 IS NULL) ...) THEN
 <первый запрос и т.д.>
ELSE
 <второй запрос и т.д.>


Или я чего не понял ?


 
pashtet ©   (2004-04-12 13:55) [21]


> IF ((:P1 IS NULL) OR (:P2 IS NULL) ...) THEN
>  <первый запрос и т.д.>
> ELSE
>  <второй запрос и т.д.>


ну так ведь придется для 8 параметров написать 8! условий, соответственно повторить 8! тело выборки.


 
Johnmen ©   (2004-04-12 14:01) [22]

Туману нагнал ещё больше...
Приведи целиком твоё условие WHERE.


 
sniknik ©   (2004-04-12 14:01) [23]

лутше уж процедура будет больше чем время выборки.


 
pashtet ©   (2004-04-12 14:07) [24]


> Johnmen ©  


    where
       (o.IS_DELETED=0) and
       (:TERMINAL is null or o.ID_TERMINAL = :TERMINAL) and
       (:ID is null or o.ID_ORDER =:ID) and
       (:F is null or o.D_PROJECT >=:F) and
       (:T is null or o.D_PROJECT <:T+1) and
       (:ORDERTYPE is null or o.ID_ORDERTYPE = :ORDERTYPE) and
       (:PTYPE is null or (o.ID_PTYPE = :PTYPE and :ORDERTYPE is not null)) and
       (:PROD is null or o.ID_PROD = :PROD) and
       (:AGENT is null or o.ID_AGENT IN (SELECT ID_AGENT from AGENTS WHERE ID_PARENT=(SELECT ID_PARENT from AGENTS WHERE ID_AGENT=:AGENT))) and
       (:MANAGER is null or o.ID_MANAGER = :MANAGER) and
       (:CB_CONFIRM is null or (:CB_CONFIRM = 1 and o.D_CONFIRM is not null) or (:CB_CONFIRM = 0 and o.D_CONFIRM is null)) and
       (:CB_REJECT is null or (:CB_REJECT = 1 and o.D_REJECT is not null) or (:CB_REJECT = 0 and o.D_REJECT is null)) and
       (:CB_SHIPPED is null or (:CB_SHIPPED = 1 and (exists (select * from PACKPOS p where o.ID_ORDER = p.ID_ORDER))) or (:CB_SHIPPED = 0 and (not (exists (select * from PACKPOS p where o.ID_ORDER = p.ID_ORDER))))) and
       (:CB_ZERO is null or (:CB_ZERO=1 and (o.PRICE+o.PRICEA)=0) or (:CB_ZERO=0 and (o.PRICE+o.PRICEA)<>0)) and
       (:CURRENCY is null or ID_CURRENCY = :CURRENCY)


 
Johnmen ©   (2004-04-12 14:30) [25]

>pashtet ©  

С таким where бороться за использование индексов, по-моему бессмысленно...


 
pashtet ©   (2004-04-12 15:43) [26]

вот что сказали на sql.ru :

Вообще-то в случае когда в WHERE сравнивается входной параметр с чем-то, не являющимся полем таблицы ... индексы в FB не используются


 
Johnmen ©   (2004-04-12 15:45) [27]

В частности это неверно, о чем ты сам сказал в [16]
:)



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
11-1060108839
Юджин
2003-08-05 22:40
2004.04.11
Народ нужна помощь, проблема с установкой и работой компонентов


14-1080850933
VMcL
2004-04-02 00:22
2004.04.11
Ваши оценки


1-1080319114
Федя Мегатронов
2004-03-26 19:38
2004.04.11
Компилируеться вникуда (помогите с глюком)


8-1071338095
SliderCrash
2003-12-13 20:54
2004.04.11
Проблема с алгоритмом.


9-1071875450
HolyMan
2003-12-20 02:10
2004.04.11
Определение FreeForm