Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

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

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

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


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

СУБД - Yaffil 884


 
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]

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


 
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


 
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
что за отбор такой?


 
Кщд   (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

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


 
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)


 
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) наверное это?


 
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


 
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), то его просто игнорировать.


 
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 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]

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

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


 
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-ом?


 
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]

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


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

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


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


> Johnmen ©  


индекс - PRIMARY KEY

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


 
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


 
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 :)


 
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: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-ов  ???


 
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 штук

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


 
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?

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


 
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
 <второй запрос и т.д.>


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


 
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! тело выборки.


 
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.


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

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


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

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


 
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)


 
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 бороться за использование индексов, по-моему бессмысленно...


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

>pashtet ©  

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


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

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

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


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

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

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


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

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


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

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



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

Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.063 c
14-1082473786
Undert
2004-04-20 19:09
2004.05.09
нЕ подскажете что за кодировка ?


1-1082382811
A. Sonin
2004-04-19 17:53
2004.05.09
Собственное создание формы без использования кода в проекте


7-1080029027
Аноним
2004-03-23 11:03
2004.05.09
MSDN -> Delphi


3-1081947063
Oksana
2004-04-14 16:51
2004.05.09
Ошибка при открытии dbf через ADO


4-1079640613
twink
2004-03-18 23:10
2004.05.09
MouseClick





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский