|
Как быстро выбрать всех мастеров, у которых нет деталей?
|
|||
---|---|---|---|
#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?fid=40&msg=39376694&tid=1561777]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 394ms |
0 / 0 |