|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Добрый день! Подскажите, в какую сторону копать, в чем может быть причина долгой работы запроса при дебаге. Сам запрос находится в пакетной функции: Код: 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.
Когда дебажу функцию, ты выполнение занимает порядка 10-15 минут. При этом, перед выполнением данного запроса, меньше чем за секунду выполняется такой же запрос, но с другими параметрами. Если просто скопировать запрос и выполнить в pl/sql developer-е, то время выполнения около 250 мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 12:08 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
jrqq4-h7h2v в чем может быть причина долгой работы запроса ... выполнение занимает порядка 10-15 минут. ...меньше чем за секунду выполняется такой же запрос, но с другими параметрами . ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 17:46 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Я бы больше грешил на jrqq4-h7h2v Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 17:51 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров но каждый раз добросовестно выполняется и пересчитывается Сомнительно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 17:53 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Если не объявлена как DETERMINISTIC, то однозначно выполняется больше (или равно), чем отобранных до условия строк ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 18:03 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров однозначно Вячеслав, а если date_from или date_to - часть access path, тогда как? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 18:37 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
andrey_anonymous, тогда сам запрос - комбинированная ошибка из Order by и rownum ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 18:46 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
booby andrey_anonymous, тогда сам запрос - комбинированная ошибка из Order by и rownum Это да. Лучше бы вместо rownum воспользовался единственным фетчем курсора, но то такое... Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 19:15 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
andrey_anonymous Вячеслав, а если date_from или date_to - часть access path, тогда как? :) А тут и нарваться можно: Код: 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.
А вот с ACCESS: Код: 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.
Т.e UDF + ACCESS без FILTER = баг. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 19:27 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
SY UDF + ACCESS без FILTER = баг. Видимо стал туговат на старости лет. Вижу, что заказан доступ по значению 1. Получена одна строка со значением 1. Где именно баг? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 19:41 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
andrey_anonymous SY UDF + ACCESS без FILTER = баг. Где именно баг? Я бы даже переформулировал: non-deterministic filter без access - суть "магия исходных данных" (с). Слегка поправил тесткейс с фильтром: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 19:54 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Ну как я понимаю eсли non-deterministic в WHERE то ф-ция должна вызываться для каждой строки для котoрой предидушие проверенные условия TRUE. Если нет, то баг ибо потенциально получаем неправильный результат. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 20:56 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Хорошо, а что насчет отсутствия параметра у предполагаемой функции? Что такое "deterministic" функция без параметра? Это когда известно, что она всегда 5 возвращает? Как о таком волшебстве узнает/должна узнавать система? Наличие/отсутстие параметров и deterministic совершенно перпeндикулярны. Нет параметров не означает ф-ция возврaщает один и тот-же результат. Но начнем с того что это система ничего сама не определяет - юзер говорит системe эта ф-ция deterministic и система ничего не "додумывает" сама. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 21:39 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
SY, Количество вызовов функций никак не гарантируется (и для deterministic в том числе - из-за возможных хэш коллизий), просто нужно понимать, что значения в access предикатах - это входные параметры rowsource функции, соответственно, они и вычисляются при её запуске, в отличие от filter предикатов, которые выполняются для каждой из полученных ею строк. Да и вообще, функции - не операторы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 22:18 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
это я вот к чему: из тех примеров, которые проходили на форуме, следует, что при наличии параметра не зависящего от фильтруемых данных, любая функция будет, скорее всего, оптимизирована до единственного вызова. Случай отсутствия параметра тёмен в двух отношениях - не ясно, какое поведение от системы ожидать, и, второй момент, в данном случае могут быть проблемы с интерпретацией типа возвращаемого результата. Третий момент - здесь between, и, вероятно, он разложится в пару вызовов. я бы предложил либо мутить что-то с контекстными переменными для таких случаев, либо, может быть, заворачивать вызов функции с независимым от данных параметром в несмерживаемое представление... Как-то так, если дело действительно в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 22:20 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
jrqq4-h7h2v, Зрите в корень - смотрите на выполнение самого запроса(план, sql monitor, статистики и тд) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 22:20 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
сам запрос-то, предварительно, хорошо бы привести виду, дающему правильный результат. Потом можно и в корень... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 22:24 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Спасибо, за ответы, еще не успел все осмысленно прочитать и проанализировать, возможно уже ответили, и, позже, я все осознаю и пойму ))), но тем не менее, по результатам сегодняшних мытарств, хочу уточнить проблему. Тестирую "some_function": Код: 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.
1. В тестовом окне pl/sql developer-a, запускаю в режиме дебага (CTRL-R). Ставлю точку останова на запросе в теле функции. Запрос выполняется 15 мин. При этом сама процедура выполняется 30-40 минут. 2. Ничего не меняя, в том же тестовом окне, запускаю выполнение процедуры по F8. Время выполнения всей процедуры 30-40 c. Если решение проблемы уже описали выше, пожалуйста ткните мордой. P.S. План выполнения запроса могу предоставить, но, колеги подсказали, что тот план который показывает оракл, при выполнении запроса в отдельном окне, может отличаться от того, который он будет использовать при запуске пакетной процедуры. Если это так, то подскажите, пожалуйста, как можно вытащить реальный план выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 23:19 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
xtender Количество вызовов функций никак не гарантируется (и для deterministic в том числе - из-за возможных хэш коллизий), просто нужно понимать, что значения в access предикатах - это входные параметры rowsource функции, соответственно, они и вычисляются при её запуске, в отличие от filter предикатов, которые выполняются для каждой из полученных ею строк. Да и вообще, функции - не операторы. А я и не говорю что количество вызовов функций гарантируется. Оптимизатор может, например внaчале cartesian join TABLE_A, TABLE_B и только потом WHERE FUNC = TABLE_B.COL а завтра внaчале WHERE FUNC = TABLE_B.COL a потом join количество вызовов изменится. Баг в том что что оптимизатор решает пофиг что функция non-deterministic у меня тут подходящий индекс завалялся так-что я её выполню разок и хва. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 23:37 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
Друзья, спасибо за участие! Дело было действительно в функции, а что дальше делать и как с этим жить, буду разбираться, слава богу информации накидали много. Еще раз спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 23:48 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
jrqq4-h7h2v, конкретно в этом случае - получи значение от dates.get_business_date до запуска запроса и используй переменную привязки. вот и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 00:05 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 01:35 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
andrey_anonymous Вячеслав Любомудров однозначно Вячеслав, а если date_from или date_to - часть access path, тогда как? :) Спасибо за идею на-подумать ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 07:41 |
|
При дебаге долго отрабатывает простой запрос в теле процедуры
|
|||
---|---|---|---|
#18+
SY Баг в том что что оптимизатор решает пофиг что функция non-deterministic у меня тут подходящий индекс завалялся так-что я её выполню разок и хва. А как должно быть, чтобы не быть багом? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 18:43 |
|
|
start [/forum/topic.php?fid=52&fpage=43&tid=1881154]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 311ms |
total: | 436ms |
0 / 0 |