Fn virtualfilestats: примеры (SQL)

Анализ статистики файлов базы данных через fn_virtualfilestats
Раздел: Функции потокового ввода-вывода, Мониторинг
fn_virtualfilestats([@DatabaseID=] database_id, [@FileID=] file_id): table

Описание и параметры функции

Системная функция fn_virtualfilestats в MS SQL Server предоставляет статистику операций ввода-вывода для файлов данных и журналов транзакций. Функция используется для мониторинга производительности и анализа загрузки дисковой подсистемы.

Обычно функция применяется в диагностических целях для выявления узких мест, связанных с доступом к данным. Результаты позволяют оценить количество операций чтения, записи, время ожидания ввода-вывода и общий объем переданных данных.

Аргументы

  • @DatabaseId (SMALLINT): Идентификатор базы данных. Если указано NULL, возвращаются данные для всех баз данных.
  • @FileId (SMALLINT): Идентификатор файла в указанной базе данных. Если указано NULL, возвращаются данные для всех файлов выбранной базы.

Возвращаемые значения

Функция возвращает таблицу со следующими столбцами:

  • DbId (SMALLINT): Идентификатор базы данных.
  • FileId (SMALLINT): Идентификатор файла.
  • Timestamp (INT): Момент времени сбора статистики в виде количества миллисекунд с момента запуска сервера.
  • NumberReads (BIGINT): Общее количество операций чтения с момента запуска сервера.
  • BytesRead (BIGINT): Общее количество прочитанных байтов.
  • IoStallReadMS (BIGINT): Суммарное время ожидания операций чтения в миллисекундах.
  • NumberWrites (BIGINT): Общее количество операций записи.
  • BytesWritten (BIGINT): Общее количество записанных байтов.
  • IoStallWriteMS (BIGINT): Суммарное время ожидания операций записи.
  • IoStallMS (BIGINT): Общее время ожидания операций ввода-вывода (сумма чтения и записи).
  • FileHandle (BINARY(8)): Дескриптор файла.
  • BytesOnDisk (BIGINT): Физический размер файла на диске в байтах.

Короткие примеры использования

Пример вызова функции для конкретной базы данных и файла:

SELECT * FROM fn_virtualfilestats(5, 1);
DbId FileId Timestamp   NumberReads BytesRead IoStallReadMS NumberWrites BytesWritten IoStallWriteMS IoStallMS FileHandle BytesOnDisk
5    1      1234567890  1500        12288000   450          300         2457600      120           570      0x00000000 16777216

Пример получения статистики для всех файлов базы данных с идентификатором 5:

SELECT * FROM fn_virtualfilestats(5, NULL);

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

SELECT * FROM fn_virtualfilestats(NULL, NULL);

Похожие функции в MS SQL

sys.dm_io_virtual_file_stats: Динамическое административное представление (DMV), предоставляет аналогичную информацию. Оно является рекомендуемой альтернативой, так как поддерживается в последних версиях SQL Server и имеет более удобный интерфейс запросов.

sys.dm_os_wait_stats: DMV, которое агрегирует статистику ожиданий по типам, включая ожидания ввода-вывода. Полезно для общего анализа узких мест производительности.

sys.master_files: Системное представление с информацией о файлах всех баз данных, но без динамической статистики операций ввода-вывода.

Представление sys.dm_io_virtual_file_stats предпочтительнее для новых разработок, так как оно напрямую интегрируется с другими DMV и системными представлениями.

Аналоги функции в других СУБД

MySQL: Используется система переменных состояния, например, SHOW GLOBAL STATUS LIKE 'Innodb_data_reads';. Статистика файлов InnoDB доступна через таблицу INFORMATION_SCHEMA.INNODB_METRICS.

SHOW GLOBAL STATUS WHERE Variable_name IN ('Innodb_data_reads', 'Innodb_data_writes');

Oracle: Представление V$FILESTAT предоставляет статистику ввода-вывода для файлов данных.

SELECT * FROM V$FILESTAT;

