|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Коллеги, добрый день! Возник у нас тут спор с командой как всё-таки правильнее проверять наличие данных через EXISTS. Варианты: 1) WHERE EXISTS (SELECT * FROM..) - больше склоняюсь к этому варианту 2) WHERE EXISTS (SELECT TOP 1 1 FROM..) - в большинстве процедур сейчас по факту используется этот 2) WHERE EXISTS (SELECT 1 FROM..) Текст по этому поводу из книги T-SQL Fundamentals - 3rd Edition (2016) прилагаю в файле. Как обычно пишите вы, почему и может у кого-то есть дельные ссылки на исследования по этому поводу? ----------------------------------------------- А мы тут плюшками балуемся... Аленочка тм ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:02 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Аленочка, Код: sql 1.
TOP избыточен, потому что оптимизатор достаточно умен и де-факто использует его сам. А звездочка неудобна по двум причинам:
... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:39 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Да все как обычно - план запроса смотришь и убеждаешься что он (скорее всего) один и тот же. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:40 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
А что у вас планы говорят? У меня при всех вариантах в подзапросе выполняется Row Count Spool на dummy data ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:46 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Аленочка, автор1) WHERE EXISTS (SELECT * FROM..) - больше склоняюсь к этому варианту Процедуры и функции при обращении к ним компилируются и висят в оперативке. Если там есть подобный подзапрос, то символ * заменяется при этом списком полей. При изменениях структуры базы могут возникнуть проблемы с возвратом списка полей на *. Придется отследить каждую процедуру со *, сделать в ней изменения и сохранить, чтобы она заново скомпилировалась. Или тормознуть и запустить сервер. автор1) WHERE EXISTS (SELECT * FROM..) - больше склоняюсь к этому варианту 3) WHERE EXISTS (SELECT 1 FROM..) Если подзапрос вернет более одной строки - могут быть проблемы. автор2) WHERE EXISTS (SELECT TOP 1 1 FROM..) - в большинстве процедур сейчас по факту используется этот Подзапрос всегда вернет только одну строку, не обращаясь к списку полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:46 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
old_joy автор1) WHERE EXISTS (SELECT * FROM..) - больше склоняюсь к этому варианту 3) WHERE EXISTS (SELECT 1 FROM..) Если подзапрос вернет более одной строки - могут быть проблемы.какие ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 06:55 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
old_joy Или тормознуть и запустить сервер. И кстати это не поможет, нужен вызов sp_refreshview / sp_refreshsqlmodule. Тот же SSDT вставляет их автоматически в deployment script, если замечает подобные зависимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 07:10 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
О! Очередной заруб за exists. Нет чтобы тупо зачитать документацию Microsoft. Код: sql 1.
часть кляузы SELECT ... до FROM в операторе exists НЕ используется. Т.е. присутствует только для красоты. Это официально документировано. Соответственно абсолютно фиолетово чего вы там напишете. ЗЫ. Справедливости ради надо сказать, что гуру T-SQL придумали таки ситуацию, когда EXISTS (SELECT * FROM...) со звездочкой вызывает проблемы. Но я, на память, воспроизвести не могу. Это что-то ужасно экзотическое. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 08:24 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Аленочка 2) WHERE EXISTS (SELECT TOP 1 1 FROM..) - в большинстве процедур сейчас по факту используется этот Используйте и парьтесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 09:14 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
aleks222 ЗЫ. Справедливости ради надо сказать, что гуру T-SQL придумали таки ситуацию, когда EXISTS (SELECT * FROM...) со звездочкой вызывает проблемы. Но я, на память, воспроизвести не могу. Это что-то ужасно экзотическое. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 09:19 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Ennor Tiegael aleks222 ЗЫ. Справедливости ради надо сказать, что гуру T-SQL придумали таки ситуацию, когда EXISTS (SELECT * FROM...) со звездочкой вызывает проблемы. Но я, на память, воспроизвести не могу. Это что-то ужасно экзотическое. Ну, я и говорил: редкостная экзотика. Причем компилятор ругнется в этом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 09:44 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
old_joy Подзапрос всегда вернет только одну строку, не обращаясь к списку полей. Ничего он никуда не вернет. Сообщением выше твоего уже написали, что в плане там всегда Row Count Spool. Я подозреваю, даже, что если EXISTS переписать через ANY/SOME, то оптимизатор и с этим справится. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 09:44 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
aleks222 гуру T-SQL придумали таки ситуацию, когда EXISTS (SELECT * FROM...) со звездочкой вызывает проблемы Безотносительно что считают гуру моё мнение - звёздочки это зло! В новых версиях SQL я бы ввел опциональное отключение возможности писать так в запросах. Генерировать ошибку. В Оракле, например, с 12 (кажется) версии появилось ограничение на число полей в 1000. У нас куча запросов со звездочками сломалось, пришлось все править. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 10:01 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
SQL2008 aleks222 гуру T-SQL придумали таки ситуацию, когда EXISTS (SELECT * FROM...) со звездочкой вызывает проблемы Безотносительно что считают гуру моё мнение - звёздочки это зло! В новых версиях SQL я бы ввел опциональное отключение возможности писать так в запросах. Генерировать ошибку. В Оракле, например, с 12 (кажется) версии появилось ограничение на число полей в 1000. У нас куча запросов со звездочками сломалось, пришлось все править. В оракеле сломались запросы, но осудим мы * в MS SQL. Л - логика. Есть стандарт SQL он предписывает * в exists. И нефиг валить с больной головы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 10:04 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
aleks222 Есть стандарт SQL он предписывает * в exists. И нефиг валить с больной головы. Как показывает мой опыт (извините, другого нет!) MS идет по стопам ORACLE с задержкой лет 5-7. Не являюсь сторонником второго, скорее первого. Просто констатирую факт. Но спорить с вами не буду. Лень. Всем удачных выходных! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 10:17 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
SQL2008 aleks222 Есть стандарт SQL он предписывает * в exists. И нефиг валить с больной головы. Как показывает мой опыт (извините, другого нет!) MS идет по стопам ORACLE с задержкой лет 5-7. Не являюсь сторонником второго, скорее первого. Просто констатирую факт. Но спорить с вами не буду. Лень. Всем удачных выходных! Ну, PIVOT появился в MSSQL раньше Oracle, а вот RANGE BETWEEN INTERVAL из ORACLE все никак не сделают -- отставание более 10 лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 10:58 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Аленочка, Вообще звездочка, но, чтобы сотрудники друг другу горло не грызли, примите волевое решение и документируйте правила написания кода. Звездочка выглядит эстетичнее, тем не менее. Причем здесь вообще Оракл, почему с ним сравнения? Оракл совершенно другая СУБД и PL/SQL близко не похож на T-SQL. Диаметрально противоположные концепции. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 11:55 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
SQL2008 В Оракле, например, с 12 (кажется) версии появилось ограничение на число полей в 1000. У нас куча запросов со звездочками сломалось, пришлось все править. Хм. Код: 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.
150*7=1050. Проверял и на таблицах, в которых есть данные - всё нормально селектится. Скорее всего, это был баг одной из версий оракла, который в следующей версии поправили. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 12:11 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Сон Веры Павловны 150*7=1050. Проверял и на таблицах, в которых есть данные - всё нормально селектится. Скорее всего, это был баг одной из версий оракла, который в следующей версии поправили. Возможно, что речь шла именно об уникальных названиях полей. А тут 7 наборов повторяющихся полей. Не точно не помню, не буду врать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 14:26 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Ну вот же - The absolute maximum number of columns in a table is 1000. Я был прав. Мы тогда запарились править запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 14:29 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
В скуле чуть полегче, но тоже есть ограничения Columns per table 1,024 Своего мнения не изменил, звездочки это зло! Разве только исключая конструкцию создания копии таблицы Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 14:35 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
Я даже скажу больше иногда exists (select 1 ...) хуже чем exists (select filed ....) Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 15:31 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
msLex, получается, что Код: sql 1. 2. 3. 4. 5. 6.
все равно неявно вытаскивает все поля (спасибо msLex), но ломается на заденайеном поле? Спасибо, этого я не знал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 15:59 |
|
Спор про EXISTS
|
|||
---|---|---|---|
#18+
SQL2008 все равно неявно вытаскивает все строки поля , но ломается на заденайеном поле? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2020, 16:02 |
|
|
start [/forum/topic.php?fid=46&fpage=57&tid=1686012]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
202ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 286ms |
total: | 603ms |
0 / 0 |