Форум: "Базы";
Текущий архив: 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.04 c