|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
Добрый день. У меня проблема, которую уже третий день, я не могу решить. Мне нужен скрипт, который бы отображал, какие занесенные данные были в определенные таблицы в конкретные даты. Я создала 5 подзапросов по этим таблицам - все отлично работает. Но теперь мне нужно, чтобы это все собиралось в одну таблицу. Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла). Когда я выделяю только эти подзапросы, они прекрасно и быстро отрабатывают, но почему не получается после объединения. Точнее получается, если речь идет о 10-15 днях сентября, а если с 25 августа по 2 сентября, допустим, то уже все... Не выполняет. Может кто свежим взглядом укажет на мою ошибку? Или идею подкинет? Код: 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.
Кажется у меня кривые руки... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 05:53 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444, или может есть другой способ их объеденить? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 05:56 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#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. 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. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 07:30 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
Общие советы: 1. Попробуйте разбить фулл на лефт и райт и обработать отдельно. 2. Иногда очень помогают промежуточные временные таблицы. Накидывайте в них полуготовые данные и дальше работайте с ними, а не с боевыми таблицами. 3. Если портянка огромна, не нужно ее выкладывать. Все равно никто не будет вникать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 10:20 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
PizzaPizza, спасибо большое. А вы не подскажете что такое CTE. Это аддон какой-то для sql менеджера? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 11:37 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
L_argo, О! Временные таблицы я еще не пробовала! Спасибо большое за советы ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 11:38 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
PizzaPizza, если не сложно подскажите, пожалуйста как вы привели мой скрипт в такой прекрасный читабельный вид. Я это делала раньше, но время в декретном отпуске напрочь отшибло мне память))) Раньше я вроде нажимала кнопку на панеле инструментов в sql manager, но не могу ее найти, поэтому получается в действительности тяжело читабельный код ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 11:43 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444, длz форматирования необходимо установить дополнение к студии сторонних разработчиков, например отсюда: apexsql.com ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 12:09 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 12:26 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
фулл джойн можно попытаться старым дедовским методом заменить на union all ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 12:32 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
Спасибо всем, буду пробовать ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 12:39 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
СТЕ = common-table-expression https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15 вы выносите подзапросы в отдельные именованные блоки кода Вместо Код: sql 1.
вы пишете Код: sql 1. 2. 3. 4. 5.
и можете выполнять удобно отдельные блоки и читать их гораздо легче ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 17:33 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
PizzaPizza, то есть можно им просто присвоить псевдонимы, а уже потом соединять именно их? Спасибо большое, попробую. Или их надо в виртуальные таблицы впихнуть? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 19:23 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
имхо, самый простой способ, просто сформировать промежуточные таблицы и "вручную" посчитать, как будет выглядеть соединение. тем более, что имеются конкретные зацепки по датам ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 20:18 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
их не надо никуда впихивать, это один запрос просто в этом варианте синтаксисе подзапросы вынесены в отдельные текстовые/синтаксические блоки для удобства чтения. Выполняется это все как и ваш запрос, только читать и легче и удобнее выполнять отдельные части для диагностики. ЗЫ. В Сервере есть временные таблицы и табличные переменные. Если вы любое из этого называете виртуальными таблицами, то нет - ничего туда не надо вставлять. Идея в том, что бы вы могли выполнить ваш запрос по отдельным частям, посмотреть ожидаемые ли вы получаете результаты от этих частей запроса и подумать как может выглядеть результат объединения этих промежуточных результатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 22:27 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444 Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла). Точно должна быть связка по одному полю: Код: sql 1.
а не по двум (и для второго подзапроса, и вообще для всех)? Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2020, 22:53 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
alexeyvg, авторON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE Думаю тут одно другому не мешает. Прожекты содержат Проспекты, но ни те, ни другие не повторяются. По сути, разницы нет ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2020, 08:22 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
PizzaPizza, да, я каждый блок изначала писала и выполняла отдельно. Каждый блок по отдельности работает. Результат каждого блока примерно одинаков: Проект, Проспект и подсчет загруженных данных за период в эту таблицу. Результат должен быть таков: Все проекты, Все проспекты и столбцы с подсчетом количества загруженных данных из блоков. Вот я Эти самые блоки full join-ила и вместе они перестали работать... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2020, 08:25 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444 alexeyvg, авторON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE Думаю тут одно другому не мешает. Прожекты содержат Проспекты, но ни те, ни другие не повторяются. По сути, разницы нетКакая разница, повторяются или нет? Важно, что бы поле PROSPECT было уникально в результатах (под)запроса. Проверить неуникальность можно за полминуты, а симптомы говорят в первую очередь именно именно про это. Или, если вы правы, то обязательно нужно убрать поле PROJECTCODE из списка полей SELECT и из GROUP BY в подзапросах. Потому что PROJECTCODE в результатах не используется, и получается "грязный", ужасно некрасивый код, к тому же загружающий сервер лишней работой. Но я всё таки думаю, что PROSPECT в подзапросах неуникален, PROJECTCODE должен быть в ON, по бизнес-логике. katish444 PizzaPizza, да, я каждый блок изначала писала и выполняла отдельно Хотя, если данных много, глазами это не увидеть, лучше всё таки запросом. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2020, 08:57 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 14:04 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444 alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:00 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
alexeyvg katish444 alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:01 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
alexeyvg katish444 alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны Независимо от модели данных, от уникальности полей, и от результатов этих нескольких запросов и подзапросов, писать GROUP BY a, b, и делать в соединение только по полю a, является ошибкой. Такой ошибочный код не должен пропускаться, а рассуждения про уникальность вообще не должны рассматриваться. Это как математическая операция над полем-строкой, "а у меня там будут только цифры". Так писать нельзя, ошибка, невалидный код, на код-ревью он должен отбраковываться. Если вы уверены, что PROSPECT уникален, просто уберите PROJECTCODE из GROUP BY, а в списке полей в SELECT используйте агрегатную функцию, например, MAX Если PROSPECT уникален, результат будет таким же. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:07 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
alexeyvg, до меня дошло! Спасибо большое. Я убрала Projectcode из связей, а потом сделала соединение с уже готовыми данными. Правда это не очень-то помогло. На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами. Запрос работает (правда выполняется по 3-5 минут за период 3 месяца, боюсь представить, что будет за год). Но и это не самая главная проблема. Этот скрипт я запустила в нашей БД, а она не хочет работать с виртуальными таблицами и гибкой датой (то есть когда на контрольной панеле пользователь может сам протыкать диапазон дат на календаре). Если даты жестко в самом скрипте прописать, то работает. Получается, что хитрость с виртуальными таблицами тоже отпадает. Уже не знаю, что можно еще придумать... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 11:11 |
|
Скрипт перестает отрабатывать после Full join
|
|||
---|---|---|---|
#18+
katish444 На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами Это, возможно, не лучший вариант, т.к. на них же нет индексов. Но часто такой приём оптимизации срабатывает, тем более что индексы можно построить и на временных таблицах Вам сначала просто нужно попробовать добавить ещё одно поле в условие джойна, в каждый ON, и посмотреть на результат И, второй вариант, убрать поле PROJECTCODE из GROUP BY, и заменить Код: sql 1.
на Код: sql 1.
После анализа результатов и планов для этих двух вариантов у вас (и у нас) будет больше данных для понимания ситуации, и принятия правильного решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 12:30 |
|
|
start [/forum/topic.php?fid=46&msg=40016913&tid=1685423]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 317ms |
total: | 447ms |
0 / 0 |