for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Не фоксом единым
   :: Помощь сайту :: 

Oracle. Collections&pipe row()
Pekpytep
Автор

Сообщений: 687
Откуда: Луганск
Дата: 20.03.18 07:45:23ОтветитьЦитировать
Всем привет.

В проекте, на котором я в данный момент задействован, для формирования отчетов используются конвейерные функции. При этом зачем-то данные из курсора сначала переливаются в коллекцию, затем отдаются в 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
Автор

Сообщений: 687
Откуда: Луганск
Дата: 20.03.18 10:10:04ОтветитьЦитировать
Нашел ветку обсуждения производительности 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

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Oracle. Collections&pipe row()
Pekpytep
Автор

Сообщений: 687
Откуда: Луганск
Дата: 20.03.18 21:46:58ОтветитьЦитировать
Не помню что за исключение было, сегодня было не до тестов. Попробую завтра выкроить немного времени на эксперименты. Еще проблемой будет ограничение на фетч в 200 строк для оракловского SQL Developerа, придется делать лишние телодвижения в виде ctrl-end и теряя время.
Ratings: 0 negative/0 positive

Re: Oracle. Collections&pipe row()
Igor Korolyov

Сообщений: 31499
Дата: 20.03.18 22:04:43ОтветитьЦитировать
Не пользуйся девелопером, пользуйся sqlplus-ом Или программу напиши на любом языке - что на фоксе, что на шарпе это десяток строк кода, даже с замером времени исполнения

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Oracle. Collections&pipe row()
Pekpytep
Автор

Сообщений: 687
Откуда: Луганск
Дата: 23.03.18 10:50:01ОтветитьЦитировать
Провел тестирование, результаты в общем-то предсказуемы.

  
                              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: 52 and Guests: 52


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