Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
Заранее прошу прощения за подготовительную простыню, это у меня сразу практическая задачка которую я хотел решить на досуге по одной занимательной карточной игре. Мне нужно было сэмулировать пару мильонов стартовых рук по 7 случайных карт и подсчитать кое-какую статистику. Для гарантированной случайности я выбрал старый-добрый ORDER BY NewID() и тут оказалось, что он попросту не работает в коррелирующем подзапросе и кросс аплае. Под спойлером временная таблица с данными: Код: 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. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. Обратите внимаение на столбец LandsCount Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В то время, как при более простом случаt Код: sql 1. 2. Все работает корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:17 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
1. Чисто праздный интерес: а какой прок в этой статистике? Статистика NewID() и статистика карточной игры ваще нигде не связаны. 2. Не проще ли вставить карты с NewID() в таблицу. Чать пара миллионов - это ерунда со всех точек зрения. 3. Построить кластерный индекс и выбирать по-порядку семь штук. 3. И фсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:24 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
автор2. Не проще ли вставить карты с NewID() в таблицу. Чать пара миллионов - это ерунда со всех точек зрения. 3. Построить кластерный индекс и выбирать по-порядку семь штук. Перед игрой колода тщательно перемешивается. Я не знаю в какой последовательности идут карты. Стартовая рука - семь случаных карт. Тут мы подходим к вопросу автор1. Чисто праздный интерес: а какой прок в этой статистике? Колода в данной игре состоит из разных типов карт. Основной момет, важный для игрок- количество карт с типом ЗЕМЛЯ в стартовой руке. В профессиональной среде идут споры по поводу в каком соотношении нужно класть ЗЕМЛИ и другие карты в колоду, для максимальной эффективности стартовой руки: 18-42 , 19-41, 20-40. Соответственно мне надо сделать несколько лямов прогонов чтоб посмотреть сколько земель приходит в стартовую руку в зависимости от вышеуказанного соотношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:44 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
Cammomile, не совсем понятно, что вы тут называете "коррелирующим запросом"... опять же вот пример Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. в котором w разные, значит и newid() внутри разные. или я вас не понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:46 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
ДедушкаCammomile, не совсем понятно, что вы тут называете "коррелирующим запросом"... (SELECT TOP (7) FROM ORDER BY NewID() ) который должен быть выполнен для КАЖДОЙ строки входной таблицы типа dbo.Numbers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:48 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
Cammomile, тот пример, что я выше привёл соответствует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:50 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
ДедушкаCammomile, тот пример, что я выше привёл соответствует? Нет в моем случае вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И, как видите, W одинакова, хотя должна быть разная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 13:53 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
CammomileДедушкаCammomile, тот пример, что я выше привёл соответствует? Нет в моем случае вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И, как видите, W одинакова, хотя должна быть разнаяПо плану сколько раз выполняется подзапрос w ? Он же независим от внешнего запроса FROM @t3. Значит, может выполниться один раз? Если бы оптимизатором был я, то так бы и сделал! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 14:00 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
если посмотреть план то видно что сначала делается агрегат а затем только джоин к внешней таблице выносите суммирование наружу Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 14:10 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
CammomileИ, как видите, W одинакова, хотя должна быть разнаяЭто вам хочется, чтобы была одинакова. На самом деле подзапрос не кореллированный, ибо инвариантен относительно t3. В общем, сравнивайте: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 14:17 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
авторЭто вам хочется, чтобы была одинакова. На самом деле подзапрос не кореллированный, ибо инвариантен относительно t3. В общем, сравнивайте: Ну я изначально написал КРОСС АПЛАЙ, в котором вроде как явно написано что он будет применен НА КАЖДУЮ СТРОКУ входного набора. Но ваши слова просто в точку! Когда я явно заказал использование "входной" таблицы, все взлетело как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 14:30 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
ХОТЯ остается вопрос. Почему к такому поведению приводит именно использование SUM() ? Ведь если написать просто Код: sql 1. 2. Где, заметьте , LameID тоже не связан с sys.all_objects оптимизатор, все же, считает новый айди на КАЖДУЮ строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 14:38 |
|
||
|
NEWID() не работает в коррелирующем запросе
|
|||
|---|---|---|---|
|
#18+
CammomileНу я изначально написал КРОСС АПЛАЙ, в котором вроде как явно написано что он будет применен НА КАЖДУЮ СТРОКУ входного набора.Ну так "применен" не эквивалентно "выполнен". CammomileВедь если написать просто Код: sql 1. А тут нет подзапроса. ( SELECT LameID = NEWID()) преобразуется в Compute Scalar. Вообще, результат зависит от порядка соединения таблиц. Сравните Код: 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. Ваш же исходный запрос для этого примера написан таким образом, что изменить порядок соединения можно только сделав подзапрос зависимым от таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:37 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39598963&tid=1690322]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 399ms |

| 0 / 0 |
