Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Есть 2 абсолютно одинаковые таблицы с композитным кластерным PK (из 5 полей) с абсолютно одинаковыми данными. Есть простейший LEFT JOIN с условием соединения по тем же 5-ти полям которые в кластерных индексах. Всю жизнь думал что SQL декларативный язык ;-) и порядок перечисления полей в ON не имеет значения. Оказывается имеет )) 0. Создание тестовых данных Код: 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. 1. Запрос 1. Все поля в ON идут по порядку как в кластерных индексах. Как и ожидалось, имеем Merge Join в плане Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 2. Запрос 2. Поменяйте местами id3 и id4, имеем Hash Match в плане. Чудеса! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2019, 17:11 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Что мануалы и минуют тя глупые вопросы. Оптимизатор выбирает "наилучший" план, но он ограничен во времени выбора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2019, 18:52 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
В обоих случаях Код: sql 1. 2. никаких таймаутов здесь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2019, 21:30 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Богдан Гоцкийникаких таймаутов здесь... Ты суслика видишь? А он есть! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 07:45 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Богдан Гоцкий, В данном случае алекс прав. Выбор наилучшего (с вашей точки зрения) плана является вероятностным, а не гарантированным. В том числе зависит и от таких вот условий. Если оптимизатор воспроизводимо промахивается с выбором, а вы знаете, какой именно джойн здесь нужен - прибивайте гвоздями хинтами. Только учтите, что после обновления версии сиквела поведение может поменяться, и хинт может начать мешать, вместо того чтобы помогать. Версия сервера-то какая, кстати? А то, может, вы там от 2005-го чудес ждете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 08:35 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
В данном случае лечить хинтами ничего не нужно, достаточно просто в ON перечислить условия в том же порядке что и поля в кластерном индексе. Интерес чисто академический. Все интернеты доказывают что порядок условий в ON, WHERE и GROUP BY несущественен и ищут доказательства обратного. Я показал обратное и был сильно удивлен. В моей более чем 15-ти летней практике с сиквелом - первый раз такое вижу. Сначала думал что особенность версии сиквела, но нет, стабильно воспроизводиться на 2012, 2014, 2016, 2017 серверах. Более того, если запрос переписать через WHERE - такое же поведение. Получается что порядок предикатов в WHERE тоже играет роль. А для декларативного языка коим является SQL это дико неожиданно, согласитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 08:59 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Богдан ГоцкийВ данном случае лечить хинтами ничего не нужно, достаточно просто в ON перечислить условия в том же порядке что и поля в кластерном индексе.Нет гарантии, что это будет работать всегда. Чтобы это понимать, достаточно знать, как в SQL работает оптимизатор. Он не перебирает все возможные варианты планов, он перебирает их до тех пор, пока не вылетит по таймауту, или пока не найдет good enough с его точки зрения. И это поведение документировано. Случай не частый, к счастью, но я тоже встречался с таким. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 09:06 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
А с хинтом, так вообще дичь полнейшая, оптимизатор добавил 2 абсолютно ненужные сортировки: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 09:06 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Я бы в таком случае отказался от составного ключа и добавил бы суррогатный identity. Все-таки джойн по пяти полям - это жесть. У вас там варехаус, что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 09:10 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Богдан Гоцкий, Видимо это баговина или просто бай дизайн. Если уберете where получите merge в обоих случаях. С where предикат t1.id1 = t2.id1 исключается и вместо этого имеем два index seek с id1 = 6 с упорядоченными наборами на выходе. Но во втором случае оптимизатор почему-то считает, что для merge необходимо переупорядочивание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 10:23 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
авторА для декларативного языка коим является SQL это дико неожиданноДля ИТ вообще ничего не может быть неожиданного. :) Тем более для МС. Все коды пишут живые люди. А кодов - многие миллионы строк. Документированных ошибок - тысячи. Недокументированных не меньше. зы: "Все современные программы - бета-версии" (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 10:29 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Почитайте, как и по каким колонкам строиться статистика и как она используется для построения плана оптимизатором, тогда и поймёте, как влияет порядок предикатов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2019, 12:53 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Александр Гладченко, а вот еще бы и ссылок годных на "почитать"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2019, 15:44 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Александр Гладченко, читал, похоже не в статистике тут дело. Больше похоже на багу во время построения дерева реляционных операторов. В обоих случаях дерево должно быть одинаковым. Создание статистик по {id1, id2, id4, id3, id5} на обоих таблицах никакой роли не сыграло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2019, 23:12 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Александр ГладченкоПочитайте, как и по каким колонкам строиться статистика и как она используется для построения плана оптимизатором, тогда и поймёте, как влияет порядок предикатов...Ну, статистика не имеет к этому никакого отношения. Скорее просто "лень" оптимизатора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2019, 04:13 |
|
||
|
Порядок полей в ON имеет значение !!??
|
|||
|---|---|---|---|
|
#18+
Богдан Гоцкий, авторВсю жизнь думал что SQL декларативный язык ;-) и порядок перечисления полей в ON не имеет значения. Оказывается имеет )) не придирки ради, но истины для.... с SQL все в порядке он вам результат запроса гарантирует, а не план. Работу оптимизатора и планы запроса SQL слава богу не описывает. А то потом начитавшись таких топиков, студенты рассказывают что вот в SQL баг есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2019, 09:02 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39755550&tid=1688476]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 362ms |

| 0 / 0 |