PostgreSQL: Представление pg_stat_io (начиная с версии 16) и расширение pg_stat_statements для анализа операций.

SELECT * FROM pg_stat_io;

SQLite: Прямых аналогов нет, но информация о размере базы данных доступна через PRAGMA page_count;.

PRAGMA page_count;

Основное отличие MS SQL функции - детализированная статистика на уровне отдельных файлов базы данных с накоплением с момента запуска сервера.

Типичные ошибки

Передача несуществующих идентификаторов: Функция не возвращает ошибку, но результат будет пустым набором данных.

SELECT * FROM fn_virtualfilestats(99999, 1);
(нет строк)

Неправильный тип данных: Попытка передать строку вместо числа вызывает ошибку.

SELECT * FROM fn_virtualfilestats('master', 1);
Сообщение об ошибке: Ошибка преобразования типа данных varchar в smallint.

Игнорирование NULL: Непонимание того, что NULL для параметра означает "все", может привести к неожиданно большому результату.

Изменения в последних версиях

В SQL Server 2012 и более поздних версиях функция fn_virtualfilestats сохранила обратную совместимость, но корпорация Microsoft рекомендует использовать динамическое административное представление sys.dm_io_virtual_file_stats для новых разработок.

В SQL Server 2019 и 2022 не было внесено существенных изменений в поведение или возвращаемые данные функции.

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

Пример с объединением системных представлений для получения имен баз данных и файлов:

Пример sql
SELECT DB_NAME(vfs.DbId) AS DatabaseName, mf.name AS LogicalFileName, vfs.NumberReads, vfs.NumberWrites, vfs.IoStallMS FROM fn_virtualfilestats(NULL, NULL) vfs LEFT JOIN sys.master_files mf ON vfs.DbId = mf.database_id AND vfs.FileId = mf.file_id;

Расчет средней задержки ввода-вывода в миллисекундах на операцию чтения и записи:

Пример sql
SELECT DbId, FileId, CASE WHEN NumberReads > 0 THEN IoStallReadMS / NumberReads ELSE 0 END AS AvgReadLatency, CASE WHEN NumberWrites > 0 THEN IoStallWriteMS / NumberWrites ELSE 0 END AS AvgWriteLatency FROM fn_virtualfilestats(NULL, NULL);

Мониторинг нагрузки на файлы журналов транзакций (FileId обычно равен 2 или выше для вторичных файлов журналов):

Пример sql
SELECT DB_NAME(DbId) AS DBName, SUM(BytesWritten) / 1024 / 1024 AS MB_Written, SUM(NumberWrites) AS WriteCount FROM fn_virtualfilestats(NULL, NULL) WHERE FileId IN (SELECT DISTINCT file_id FROM sys.master_files WHERE type_desc = 'LOG') GROUP BY DbId;

Сравнение активности файлов данных и журналов за период времени с помощью сохранения снимков статистики:

Пример sql
-- Создание таблицы для снимка CREATE TABLE #Snapshot1 (DbId SMALLINT, FileId SMALLINT, NumberReads BIGINT, BytesRead BIGINT, NumberWrites BIGINT, BytesWritten BIGINT, IoStallMS BIGINT, Timestamp INT); INSERT INTO #Snapshot1 SELECT DbId, FileId, NumberReads, BytesRead, NumberWrites, BytesWritten, IoStallMS, Timestamp FROM fn_virtualfilestats(NULL, NULL); WAITFOR DELAY '00:01:00'; -- Сравнение через минуту SELECT CUR.DbId, CUR.FileId, CUR.NumberReads - SNAP.NumberReads AS Reads_In_Period, CUR.IoStallMS - SNAP.IoStallMS AS IoStall_In_Period FROM fn_virtualfilestats(NULL, NULL) CUR INNER JOIN #Snapshot1 SNAP ON CUR.DbId = SNAP.DbId AND CUR.FileId = SNAP.FileId;

MS SQL fn_virtualfilestats function comments

En
Fn virtualfilestats Returns I/O statistics for database files