Господа,
зарялся я ускорением работы процедур в системе.
Наиболее узким местом оказался пакет, предоставляющий различные функции, которые так или иначе совершают
выборку по данному ключу из громадной таблицы.
В качестве способа ускорить работу было принято решение собирать все данные в массив, и, за один проход по нему, формировать заранее
все данные, которые предоставляются фнкциями... Эти детали, на самом деле. не важны, посему описывал пространно.
Вот как это делается:
в спецификации пакета определяем следующую структуру:
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?
Заранее спасибо!
Я весьма доверчив, когда речь идет о моих словах. Я верю всему, что
говорю, хотя и знаю, что я лжец.