powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
36 сообщений из 36, показаны все 2 страниц
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375693
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связка мастер - деталь. В базе существуют мастера, у которых нет ни одной записи о деталях. Как быстрее всего выбрать такие записи? Связка идет по первичному ключу + внешнему. FB 2.0 и выше.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375696
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
where not exists - единственный способ.

Для дальнейшего ускорения надо менять структуру БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375697
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

LEFT JOIN, NOT EXISTS
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375704
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да, спасибо. перебором только получается, так и думал.

причем не получается :) посмотрите, плиз, на запрос, что не так делаю:

Код: sql
1.
select series.series_uid from series where not exists (select images.series_uid from images)



связка идёт по полю series_uid, как понятно из запроса. не выбирается ни одна запись, хотя точно существует одна запись серий без изображений.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375710
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсвязка идёт по полю series_uid
Не вижу в каком месте у тебя "связь идёт". Ткни пальцем на букву.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375712
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

в базе
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375713
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсвязка идёт по полю series_uid, как понятно из запроса.
где это видно и понятно?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375714
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

могу структуру таблиц частично выложить. там простая связь по указанным полям PK > FK.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375719
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

связи между таблицами может вообще не быть. И на запросы эта связь вообще никак не влияет.
вопрос Дениса Симонова был про запрос.

Вам надо писать
select ...
from master m left join details d
on m.id = d.m_id
where d.m_id is null

http://www.ibase.ru/joins/
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375721
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonв базе
А рация - на бронепоезде, ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375723
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

спасибо, получилось )

Код: sql
1.
2.
3.
select m.series_uid from series m left join images d
on m.series_uid = d.series_uid
where d.series_uid is null
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375843
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

классический вариант такой:
Код: sql
1.
select series.series_uid from series where not exists (select images.series_uid from images where images.series_uid=series.series_uid)
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375896
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

не знаю, почему он классический. Для меня классический - мой вариант, с left join.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375901
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvне знаю, почему он классический. Для меня классический - мой вариант, с left join.
Вы разных классиков читаете.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375904
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

+1
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375961
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду классический при использовании EXISTS.
Кстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375979
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIнарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему.
нарвемся на сканирование всей таблицы мастера. а куда деваться?
такие запросы мне приходилось писать, когда попадались битые базы с потерянными данными в справочниках.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375997
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIКстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? НарвёмсяУверен ?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376017
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvДля меня классический - мой вариант, с left join.

Вот только при наличии большой толпы деталей к каждому мастеру, не будет ли он тормозить,
сначала выбирая каждую деталь, а только потом проверяя поле на NULL?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376047
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovсначала выбирая каждую деталь
эээ, шо? a left join b - в a будут выбраны все записи, из b будут выбраны записи по индексу.
сколько там и чего будет выбрано - абсолютно пофиг, ибо результат важнее скорости. А насчет exists - оно что, будет быстрее?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvА насчет exists - оно что, будет быстрее?
По идее - да, поскольку остановится на первой найденной детали и даже не будет её
распаковывать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376060
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подтверждаю (иначе писать не стал бы). При left join вся таблица деталей "фетчится". И представьте. у Вас 100 мастеров, а 50-ти выдавали детали по нескольку штук каждый рабочий день. И в запросе за год будет какое-то сумасшедшее время выполнения.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376188
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПо идее - да
Помнится у меня join работал быстрее, хотя я ожидал быстрого exists....
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376239
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не ошибаюсь.
exist => nested loops (без вариантов)
join => join по индексу (если он конечно есть)

Имхо, немного разные алгоритмы. Join должен работать быстрее в большинстве случаев.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzekexist => nested loops (без вариантов)
join => join по индексу (если он конечно есть)
И?.. "Join по индексу" может выполняться как-то кроме nested loop с учётом его
outer-ности? Вы там в RB научили его использовать merge?.. Стандартный птиц не умеет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #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
36 сообщений из 36, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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