Fn trace gettable: примеры (SQL)

Использование fn_trace_gettable для анализа трассировок SQL Server
Раздел: Функции манипулирования статистиками, Трассировка
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.

Расширенные примеры

Анализ активности по приложениям с агрегацией:

Пример sql
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       |

Поиск наиболее ресурсоемких запросов с извлечением текста:

Пример sql
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;

Соединение с системными представлениями для детализации:

Пример sql
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;

Воссоздание временной шкалы событий с учетом длительности:

Пример sql
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;

MS SQL fn_trace_gettable function comments

En
Fn trace gettable Returns the trace file information in tabular form