|
|
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Добрый день, All! Вопрос к гуру : все-таки, объясните, плз, имеет ли смысл менять EXISTS ( SELECT *... на EXISTS( SELECT TOP 1 *..., и если да, то почему? Смотрел планы, мало чем отличаются, выигрышь буквально копеечный, по крайней мере, там, где видел. Объясняю причину интереса - в базе немеряно триггеров и ХП, часто использутся EXISTS... Мне нужно обоснование для разговора с девелоперами. Буду благодарен за любую информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 14:54:45 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
EXISTS ( SELECT 1 FROM..... (без TOP) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 15:10:23 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Нет, именно TOP 1. Планы на SELECT * и SELECT 1 вообще ничем не отличаются (это и понятно). Смысл TOP 1, насколько я понимаю, в том, что заставляет сервер прекращать выполнение вложенного селекта сразу, как только встретится первая запись, удовлетворяющая условию (что, по идее, должно происходить и так при наличии EXISTS). Просто в форуме неоднократно говорилось, что с и спользованием TOP 1 быстрее, вот я и пытаюсь разобраться, почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 15:24:20 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
В документации сказано что для оператора EXISTS оптимизатор прикращает сканирование таблицы после первого найденного значения (а это насколько я понимаю и есть эквивалент TOP 1). Так что если верить написанному, то дальше оптимизировать EXISTS уже некуда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 15:55:47 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Мне лично не удалось специально написать запрос так, что бы была разница в скорости или в плане выполнения. Но это не значит что такого не может быть Хотя я не верю - мне кажется что сервер не такой уж и тупой, что бы не мог это проанализоровать сам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 17:38:06 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
На MSSQL7.0 имеет смысл в критичных местах писать EXISTS ( SELECT TOP 1 * ..., так как гораздо шустрее выполняется, чем EXISTS ( SELECT * .., из-за кривости оптимизатора. На MSSQL2000 эти две конструкции выполняются абсолютно одинаково, поэтому без разницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 18:01:09 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Менять смысла нет, потому что есть там TOP или его нет, поиск по запросу прекращается как только находится первая запись, удовлетворяющая условию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 18:01:14 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
ребята .... это уже обсуждалось.... поищите посерверу... самый быстрый вариант именно exist(select 1 from ..... просто возмите и протестируте ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 18:47:33 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
2 MiCe Может Вы и правы, но что бы чем так безапеляционно утверждать какой-нибудь скритпец бы продемонстрировали что ли, где оно быстрее будет. Можете даже на своих таблицах, я поверю наслово. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 18:58:04 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Код: 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 21:04:47 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
У меня при многократном запуске предложенного скрипта любой из 4-х вариантов оказывался чуть-чуть быстрее остальных. Это чуть-чуть не превышало 2%. SQL2000 SP2, Win2000 AdvServ SP3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2002, 22:06:32 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
у меня первый всегда быстрее.... да - около 2%.... sql2k sp2.... 2xXeon.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 09:05:25 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Из своей практики могу сказать, что пришлось после написания конструкции if exists (SELECT *... менять ее на if (SELECT TOP 1 COUNT(*) .... ) >0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 09:20:49 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
то snake на огромных таблицах? или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 09:59:34 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
на огромных таблицах? или как? И на тех, и на тех ... Это было в DTS пакетах (по одному на каждую таблицу) Таблиц чуть более ста, самая больщая - под 1.000.000 записей , есть мемо поля. Выигрыш в производительности был абсолютно очевиден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 10:11:31 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Насчёт (SELECT TOP 1 COUNT(*) .... ) >0 это здорово придумано! ;-) Ничто так не способствует обновлению техники, как её медленная работа! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 10:27:49 |
|
||
|
EXISTS ( SELECT * ... или EXISTS ( SELECT TOP 1 * ...
|
|||
|---|---|---|---|
|
#18+
Ну вот я 4 раза запустил, правда для 100000 Код: plaintext 1. 2. 3. 4. 5. 6. 7. Еще я попробовал if (select top 1 count(*) from dbo.syscolumns) > 0, как и ожидал эта конструкция работала еще медленнее, но я не ожидал что настолько(для 10000): Код: plaintext 1. 2. 3. 4. 5. В этом примере примитивные запросы, не используются индексы. Я у себя пробовал это усложнить, но на результате не сказалось. Пока я остаюсь при своём мнении что ускорение при использовании select top 1 1 - это из области психологии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2002, 10:34:32 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32043599&tid=1821076]: |
0ms |
get settings: |
12ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
231ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 589ms |

| 0 / 0 |
