:: Не фоксом единым
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 в таблицу приводит к исключению, насколько я помню. Для логирования времени выполнения, видимо, их придется вызывать из другой функции, но тогда в логе будет общее время выполнения включая выборку. Есть у кого-нибудь идеи как провести подобные тесты? Может быть где-то в литературе или документации описаны вопросы производительности в этом контексте? Моего уровня английского, к сожалению, недостаточно для поиска ответов.
Ratings: 0 negative/0 positive
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
И ни в одном из обсуждений он не дает прямого ответа какой вариант быстрее...
Ratings: 0 negative/0 positive
Re: Oracle. Collections&pipe row()
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
IMHO bulk collect всегда должен сопровождаться ограничением размера - LIMIT или собственно условия на выборку. "безразмерная" коллекция это очень плохо. Даже если она не вылезет за лимиты, она навредит другим сессиям, употребив слишком много памяти. Конечно можно настроит ограничения по ресурсам - но тогда весьма часто будут вылеты по памяти
Для теста я бы не стал заморачиваться на какие-то "разделения". В реальном коде всё равно будет и выборка и обработка коллекции/курсора.

Про собственно логгирование я не понял... В чём состоит проблема? Если нужно писать лог в таблицу, а не в банальный dbms_output - используй автономную транзакцию в процедуре записи.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Oracle. Collections&pipe row()
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Не помню что за исключение было, сегодня было не до тестов. Попробую завтра выкроить немного времени на эксперименты. Еще проблемой будет ограничение на фетч в 200 строк для оракловского SQL Developerа, придется делать лишние телодвижения в виде ctrl-end и теряя время.
Ratings: 0 negative/0 positive
Re: Oracle. Collections&pipe row()
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не пользуйся девелопером, пользуйся sqlplus-ом Или программу напиши на любом языке - что на фоксе, что на шарпе это десяток строк кода, даже с замером времени исполнения

Или попробуй включить трассировку - в тоаде по крайней мере включение трассировки вырубает прогрессивный фетч для запросов - сразу всё "по плешку" качается.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Oracle. Collections&pipe row()
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Провел тестирование, результаты в общем-то предсказуемы.

rows avg time
collection without limit 128 0,214
collection with limit 128 0,01
without collection 128 0,01
collection without limit 1711 0,214
collection with limit 1711 2,338
without collection 1711 3,554
collection without limit 5760 9,406
collection with limit 5760 11,984
without collection 5760 17,506

К моему глубочайшему сожалению, оставлю все как есть. От тимлида, архитектора, ведущих получена отрицательная обратная связь из серии "а ты свои задачи сделал что херней занимаешься?" или "никто не жаловался, как сломается так и посмотрим" и т.д. из той же оперы. Некоторые люди умеют быстро отбивать мотивацию к качественной работе. Очень разочарован уровнем одного системного интегратора федерального уровня, наименование которого не буду произносить вслух.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика