Пакет RDB$PROFILER
Пакет RDB$PROFILER
предназначен для управления сеансами профилирования.
Note
|
|
Подробное описание таблиц и представлений плагина профилирования Default_Profiler см. в приложении Таблицы плагинов. Плагин профилирования Default_Profiler
.
Функция START_SESSION
Функция RDB$PROFILER.START_SESSION
запускает новый сеанс профилировщика, превращает его в текущий сеанс (для заданного ATTACHMENT_ID
) и возвращает его идентификатор.
Параметр | Тип | Описание |
---|---|---|
|
|
Пользовательское описание сеанса профилирования. По умолчанию |
|
|
Интервал автоматического сброса статистики в таблицы снимков. По умолчанию |
|
|
Идентификатор соединения для которого запускается сеанс профилирования. По умолчанию |
|
|
Наименование плагина профилирования. По умолчанию |
|
|
Параметры специфичные для плагина профилирования. По умолчанию |
Тип выходного результата: BIGINT NOT NULL
.
Если параметр FLUSH_INTERVAL
отличен от NULL
, то включается автоматический сброс статистики так же, как при вызове RDB$PROFILER.SET_FLUSH_INTERVAL
вручную.
Если параметр PLUGIN_NAME
имеет значение NULL
(по умолчанию), он использует конфигурацию базы данных из параметра DefaultProfilerPlugin
.
Для плагина Default_Profiler
допустимыми значениями параметра PLUGIN_OPTIONS
является NULL
или строка DETAILED_REQUESTS
.
Если указана опция DETAILED_REQUESTS
, то таблица PLG$PROF_REQUESTS
будет хранить подробные данные запросов, то есть одну запись для каждого вызова оператора. Это может привести к созданию большого количества записей, что приведёт к медленной работе RDB$PROFILER.FLUSH
.
Когда DETAILED_REQUESTS
не используется (по умолчанию), таблица PLG$PROF_REQUESTS
сохраняет агрегированную запись для каждого оператора, используя REQUEST_ID = 0
.
Процедура CANCEL_SESSION
Процедура RDB$PROFILER.CANCEL_SESSION
отменяет текущий сеанс профилировщика (для заданного ATTACHMENT_ID
).
Все данные сеанса, присутствующие в плагине профилировщика, отбрасываются и не сбрасываются.
Уже сброшенные данные не удаляются автоматически.
Параметр | Тип | Описание |
---|---|---|
|
|
Идентификатор соединения для которого отменяется сеанс профилирования. По умолчанию |
Процедура DISCARD
Процедура RDB$PROFILER.DISCARD
удаляет все сеансы (для заданного ATTACHMENT_ID
) из памяти, не сбрасывая их.
Если есть активная сессия, она отменяется.
Параметр | Тип | Описание |
---|---|---|
|
|
Идентификатор соединения для которого удаляются все сеансы профилирования. По умолчанию |
Процедура FINISH_SESSION
Процедура RDB$PROFILER.FINISH_SESSION
завершает текущий сеанс профилировщика (для заданного ATTACHMENT_ID
).
Параметр | Тип | Описание |
---|---|---|
|
|
Сбрасывать ли текущую статистику профилирования в таблицы моментальных снимков. |
|
|
Идентификатор соединения для которого завершается сеанс профилирования. По умолчанию |
Если значение параметра FLUSH
равно TRUE
, то таблицы моментальных снимков обновляются данными завершённого сеанса (и старых завершённых сеансов, ещё не присутствующих в моментальном снимке). В противном случае данные остаются только в памяти для последующего обновления.
Вызов RDB$PROFILER.FINISH_SESSION(TRUE)
имеет тот же смысл, что и вызов RDB$PROFILER.FINISH_SESSION(FALSE)
, за которым следует RDB$PROFILER.FLUSH
(с использованием того же ATTACHMENT_ID
).
Процедура FLUSH
Процедура RDB$PROFILER.FLUSH
обновляет таблицы моментальных снимков данными из сеансов профиля (для заданного ATTACHMENT_ID
) в памяти.
Параметр | Тип | Описание |
---|---|---|
|
|
Идентификатор соединения для которого обновляются таблицы моментальных снимков из сеансов профилирования. По умолчанию |
После обновления данные сохраняются в таблицах PLG$PROF_SESSIONS
, PLG$PROF_STATEMENTS
, PLG$PROF_RECORD_SOURCES
, PLG$PROF_REQUESTS
, PLG$PROF_PSQL_STATS
и PLG$PROF_RECORD_SOURCE_STATS
и могут быть прочитаны и проанализированы пользователем.
Данные обновляются с помощью автономной транзакции, поэтому если процедура вызывается в snapshot транзакции,данные не будут доступны для прямого чтения в той же транзакции.
После сброса завершённые сеансы удаляются из памяти.
Процедура PAUSE_SESSION
Процедура RDB$PROFILER.PAUSE_SESSION
приостанавливает текущий сеанс профилировщика (для заданного ATTACHMENT_ID
), после чего статистика для последующих выполненных операторов не собирается.
Параметр | Тип | Описание |
---|---|---|
|
|
Сбрасывать ли текущую статистику профилирования в таблицы моментальных снимков. |
|
|
Идентификатор соединения для которого приостанавливается сеанс профилирования. По умолчанию |
Если параметр FLUSH
имеет значение TRUE
, таблицы моментальных снимков обновляются данными до текущего момента.В противном случае данные остаются только в памяти для последующего обновления.
Вызов RDB$PROFILER.PAUSE_SESSION(TRUE)
имеет тот же смысл, что и вызов RDB$PROFILER.PAUSE_SESSION(FALSE)
, за которым следует RDB$PROFILER.FLUSH
(с использованием того же ATTACHMENT_ID
).
Процедура RESUME_SESSION
Процедура RDB$PROFILER.RESUME_SESSION
возобновляет текущий сеанс профилировщика (для заданного ATTACHMENT_ID
), если он был приостановлен, после чего вновь собирается статистика последующих выполненных операторов.
Параметр | Тип | Описание |
---|---|---|
|
|
Идентификатор соединения для которого возобновляется сеанс профилирования. По умолчанию |
Процедура SET_FLUSH_INTERVAL
Процедура RDB$PROFILER.SET_FLUSH_INTERVAL
включает периодическую автоматическую сброс статистики в таблицы моментальных снимков (когда FLUSH_INTERVAL
больше 0) или выключает (когда FLUSH_INTERVAL
равно 0).
Параметр | Тип | Описание |
---|---|---|
|
|
Интервал автоматического сброса статистики. Задаётся в секундах. |
|
|
Идентификатор соединения для которого обновляются таблицы моментальных снимков из сеансов профилирования. По умолчанию |
Как работает профилирования SQL и PSQL кода
Профилировщик позволяет пользователям измерять стоимость производительности кода SQL и PSQL.
Это реализовано с помощью системного пакета в движке, передающего данные плагину профилировщика.
В этой документации части движка и плагина рассматриваются как единое целое, так как будет использоваться профилировщик по умолчанию (Default_Profiler).
Пакет RDB$PROFILER
позволяет профилировать выполнение кода PSQL, собирая статистику о том, сколько раз выполнялась каждая строка, а также её минимальное, максимальное и накопленное время выполнения (с точностью до наносекунд), а также открывать и извлекать статистику неявных и явных SQL-курсоров.
Note
|
К сожалению профилировщик не может работать с базами данных 1 SQL-диалекта. Это происходит из-за того, что таблицы моментальных снимков содержат поля с типом BIGINT, которые нельзя создать в 1-диалекте. |
Для сбора данных профиля пользователь должен сначала запустить сеанс профиля с помощью RDB$PROFILER.START_SESSION
. Эта функция возвращает идентификатор сеанса профиля, который позже сохраняется в таблицах моментальных снимков профилировщика для запроса и анализа пользователем. Сеанс профилировщика может быть локальным (то же соединение) или удалённым (другое соединение).
Удалённое профилирование просто перенаправляет команды на удалённое соединение. Это позволяет клиенту одновременно профилировать несколько сеансов.Кроме того, локально или удалённо запущенный сеанс профилировщика может получать команды, выданные в другом соединении.
Для удалённых команд требуется, чтобы целевой сеанс находился в состоянии ожидания,то есть не выполнял других запросов. Когда они не простаивают, вызов блокируется в ожидании этого состояния.
Если удалённое соединение исходит от другого пользователя, вызывающий пользователь должен иметь системную привилегию PROFILE_ANY_ATTACHMENT
.
После запуска сеанса в памяти начинает собираться статистика PSQL и SQL операторов. Обратите внимание, что сеанс профилировщика собирает данные только об операторах, выполненных только в том соединении, которое связанно с сеансом профилировщика.
Данные агрегируются и сохраняются для каждого запроса. При запросе таблиц моментальных снимков пользователь может выполнятьдополнительную агрегацию по операторам или использовать вспомогательные представления, которые делают это автоматически.
Сеанс профилирования может быть приостановлен для временного отключения сбора статистики. Его можно возобновить позже, чтобы вернуть сбор статистики в том же сеансе.
Новый сеанс профилировщика может быть запущен, когда уже есть активный сеанс. В этом случае текущий сеанс завершается как будто была вызвана процедураRDB$PROFILER.FINISH_SESSION(FALSE)
, поэтому таблицы моментальных снимков не обновляются в этот момент.
Чтобы проанализировать собранные данные, пользователь должен сбросить данные в таблицы моментальных снимков,что можно сделать, завершив или приостановив сеанс (с параметром FLUSH
, установленным в TRUE
) или вызвав RDB$PROFILER.FLUSH
.Данные сбрасываются с помощью автономной транзакции (транзакция, запущенная и завершенная для конкретной цели обновления данных профилировщика).
Пример
Ниже приведён пример сеанса профилировщика и запросов для анализа данных.
-
Подготовка — создание таблицы и процедур, которые будут анализироваться.
create table tab ( id integer not null, val integer not null ); set term !; create or alter function mult(p1 integer, p2 integer) returns integer as begin return p1 * p2; end! create or alter procedure ins as declare n integer = 1; begin while (n <= 1000) do begin if (mod(n, 2) = 1) then insert into tab values (:n, mult(:n, 2)); n = n + 1; end end! set term ;!
-
Запуск профилирования.
select rdb$profiler.start_session('Profile Session 1') from rdb$database; set term !; execute block as begin execute procedure ins; delete from tab; end! set term ;! execute procedure rdb$profiler.finish_session(true); execute procedure ins; select rdb$profiler.start_session('Profile Session 2') from rdb$database; select mod(id, 5), sum(val) from tab where id <= 50 group by mod(id, 5) order by sum(val); execute procedure rdb$profiler.finish_session(true);
-
Анализ результатов профилирования.
set transaction read committed; select * from plg$prof_sessions; select * from plg$prof_psql_stats_view; select * from plg$prof_record_source_stats_view; select preq.* from plg$prof_requests preq join plg$prof_sessions pses on pses.profile_id = preq.profile_id and pses.description = 'Profile Session 1'; select pstat.* from plg$prof_psql_stats pstat join plg$prof_sessions pses on pses.profile_id = pstat.profile_id and pses.description = 'Profile Session 1' order by pstat.profile_id, pstat.request_id, pstat.line_num, pstat.column_num; select pstat.* from plg$prof_record_source_stats pstat join plg$prof_sessions pses on pses.profile_id = pstat.profile_id and pses.description = 'Profile Session 2' order by pstat.profile_id, pstat.request_id, pstat.cursor_id, pstat.record_source_id;