|
Как сделать функцию pipelined?
|
|||
---|---|---|---|
#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. 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.
Используются они примерно так: Код: plsql 1. 2. 3. 4. 5.
В представлении V_TARIFF около сотни записей. Таблица BM_CNT_PERIOD небольшая, там пара десятков записей. Изначально был только первый вариант (не мой) и он вообще использовался только для индивидуальной (построчной) обработки. Запрос с таким вариантом (при раскомментированном N1) выполняется 15-20 секунд, скорее всего из-за select into, исключений и переключений контекста. К тому же функция вычисляется при каждом использовании, то есть если ее перечислить в select 10 раз, то и время выполнения увеличится в 10 раз. Второй вариант написан мной, он выполняется почти мгновенно (на сотне записей не видно разницы с закомментированным и раскомментированным N2). Но как я понимаю, тут все равно смесь SQL и PL/SQL переключение контекста. Теперь я бы хотел сделать третий вариант, в который бы я передавал только p_period, но чтобы он при этом работал быстро. Если я правильно понял, то для этого мне нужна pipelined, в которую сразу передается массив входных данных, а она выдает массив выходных данных, и при этом инициализация будет выполнятся только однажды. Правильно ли я понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 22:33 |
|
Как сделать функцию pipelined?
|
|||
---|---|---|---|
#18+
Думаю, нет смысла заморачиваться ещё одним вариантом. Конвейер в работе примерно так будет выглядеть. Код: plsql 1. 2. 3.
Скорее всего без разницы в производительности и область применения будет ограничена, потому как PERIOD_NEXT теперь должна возвращать не число, а всю запись. Внутри PERIOD_NEXT в цикле fetch из ref cursor на входе и pipe записи на выход. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 01:12 |
|
Как сделать функцию pipelined?
|
|||
---|---|---|---|
#18+
mcureenab Конвейер в работе примерно так будет выглядеть. Неожиданно. Я думал, что она используется как обычная функция, просто реализована с учетом того, чтобы работать в контексте SQL и соответственно будет более эффективной. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 09:10 |
|
|
start [/forum/topic.php?fid=52&fpage=29&tid=1880585]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
others: | 266ms |
total: | 385ms |
0 / 0 |