|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Связка мастер - деталь. В базе существуют мастера, у которых нет ни одной записи о деталях. Как быстрее всего выбрать такие записи? Связка идет по первичному ключу + внешнему. FB 2.0 и выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 23:29 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
where not exists - единственный способ. Для дальнейшего ускорения надо менять структуру БД. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 23:34 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaon, LEFT JOIN, NOT EXISTS ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 23:35 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, да, спасибо. перебором только получается, так и думал. причем не получается :) посмотрите, плиз, на запрос, что не так делаю: Код: sql 1.
связка идёт по полю series_uid, как понятно из запроса. не выбирается ни одна запись, хотя точно существует одна запись серий без изображений. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2016, 23:49 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaonсвязка идёт по полю series_uid Не вижу в каком месте у тебя "связь идёт". Ткни пальцем на букву. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 00:02 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, в базе ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 00:09 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaonсвязка идёт по полю series_uid, как понятно из запроса. где это видно и понятно? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 00:28 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdv, могу структуру таблиц частично выложить. там простая связь по указанным полям PK > FK. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 00:39 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 00:56 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaonв базе А рация - на бронепоезде, ага... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 01:07 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdv, спасибо, получилось ) Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 01:18 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaon, классический вариант такой: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 10:26 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
KreatorXXI, не знаю, почему он классический. Для меня классический - мой вариант, с left join. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 11:52 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdvне знаю, почему он классический. Для меня классический - мой вариант, с left join. Вы разных классиков читаете. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 11:55 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdv, +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 11:57 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Я имел ввиду классический при использовании EXISTS. Кстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 12:54 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
KreatorXXIнарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему. нарвемся на сканирование всей таблицы мастера. а куда деваться? такие запросы мне приходилось писать, когда попадались битые базы с потерянными данными в справочниках. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 13:10 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
KreatorXXIКстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? НарвёмсяУверен ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 13:18 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdvДля меня классический - мой вариант, с left join. Вот только при наличии большой толпы деталей к каждому мастеру, не будет ли он тормозить, сначала выбирая каждую деталь, а только потом проверяя поле на NULL? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 13:34 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovсначала выбирая каждую деталь эээ, шо? a left join b - в a будут выбраны все записи, из b будут выбраны записи по индексу. сколько там и чего будет выбрано - абсолютно пофиг, ибо результат важнее скорости. А насчет exists - оно что, будет быстрее? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 13:55 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
kdvА насчет exists - оно что, будет быстрее? По идее - да, поскольку остановится на первой найденной детали и даже не будет её распаковывать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 13:58 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Я подтверждаю (иначе писать не стал бы). При left join вся таблица деталей "фетчится". И представьте. у Вас 100 мастеров, а 50-ти выдавали детали по нескольку штук каждый рабочий день. И в запросе за год будет какое-то сумасшедшее время выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 14:08 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovПо идее - да Помнится у меня join работал быстрее, хотя я ожидал быстрого exists.... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 15:50 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Если не ошибаюсь. exist => nested loops (без вариантов) join => join по индексу (если он конечно есть) Имхо, немного разные алгоритмы. Join должен работать быстрее в большинстве случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 16:38 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Romanzekexist => nested loops (без вариантов) join => join по индексу (если он конечно есть) И?.. "Join по индексу" может выполняться как-то кроме nested loop с учётом его outer-ности? Вы там в RB научили его использовать merge?.. Стандартный птиц не умеет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 16:43 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
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 практически никогда не должен проигрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 16:58 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Симонов Дениснет конечно. exists использует индекс если это возможно. Я и не говорил, что не использует. Да, при JOIN тоже будет NESTED LOOPS по индексу, и большой разницы наверное не будет. Но, насколько я понимаю, операции все-таки будут разные при JOIN и при exists. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 17:08 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Romanzek, сейчас exists это не JOIN, хотя мог бы выполняться как SEMI JOIN. Я бы сказал, что однозначно сказать нельзя что быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 17:12 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
Симонов Денис, Действительно. Проверил на таблице, с большим количеством деталей. 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.
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 17:18 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2016, 21:55 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
так всё таки - как быстрее? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 11:41 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaon, зависит от распределения данных, наличия индексов. Надо пробовать в каждом конкретном случае. Моё ИХМО NOT EXISTS в большинстве случаев быстрее, но бывают исключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 11:49 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
makhaon, Если таблица деталей сильно большая по сравнению с таблицей мастеров и в таблице мастеров много записей без ссылок на таблицу деталей, то однозначно not exists. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 12:33 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
KreatorXXI, таблица деталей на порядок (реально - раз в 30) больше мастеров. но мастеров пустых бывает обычно мало - единицы, десятки. попробую на реальных данных оба варианта, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 13:43 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 14:58 |
|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#18+
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 - верно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2016, 15:04 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561777]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 437ms |
0 / 0 |