Я собираю данные профилирования во время выполнения из хранимых процедур PLSQL. Данные собираются по мере выполнения определенных хранимых процедур, но их необходимо накапливать при многократном выполнении этих процедур.
Чтобы свести к минимуму накладные расходы, я хотел бы сохранить эти данные профилирования в некотором резидентном хранилище памяти Oracle с доступом к PLSQL где-нибудь на время интервала сбора данных, а затем выгрузить накопленные значения. Интервал сбора данных может составлять секунды или часы; Это нормально, чтобы не хранить эти данные через системные загрузки. Что-то вроде состояния сеанса на веб-серверах подойдет.
Каковы мои варианты хранения таких данных?
Единственный известный мне метод - это контексты в dbms_sessions:
procedure set_ctx (value in varchar8) as
begin
dbms_session.set_context ( 'Test_Ctx', 'AccumulatedValue', value, NULL, 'ProfilerSessionId' );
end set_ctx;
Это работает, но занимает около 50 микросекунд (!) На обновление до накопленного значения.
То, на что я надеюсь, - это способ доступа / хранения массива значений в некоторой памяти Oracle с использованием ванильных операторов PLSQL со временем доступа, типичным для обращений к массивам, сделанным для локальных пакетов.
РЕДАКТИРОВАТЬ (после изучения времени жизни переменных пакета PLSQL):
Существуют ли доступные для PLSQL переменные с временем жизни более длительным, чем "сессии"? Я предполагаю, что такие переменные, вероятно, нуждаются в синхронизации для включения безопасных обновлений от нескольких сеансов. Как ни странно, такие данные о производительности, которые я собираю, не будут сильно повреждены такими сбоями синхронизации, потому что значения данных производительности просто растут монотонно. Ошибка синхронизации просто означала бы, что мы не уловили немного этого прироста стоимости, и я не думаю, что это повредит тому, что я делаю, чтобы это имело значение.