powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / http://www.firebirdfaq.org/faq37/
12 сообщений из 12, страница 1 из 1
http://www.firebirdfaq.org/faq37/
    #38821390
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторWhy is my query that uses IN or NOT IN slow?

This is an issue with Firebird optimizer. In newer Firebird versions the problem with IN is fixed, but the problem with NOT IN remains. In any case, it is safe and often faster to use EXISTS and NOT EXISTS instead. Each IN and NOT IN query can be rewritten to use EXISTS and NOT EXISTS.

авторAll contents are copyright © 2007-2014 FirebirdFAQ.org unless otherwise stated in the text.

подскажите - до какой примерно версии этот совет актуален?
Использую 2.1.5
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821394
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До сегодняшней.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821405
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

в 2.5 NOT IN оптимизируется лучше, чем до 2.5.
Но NOT EXISTS всё равно лучше.
Но надо понимать, что это не эквивалентные запросы.
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821407
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

1. В 2.5 между IN и EXISTS вроде нет разницы по быстродействию
2. Насчёт замены NOT IN на NOT EXISTS вообще не очень верный совет. В некоторых ситуациях они не эквивалентны
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821412
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747

ты про field in (select..., или про field in (1, 2, 3... ?
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821424
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. В 2.5 между IN и EXISTS вроде нет разницы по быстродействию
ее и в 2.1 нет
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821470
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Я про
Delete ... where Exist ( Select ...)
vs
Delete ... where ID in (Select ...)
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821484
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

Без разницы.

Если надо разворачивать потоки, то только через EXECUTE BLOCK, в трёшке можно MERGE с DELETE применять.
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821657
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

увы, не понял, при чём тут потоки.

Хочется понять, будет ли сколь-либо существенная разница быстродействия в разном построении запроса:
а) Delete ... where Exist ( Select ...)
vs
б) Delete ... where ID in (Select ...)
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38821675
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

нет не будет. Потоки это про то с какой стороны запрос выполнять. Можно пробежаться по записям удаляемой таблицы и проверять их существование в другой таблице/запросе. А можно наоборот, по другой таблице отбирать удаляемые записи.
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38822045
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Хочется понять, будет ли сколь-либо существенная разница быстродействия в разном построении запроса:
а) Delete ... where Exist ( Select ...)
vs
б) Delete ... where ID in (Select ...)
Для ФБ-3.0 (увы, но не для 2.5) на некоторых данных можно получить разницу. Но не между IN vs EXISTS, а между вариантами подзапроса. Если добавить внутрь кляузу 'order by <field>' (разумеется, при условии что <field> - индексное), то при большом объеме ведомого источника можно поиметь нехилый профит.

Но это так, зарубка на будущее - вдруг кто сюда заглянет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
alter sequence g restart with 0;
recreate table t1(id int primary key, x int);
recreate table t2(id int primary key, x int);
commit;

insert into t1 select gen_id(g,1), 1000 + rand()*1000
from rdb$types,rdb$types,rdb$types
rows 50000;
commit;

insert into t2 select gen_id(g,1), 1100 + rand()*2100
from rdb$types,rdb$types,rdb$types
rows 5000000;
commit;

create index t1_x on t1(x);
create index t2_x on t2(x);
commit;


select count(*)
from t1
where exists (select x from t2 where t2.x = t1.x); --  7s 437ms, 456973 fetches

-- vs --

select count(*)
from t1
where exists (select x from t2 where t2.x = t1.x order by t2.x); -- 313ms, 390911 fetches

ЗЫ. Секрет второго запроса - в плане, который для ФБ-3.х таков:
Код: plaintext
1.
2.
PLAN (T2 ORDER T2_X)
PLAN (T1 NATURAL)
- и в нём, как видим, нет INDEX-кляузы по T2 ==> нет построения большого битмапа по ведомой таблице на каждый чих из ведущей таблицы.
...
Рейтинг: 0 / 0
http://www.firebirdfaq.org/faq37/
    #38822051
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

хм... А ведь это можно было бы использовать чтобы сделать оптимизатор умнее. По идее он мог бы сам догадаться не строить битмап. Но для этого наверное надо рассматривать подзапросы в exists не как отдельные, а как semi-join с основным запросом.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / http://www.firebirdfaq.org/faq37/
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]