|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Заготовка для половинного деления и точности исходных данных до 0.001 может быть такая. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2021, 18:54 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop, Тоже начал Но пока в пути ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2021, 20:30 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Хоть тема и ускакала дальше в поисках новых путей решения, позволю себе некоторые замечания про прошедшей части прямой имитации распределения нагрузки на pl/sql. 1) Про f_box: интересный ход, стоивший мне некоторого ковыряния в носу, прежде чем я понял, как это работает. Но делать так я бы не стал вот почему, по мере увеличения важности: У меня инстинктивное отторжение к массивам массивов в pl/sql, главным образом, потому что я не понимаю деталей устройства самих массивов, а истории про катастрофы в режиме компиляции plsql_debug = true только усиливают такой настрой. Код такого типа, имхо, сложнее приспосабливать к новым вариантам использования, хотя в простых ситуациях я тоже склонен использовать нечто схожее. Главное состоит в том, что в своем исходном виде этот код плохо пригоден для работы с «большим числом коробок» при малом числе «работников». На «достаточно большом» числе работников он уверенно держится и забирается довольно далеко по количеству обработанных коробок. Но когда число работников «недостаточно», то при достаточно большом числе коробок начинает зримо проигрывать докрученной прямолинейной реализации очереди на массивах и, чем меньше доступно этому алгоритму работников и хуже их скоростные параметры, тем быстрее он сваливается в ORA-01426 2) По поводу отставания sqlru_workers.get_min_wrk_time от f_box в последнем размещенном сравнении (забудем пока о непонятках с plsql_debug = true). Думаю так: он обречен отставать при «слишком большом» числе работников с не совпадающими характеристиками, но может и не отставать, а в некоторых исходных данных и опережать на большом числе коробок, при не слишком большой очереди работников. Отставание сравнивавшейся реализации прежде всего определяется ценой и количеством сравнений в Less. Цена сравнения, после первичной отладки, понижается путем возврата к хранению вычисленного в момент размещения единицы работы значения. Следующий момент состоит в том, что в очередь надо размещать не всех вообще работников, а группы работников с одинаковыми характеристиками (speed,capacity,delay). Т.е. исходная очередь должна создаваться из запроса сорта Код: plsql 1. 2. 3. 4.
Всем работникам одной и той же производительности нужно выдавать работу одной операцией, увеличив на 1 индивидуальный счетчик и уменьшив на grp_workers количество оставшихся ящиков. В частном случае, когда после группировки остается единственный элемент, все значения можно получать единственным вычислением, вообще без «верчения циклов». ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2021, 04:44 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
booby Всем работникам одной и той же производительности можно для одинаковых менять "скорость" (speed/nn, capacity*nn) но решал я несколько другую задачу, выдать не только время, но и кто сколько ящиков открыл я в Ваш код не вникал но за столь короткое время я б стоко не наваял у меня на pl/sql получилось очень просто "параллелизм" не добавлял , ето усложнит(замедлит) расчет, не уверен что етого стоит Код: plsql 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.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2021, 10:50 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax у меня на pl/sql получилось очень просто Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2021, 15:24 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
dbms_photoshop предлагаю померять сколько будут выполняться вложенные циклы. а смысл пятничная, ето ж sql pl/sql приплел, лиш потому что у booby уж слишком наворочено я с 17-го отлучен от оракля, нет реальной практики, офис (принтеры, сканеры, бумага, PK, win10/7, сеть, доступы, драйвера, и тд) я изначально решал несколько другую задачу, и кто скоко открыл коробок (за мин время) >>> если немного вникнуть в альтернативные решения. вот именно, что если немного, то >>> Например, добавить еще один столбец с конкатенацией. попробовал, с наскока не получилось, плюнул верю, что можно, но у меня просто не получилось кто дочитал, с Новым Годом ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2021, 16:05 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Stax, структурно, в самой общей идее, у нас с вами одинаковый код – имитировать прямую раздачу работ поштучно. Это позволяет собирать любую статистику и логировать процесс работы. Разница в том, что вы ищете следующий минимальный элемент прямым линейным поиском, а у меня список работников всякий раз перестраивается так, чтобы работник с минимальной стоимостью всегда оказывался в первой позиции. Это min-heap. Погружает нагруженного работой сотрудника в среднем за log(m), где m – число работников. Касательно производительности – на малых m именно ваш вариант будет самым быстрым способом распределения по двум причинам. До естественного предела в 7-8 квадратичный алгоритм предпочтительней – 3^2 = 9, а Log(8) = 3, это одна причина. Вторая в том, у вас существенно меньше кода + вызовов функций. Замеров я не делал, но само по себе, уменьшение объема работающего кода должно сдвигать область нейтрального выбора куда-то ближе к двум десяткам. Про «не написал бы» - мне было откуда скопипастить. С Новым Годом. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2021, 21:18 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
Идея о том, что надо работать на группах возникла прямо в процессе написания соответствующего поста. Сейчас дорисовал код под это. Он не шибко чист в некоторых деталях, но как proof of concept, надеюсь, годится. Решил оформить в виде самостоятельного пакета, вот код Код: plsql 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. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392.
Скрипт проверки результатов в сравнении с f_box Код: plsql 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.
Прогон на не выдающейся железке. Код: plsql 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. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350.
Есть у меня впечатление, что к этой задаче со стороны sql должен бы прикручиваться ratio_to_report. Но сделать это успешно я не смог, не вполне понимаю, почему. По крайней мере, бросил эту затею. При увеличении масштаба задачи, рано или поздно, придется уходить на «чистый» sql, примерно в том стиле, как это было показано в посте с кодом на t-sql. Функциональный индекс на GTT способен полностью решить тему с выбором следующего назначаемого. Но платить штрафы за использование buffer pool и прочие поддержки транзакционности без специальной необходимости не хочется. Ускорять что-то усложнением реализации пирамиды в стиле k-way или иным способом - вряд ли того стоит вообще. Несопоставимо проще уж просто сесть на GTT, при особо острой необходимости. PS Надо будет когда-нибудь поинтересоваться, говорит ли теория массового обслуживания что-то полезное про именно такую формулировку задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2022, 06:47 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
что-то такое рекурсивное получилось на 21xe Код: plsql 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.
:p_count=31 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2022, 01:05 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
чуть поправил через cross apply подсмотрел кляузу cycle lv set cycle to 1 default 0 Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2022, 01:40 |
|
Пятничная задача: работнички.
|
|||
---|---|---|---|
#18+
снизил количество шагов в 3 раза и повысил точность вроде бы :) Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 10:16 |
|
|
start [/forum/topic.php?fid=52&msg=40124354&tid=1879631]: |
0ms |
get settings: |
3ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
50ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
245ms |
get tp. blocked users: |
1ms |
others: | 292ms |
total: | 605ms |
0 / 0 |