|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
Здравствуйте, коллеги! Есть функция, которая выводит отчет LCR - Показатель, отражающий процент звонков, не принятых по каким либо причинам. Она выводит данные по временным интервалам. И вот понадобилось вывести данные за полгода с разбивкой по 5 мин. Запрос выполнялся 1,5 часа. Помогите оптимизировать данную функцию. Вот текст функции: Код: 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. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228.
В ней используется функция генерации таблицы интервалов oktell.dbo.GetDateTimeIntervals2(@date1, @date2, @time1, @time2, @interval). Она работает довольно быстро - около 1 сек. Буду очень признателен всем за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:20 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
Чтобы сказать что-то конкретное нужные актуальные планы выполнения. Могу предложить банально впихнуть на каждый стейтмент OPTION(RECOMPILE) (хуже все равно не будет) чтобы оценка строк была на "1" а более адекватная. Плюс если хочется чтобы использовался параллелизм то временные таблицы ваш выбор. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:31 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
BondVG Запрос выполнялся 1,5 часа. Помогите оптимизировать данную функцию. Настройте профайлер с выводом актуальных планов на конкретный SPID из окна SSMS, и запустите в окне процедуру. Сразу получите ценную количественную информацию по выполнению всех запросов, и их планы выполнения. Ещё, сразу вызывает подозрение связывание по DTStart, IdTask (например, таблицы @Result и @tblCount ), в то время как ПК в этих таблицах - DTStart, Id. Зачем там Id, как оно используется? Притом в @tblCount вставка делается с уникальностью DTStart, DTStop, IdTask. Почему туда затесалось DTStop, а в связке её нет? Нет ли у вас там скрытого кросс-джойна? Это будет хорошо видно из результатов трассировки, по количеству обработанных записей. В общем, с логикой функции нужно поработать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 11:38 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
BondVG Код: sql 1.
Учитывая, что для озвученных условий в @intervals около 50000 строк и нет подходящего индекса, потенциально будете иметь проблемы быстродействия, если в левой таблице этого соединения будет много строк. ЗЫ: Обычно подобные задачи решаются в один запрос, без генерации интервалов. Но озвучить задачу в юзабельном виде забыли. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 12:27 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
alexeyvg Зачем там Id, как оно используется? Id используется для создания индекса по столбцу DTStart. Значение DTStart может быть неуникально, если собирать данные по нескольким задачам (IdTask). Притом в @tblCount вставка делается с уникальностью DTStart, DTStop, IdTask. Почему туда затесалось DTStop, а в связке её нет? Возможно, DTStop здесь лишнее. Посмотрю... Нет ли у вас там скрытого кросс-джойна? Да вроде нет. Спасибо, я попробую настроить профайлер. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 12:38 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
invm BondVG Код: sql 1.
Учитывая, что для озвученных условий в @intervals около 50000 строк и нет подходящего индекса, потенциально будете иметь проблемы быстродействия, если в левой таблице этого соединения будет много строк. Индекс создается вот этим ограничением: Unique(DTStart, Id). ЗЫ: Обычно подобные задачи решаются в один запрос, без генерации интервалов. Но озвучить задачу в юзабельном виде забыли. Не могли бы Вы показать пример одного запроса для моей задачи. Нужно, чтобы данные выводились вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 12:47 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
BondVG Индекс создается вот этим ограничением: Unique(DTStart, Id). BondVG Не могли бы Вы показать пример одного запроса для моей задачи. Ибо Вы не подготовили ни исходных данных, ни схем таблиц и индексов, ни внятного описания задачи. Могу просто пример показать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 13:35 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
1. Аффтор ленивец - даже не удосужился выяснить какой из запросов функции занимает больше всего времени. 2. Любовь к группировкам сгубила многих. АффторЪ тоже весьма грешен. 4 (четыре) однотипных группировки одной и той же таблицы (самой большой). Зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 14:29 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
aleks222 1. Аффтор ленивец - даже не удосужился выяснить какой из запросов функции занимает больше всего времени. 2. Любовь к группировкам сгубила многих. АффторЪ тоже весьма грешен. 4 (четыре) однотипных группировки одной и той же таблицы (самой большой). Зачем? Вот, как раз выясняю. Что Вы предлагаете использовать вместо группировок? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 15:35 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
BondVG aleks222 1. Аффтор ленивец - даже не удосужился выяснить какой из запросов функции занимает больше всего времени. 2. Любовь к группировкам сгубила многих. АффторЪ тоже весьма грешен. 4 (четыре) однотипных группировки одной и той же таблицы (самой большой). Зачем? Вот, как раз выясняю. Что Вы предлагаете использовать вместо группировок? Вестимо группировку, только одну. Заодно три соединения станут ненужными. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2021, 17:36 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
Переписал функцию в виде процедуры, переделал все таблицы во временные с индексами. Как результат, запрос стал выполняться за 9 минут. Спасибо всем за помощь. alex222 Вестимо группировку, только одну. Заодно три соединения станут ненужными. Я не понимаю, как можно использовать только одну группировку. Ведь эти группировки хоть и однотипные, но используются для разных условий. Можете подсказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2021, 13:40 |
|
Помогите оптимизировать функцию bvgCalcLCRByTask2
|
|||
---|---|---|---|
#18+
aleks222 Вестимо группировку, только одну. Заодно три соединения станут ненужными. Я сообразил как избавиться от вложенных запросов и лишних группировок. Теперь запрос выполняется за 25 секунд. Друзья, всем спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 13:47 |
|
|
start [/forum/topic.php?fid=46&msg=40037674&tid=1685167]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 269ms |
0 / 0 |