powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
11 сообщений из 36, страница 2 из 2
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376263
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

нет конечно. exists использует индекс если это возможно.

Другое дело, что в случае JOIN есть варианты NESTED LOOP с индексом, если есть, и HASH/MERGE JOIN без индекса. Для LEFT JOIN пока вариантов нет. Надеюсь в 4.0 будет.

EXISTS/NOT EXISTS тут без вариантов. Сейчас выполняется как подзапрос и обрывается на первом найденном, что может быть быстрее, а может и не быть.

Если в будущем EXISTS будет выполняться как LEFT OUTER SEMI JOIN, а NOT EXISTS как LEFT OUTER ANTI JOIN с выбором алгоритма соединения, то EXIST практически никогда не должен проигрывать.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376268
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениснет конечно. exists использует индекс если это возможно.

Я и не говорил, что не использует.

Да, при JOIN тоже будет NESTED LOOPS по индексу, и большой разницы наверное не будет. Но, насколько я понимаю, операции все-таки будут разные при JOIN и при exists.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376273
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

сейчас exists это не JOIN, хотя мог бы выполняться как SEMI JOIN.
Я бы сказал, что однозначно сказать нельзя что быстрее.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376281
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Действительно. Проверил на таблице, с большим количеством деталей. exists работает быстрее в несколько раз. За счет меньшего числа fetch-ей.

Вот статистика:
exists:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Query
------------------------------------------------
select sobj_name from sys_objects s
where not exists (select null from sys_fields f where f.sobj_name=s.sobj_name)


Plan
------------------------------------------------
PLAN (F INDEX (PK_SYS_FIELDS))
PLAN (S NATURAL)

Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 47,00 ms
Avg fetch time: 0,08 ms

Memory
------------------------------------------------
Current: 16 258 952
Max    : 16 375 576
Buffers: 400

Operations
------------------------------------------------
Read   : 1 385
Writes : 0
Fetches: 30 188
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|SYS_FIELDS                     |         0 |      4191 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
|SYS_OBJECTS                    |         0 |         0 |        4271 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

join:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Query
------------------------------------------------
select s.sobj_name from sys_objects s
left join sys_fields f on f.sobj_name=s.sobj_name
where f.sobj_name is null

Plan
------------------------------------------------
PLAN JOIN (S NATURAL, F INDEX (PK_SYS_FIELDS))

Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 156,00 ms
Avg fetch time: 0,28 ms

Memory
------------------------------------------------
Current: 16 208 664
Max    : 16 375 576
Buffers: 400

Operations
------------------------------------------------
Read   : 4 504
Writes : 0
Fetches: 118 122
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|SYS_FIELDS                     |         0 |     48158 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
|SYS_OBJECTS                    |         0 |         0 |        4271 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376393
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzekselect s.sobj_name from sys_objects s
left join sys_fields f on f.sobj_name=s.sobj_name
where f.sobj_name is null

where s.sobj_name is null !
выбираем все из F, и убираем всех, кто есть "справа" - S.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376694
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так всё таки - как быстрее? )
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376706
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

зависит от распределения данных, наличия индексов.

Надо пробовать в каждом конкретном случае. Моё ИХМО NOT EXISTS в большинстве случаев быстрее, но бывают исключения.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376769
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Если таблица деталей сильно большая по сравнению с таблицей мастеров и в таблице мастеров много записей без ссылок на таблицу деталей, то однозначно not exists.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376865
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

таблица деталей на порядок (реально - раз в 30) больше мастеров. но мастеров пустых бывает обычно мало - единицы, десятки. попробую на реальных данных оба варианта, спасибо.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376950
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvRomanzekselect s.sobj_name from sys_objects s
left join sys_fields f on f.sobj_name=s.sobj_name
where f.sobj_name is null

where s.sobj_name is null !
выбираем все из F, и убираем всех, кто есть "справа" - S.

kdv, наверное Вы все-таки ошиблись :) если написать where s.sobj_name is null, то всегда будет гарантированно 0 записей, так как sobj_name - PK.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376958
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzek,

Да, перепутал.
раз у вас запрос
select s.sobj_name from sys_objects s
left join sys_fields f on f.sobj_name=s.sobj_name
where f.sobj_name is null

то есть, s left join f,
то f.... is null - верно.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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