|
|
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
Было у меня мнение с древних времен, что pipelined быстрее возвращает первые строки, а non-pipelined быстрее отрабатывает в целом (с весьма незначительной разницей). Сие умозаключение нерелевантно для 11g, где pipelined может отрабатывать в два раза быстрее non-pipelined (выделено желтым). Но вот что больше удивило - просаживание производительности на 12c, где все выполняется заметно дольше, а время выполнение non-pipelined более чем в два раза медленее 11g (выделено красным). src Код: 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. test Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 11.2 Код: 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. 12.2 Код: 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. Смотрим может чего интересного есть в SQL monitor (для запросов с plsql_optimize_level = 2) 11.2 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 12.2 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Обращает на себя внимание, что для 12с много времени уходит в Other Waits, но больше ничего интересного нет. Смотрим в ash, на 12с появляется event "acknowledge over PGA limit", оказывается это связано с PGA_AGGREGATE_LIMIT . Фикс 12c: 'acknowledge over PGA limit' Wait Event (Doc ID 2138882.1) Код: plsql 1. После этого отличается от 11g в рамках погрешности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 12:16 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, имхо такой тест несколько не сравним: 1. в pipe идет создание объекта в pl/sql, а в non_pipe в sql 2. в non_pipe на выделение памяти надо время времени пока нет - не тестил, но на 99% уверен что вся разница по времени в эти два пункта и уходит. Попробуй c dtrace/systemtap посмотреть флеймграф. Для валидного теста имхо надо в обоих функциях коллекцию сначала предсоздать и потом уже отдавать, чтобы разница была чисто в pipe row и return result. Кроме того, я не знаю как работает "COLLECTION ITERATOR PICKLER FETCH", может он оптимизирован для pipe функций и достает пачками? если сам не глянешь - могу вечером потестить. dbms_photoshop Код: plsql 1. эту штуку я на 12с сейчас сразу вырубаю, после того как нарвался на то что оракл кильнул бэкграунд процессы по этому лимиту и весь инстанс грохнулся, хотя задумано это было для пользовательских сессий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 14:52 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
xtenderДля валидного теста имхо надо в обоих функциях коллекцию сначала предсоздать и потом уже отдавать, чтобы разница была чисто в pipe row и return result.Поскольку вариант с bulk collect медленнее, перепишем его на for loop. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Смотрим dbms_hprof Код: 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. Казалось бы, теперь нагрузка равномерно размазана между SQL & PL/SQL для вариантов F_NON_PIPE0 и F_PIPE. В обоих случаях выполняется 10000 фетчей по 100 строк и даже время выполнения примерно одинаковое. Но по времени реакции на клиенте все несколько не так. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2017, 16:55 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopСие умозаключение нерелевантно для 11g, где pipelined может отрабатывать в два раза быстрее non-pipelined (выделено желтым).Ребяты, с точки зрения разработчика вы занимаетесь хернёй: если можно не использовать pipelined, то и не нужно натягивать удава на ежа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 09:53 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
Elic, pipelined очень удобны, позволяют запихнуть в PL/SQL сложную логику работы с большими объемами данных. В чистом SQL это бы означало кучу вспомогательных временных таблиц и сопутствующие ритуальные танцы вокруг них. В чистом PL/SQL - постоянная забота, чтобы в коллекциях не сожрать слишком много памяти. А в pipelined - сгенерил, сразу отдал, взял следующую порцию. Ни у кого голова не болит. Возможность без проблем всё это параллелить - вообще дар богов. Я у себя при обработке ещё попутно longops наполняю, очень удобно следить за прогрессом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 21:13 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
ElicРебяты, с точки зрения разработчика вы занимаетесь хернёй: если можно не использовать pipelined, то и не нужно натягивать удава на ежа.В названии темы указано какие инструменты сраваниваются. rpovarovВозможность без проблем всё это параллелить - вообще дар богов.Это ты верно отнес в плюсы pipelined, но в теме речь идет про pipelined table function vs regular table function. А не сравнение с SQL подходами или другими способами вернуть набор данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2017, 21:55 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
xtenderя не знаю как работает "COLLECTION ITERATOR PICKLER FETCH", может он оптимизирован для pipe функций и достает пачкамиВ общем наоборот - это не pipelined оптимизированы, а обычные - так плохо реализованы :) Проблемы тут две: 1. мучительно долгая обработка результата не-pipelined функции (см. kgmpoa_process_out_args в oncpu_nonpipe.svg) 2. копирование коллекции (см. pmusasc_Assign_Collection в oncpu_nonpipe.svg) В результате, будет быстрее даже просто создать функцию, которая будет пайпить результаты не-pipelined функции (см. f_pipe_for_nonpipe) ddl Код: 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. test Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 05:31 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
xtender, Стек для pipe выглядит для меня вполне логично: фетч (opifch2) вызывает PL/SQL движок (pfrrun). А вот для non-pipe есть отдельно фетч и отдельно на том же уровне opiexe (который вызывает PL/SQL движок и process_out_args отдельно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 14:56 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Про то и речь в первом пункте: у случае обычных table function, oracle сначала так долго предпроцессит что функция будет возвращать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 14:59 |
|
||
|
pipelined vs non-pipelined
|
|||
|---|---|---|---|
|
#18+
xtenderсначала так долго предпроцессит, что функция будет возвращатьЭто, кстати, походу и объясняет почему так сильно отличается фактическое время для non-pipe и показанное с помощью dbms_hprof. Вероятно, dbms_hprof просто не отлавливает kgmpoa_process_out_args. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2017, 15:09 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=133&tid=1884757]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 404ms |

| 0 / 0 |
