Fn trace gettable: примеры (SQL)
fn_trace_gettable(filename, number_files): tableОписание функции fn_trace_gettable
Функция fn_trace_gettable в Microsoft SQL Server предназначена для чтения содержимого файлов трассировки и возврата данных в табличном формате. Она используется для последующего анализа записанных событий сервера, таких как выполненные запросы, ошибки, блокировки или аудиторские действия.
Функция принимает два аргумента:
- @filename (
nvarchar(256)): Путь к первому файлу трассировки для чтения. Это обязательный аргумент. - @numfiles (
int): Количество файлов для обработки, если трассировка велась с ротацией файлов. Необязательный аргумент. По умолчанию имеет значениеNULL, что означает чтение только указанного файла. Если указано число, функция обработает текущий файл и указанное количество предыдущих файлов (с номерами в суффиксе).
Возвращаемое значение — таблица с набором столбцов, соответствующих стандартным столбцам трассировки SQL Server (например, EventClass, TextData, ApplicationName, NTUserName, LoginName, CPU, Reads, Writes, Duration, StartTime, EndTime и др.). Структура возвращаемой таблицы фиксирована и зависит от версии SQL Server.
Примеры использования
Чтение одного файла трассировки:
SELECT * FROM fn_trace_gettable('C:\Traces\MyTrace_1.trc', default);| EventClass | TextData | ApplicationName | ... | |------------|------------------------------------|-----------------|-----| | 12 | SELECT * FROM sys.tables | SQLCMD | ... | | 10 | RPC:Completed | .Net SqlClient | ... |
Чтение нескольких файлов с ротацией (например, основного и 2 архивных):
SELECT COUNT(*) AS TotalEvents
FROM fn_trace_gettable('C:\Traces\MyTrace_1.trc', 3);| TotalEvents | |-------------| | 12457 |
Фильтрация результатов для поиска долгих запросов:
SELECT TextData, Duration, StartTime
FROM fn_trace_gettable('C:\Traces\MyTrace_1.trc', NULL)
WHERE Duration > 1000000 -- Длительность более 1 секунды в микросекундах
ORDER BY Duration DESC;| TextData | Duration | StartTime | |---------------------------------------------------|----------|-------------------------| | EXEC usp_GenerateReport @Year=2023 | 5000000 | 2023-10-26 14:35:12.123 | | SELECT * FROM LargeTable WHERE Status = 'Pending' | 1200000 | 2023-10-26 14:21:05.456 |
Похожие функции в MS SQL
В SQL Server существуют альтернативные методы для получения данных трассировки:
- sys.fn_trace_getinfo: Возвращает информацию о текущих запущенных трассировках, их статус и параметры, но не данные событий. Используется для управления трассировками.
- Системное представление sys.traces: Предоставляет аналогичную
fn_trace_getinfoинформацию в более удобном формате. - Расширенные события (Extended Events): Современная и более производительная система диагностики, пришедшая на смену SQL Trace. Для чтения данных сессий расширенных событий используются функции
sys.fn_xe_file_target_read_fileили представленияsys.dm_xe_session_targets.
Функцию fn_trace_gettable предпочтительно использовать для анализа уже существующих файлов трассировки, созданных средствами SQL Trace или Profiler. Для новой разработки и сбора диагностических данных рекомендуется использовать расширенные события.
Альтернативы в других СУБД и языках
PostgreSQL: Для логирования запросов используется параметр log_statement. Логи записываются в текстовый файл, который можно анализировать любым средством. Также есть расширение pgAudit для детального аудита.
-- В postgresql.conf
log_statement = 'all'
-- Чтение лога
SELECT * FROM pg_read_file('postgresql.log') AS log;Oracle: Используется механизм аудита и трассировки, например, представление V$SQL для выполненных запросов или DBA_AUDIT_TRAIL для аудита. Для детальной трассировки сессии используется пакет DBMS_MONITOR.
-- Включение трассировки для сессии
EXEC DBMS_MONITOR.session_trace_enable(session_id => 123, serial_num => 456);MySQL: Общий лог запросов (general log) или медленный лог (slow query log) записываются в файл или таблицу. Для чтения используют SQL-запросы к таблице mysql.general_log.
SET global log_output = 'TABLE';
SET global general_log = 1;
SELECT * FROM mysql.general_log WHERE command_type = 'Query';SQLite: Не имеет встроенного механизма трассировки запросов. Для отладки можно использовать callback-функцию через sqlite3_trace() на уровне приложения.
Типичные ошибки
Ошибка при указании несуществующего файла трассировки:
SELECT * FROM fn_trace_gettable('C:\NonExistent.trc', NULL);Msg 7921, Level 16, State 2, Line 1 Не удалось найти файл трассировки "C:\NonExistent.trc". Убедитесь, что указано правильное имя пути.
Ошибка при отсутствии прав на чтение файла:
SELECT * FROM fn_trace_gettable('\\server\share\trace.trc', NULL);Msg 7921, Level 16, State 2, Line 1 Не удалось найти файл трассировки "\\server\share\trace.trc". Убедитесь, что указано правильное имя пути.
Ошибка при передаче некорректного значения количества файлов:
SELECT * FROM fn_trace_gettable('C:\trace.trc', -1);Msg 257, Level 16, State 3, Line 1 Невозможно явно преобразовать значение данных типа int в тип tinyint.
Важно учитывать, что функция может вернуть пустой набор, если файл трассировки поврежден или имеет несовместимый формат.
Изменения в последних версиях
Функция fn_trace_gettable сама не претерпевала значительных изменений в синтаксисе или поведении. Однако технология SQL Trace, частью которой она является, объявлена устаревшей (deprecated) начиная с SQL Server 2012. Это означает, что в будущих версиях SQL Trace и связанные с ней функции, включая fn_trace_gettable, могут быть удалены.
Корпорация Microsoft рекомендует переходить на использование расширенных событий (Extended Events) как более эффективную и современную систему диагностики. Функционал чтения файлов трассировки в расширенных событиях предоставляется через функцию sys.fn_xe_file_target_read_file.
Расширенные примеры
Анализ активности по приложениям с агрегацией:
SELECT
ApplicationName,
COUNT(*) AS EventCount,
SUM(Duration/1000) AS TotalDurationMs, -- Перевод в миллисекунды
AVG(Reads) AS AvgReads
FROM fn_trace_gettable('C:\Traces\Workload.trc', 5)
WHERE EventClass IN (10, 12) -- RPC:Completed, SQL:BatchCompleted
GROUP BY ApplicationName
ORDER BY TotalDurationMs DESC;| ApplicationName | EventCount | TotalDurationMs | AvgReads | |-------------------|------------|-----------------|----------| | MyApp.WebServer | 12000 | 4500000 | 150 | | SSMS | 500 | 120000 | 5000 | | .Net SqlClient | 7500 | 800000 | 25 |
Поиск наиболее ресурсоемких запросов с извлечением текста:
SELECT TOP 10
TextData,
Duration/1000 AS DurationMs,
Reads,
Writes,
CPU,
StartTime,
EndTime,
HostName,
LoginName
FROM fn_trace_gettable('C:\Traces\PerfTrace.trc', NULL)
WHERE TextData IS NOT NULL
AND EventClass = 12 -- SQL:BatchCompleted
ORDER BY Duration DESC;Соединение с системными представлениями для детализации:
SELECT
tr.DatabaseID,
db.name AS DatabaseName,
COUNT(*) AS QueryCount
FROM fn_trace_gettable('C:\Traces\Trace.trc', 1) tr
LEFT JOIN sys.databases db ON tr.DatabaseID = db.database_id
WHERE tr.EventClass = 12
GROUP BY tr.DatabaseID, db.name
ORDER BY QueryCount DESC;Воссоздание временной шкалы событий с учетом длительности:
SELECT
RowNumber,
EventClass,
TextData,
StartTime,
EndTime,
DATEDIFF(ms, StartTime, EndTime) AS CalculatedDurationMs,
ISNULL(Duration/1000, 0) AS TraceDurationMs
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY StartTime) AS RowNumber,
*
FROM fn_trace_gettable('C:\Traces\Detailed.trc', NULL)
) AS numbered_trace
WHERE RowNumber BETWEEN 100 AND 120;