Oracle. Collections&pipe row() | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Всем привет.
В проекте, на котором я в данный момент задействован, для формирования отчетов используются конвейерные функции. При этом зачем-то данные из курсора сначала переливаются в коллекцию, затем отдаются в pipe row(). Для меня очевидно, что узкое место - собственно выборка. Результаты обычно находятся в пределах 1-3000 строк, иначе с таким отчетом просто неудобно работать. Однако, теоретически, в некоторых отчетах (реестр договоров, например), можно задать фильтры таким образом, что результат выборки будет десятки миллионов записей, что при переливании целиком в коллекцию приведет к выжиранию PGA/UGA и выпадению в исключение. Предложил тимлиду/архитектору/ведущим/dba хотя-бы контролировать количество записей в курсоре, прикрутить LIMIT или вообще отказаться от коллекций, т.к. считаю что с большой долей вероятности вывод нескольких сотен строк через коллекцию и напрямую будет примерно одинаковым по времени плюс-минус пару секунд. На что получил странную реакцию. Начались вопросы, знаю ли я что такое BULK COLLECT и переключение контекста (да, знаю), что без коллекции будут жуткие тормоза и т.д. и т.п. Несмотря на то, что по возрасту я старше всех выше перечисленных, по "сроку службы" в этой организации я самый "зеленый" и отношение ко мне Собственно, к вопросам. Хочу провести сравнительное тестирование производительности pipe row() с использованием коллекции и напрямую из курсора и возник вопрос методики тестирования. В идеале, нужно бы отсечь время выборки и замерить только время выдачи результата. Можно сделать 3 функции с коллекцией, коллекция+limit, без коллекции, но в них не получится логировать. После pipe row() insert в таблицу приводит к исключению, насколько я помню. Для логирования времени выполнения, видимо, их придется вызывать из другой функции, но тогда в логе будет общее время выполнения включая выборку. Есть у кого-нибудь идеи как провести подобные тесты? Может быть где-то в литературе или документации описаны вопросы производительности в этом контексте? Моего уровня английского, к сожалению, недостаточно для поиска ответов. |
Re: Oracle. Collections&pipe row() | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Нашел ветку обсуждения производительности bulk collect для конвейерных функций
url='https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:19481671347143 И ни в одном из обсуждений он не дает прямого ответа какой вариант быстрее... |
Re: Oracle. Collections&pipe row() | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
IMHO bulk collect всегда должен сопровождаться ограничением размера - LIMIT или собственно условия на выборку. "безразмерная" коллекция это очень плохо. Даже если она не вылезет за лимиты, она навредит другим сессиям, употребив слишком много памяти. Конечно можно настроит ограничения по ресурсам - но тогда весьма часто будут вылеты по памяти
Для теста я бы не стал заморачиваться на какие-то "разделения". В реальном коде всё равно будет и выборка и обработка коллекции/курсора. Про собственно логгирование я не понял... В чём состоит проблема? Если нужно писать лог в таблицу, а не в банальный dbms_output - используй автономную транзакцию в процедуре записи. ------------------ WBR, Igor |
Re: Oracle. Collections&pipe row() | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Не помню что за исключение было, сегодня было не до тестов. Попробую завтра выкроить немного времени на эксперименты. Еще проблемой будет ограничение на фетч в 200 строк для оракловского SQL Developerа, придется делать лишние телодвижения в виде ctrl-end и теряя время.
|
Re: Oracle. Collections&pipe row() | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не пользуйся девелопером, пользуйся sqlplus-ом Или программу напиши на любом языке - что на фоксе, что на шарпе это десяток строк кода, даже с замером времени исполнения
Или попробуй включить трассировку - в тоаде по крайней мере включение трассировки вырубает прогрессивный фетч для запросов - сразу всё "по плешку" качается. ------------------ WBR, Igor |
Re: Oracle. Collections&pipe row() | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Провел тестирование, результаты в общем-то предсказуемы.
К моему глубочайшему сожалению, оставлю все как есть. От тимлида, архитектора, ведущих получена отрицательная обратная связь из серии "а ты свои задачи сделал что херней занимаешься?" или "никто не жаловался, как сломается так и посмотрим" и т.д. из той же оперы. Некоторые люди умеют быстро отбивать мотивацию к качественной работе. Очень разочарован уровнем одного системного интегратора федерального уровня, наименование которого не буду произносить вслух. |
© 2000-2024 Fox Club  |