Oracle, массивы, освобождение памяти...
От: Astellar  
Дата: 17.10.06 08:48
Оценка:
Господа,
зарялся я ускорением работы процедур в системе.

Наиболее узким местом оказался пакет, предоставляющий различные функции, которые так или иначе совершают
выборку по данному ключу из громадной таблицы.

В качестве способа ускорить работу было принято решение собирать все данные в массив, и, за один проход по нему, формировать заранее
все данные, которые предоставляются фнкциями... Эти детали, на самом деле. не важны, посему описывал пространно.

Вот как это делается:


в спецификации пакета определяем следующую структуру:

  TYPE t_array_type IS VARRAY(3000) OF doc_reg%ROWTYPE;
  
  TYPE t_service_kind_nach IS RECORD
  (
    val       NUMBER := 0,
    b_val     NUMBER := 0
  ); 

  TYPE t_service_nach  IS VARRAY(20) OF t_service_kind_nach;
  TYPE t_serv_all   IS VARRAY(30) OF t_service_nach;
  TYPE t_period_all IS TABLE OF t_serv_all INDEX BY BINARY_INTEGER;

  m_period_all   t_period_all;
  m_curr_account NUMBER := 0;



Логика такая: в большинстве запросов используются различные данные (одновременно) по конкретному лицевому счету.
При первом обращении к данным по некому счету, он записывается в m_curr_account,
в t_array_type bulk collect -ом заливаются данные из мегатаблицы, затм в цикле по массиву заполняется m_period_all.

При каждом вызове процедуры смотрим, не в кэше ли account (account = m_curr_account ), если да — берем данные из массива,
если нет — очищаем кэш, загружаем данные в кэш и берем из массива. Ускорение получилось замечательнео просто, но мучает вопрос...

Вопрос: m_period_all обхявлен в спецификации пакета, т.е. живет всю сессию.
Как его правильно очищать? Достаточно ли написать m_period_all.DELETE;? Или надо пройтись по всем вложенным varray?
Заранее спасибо!
Я весьма доверчив, когда речь идет о моих словах. Я верю всему, что
говорю, хотя и знаю, что я лжец.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.