Fn virtualfilestats: примеры (SQL)
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 не было внесено существенных изменений в поведение или возвращаемые данные функции.
Расширенные примеры
Пример с объединением системных представлений для получения имен баз данных и файлов:
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;Расчет средней задержки ввода-вывода в миллисекундах на операцию чтения и записи:
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 или выше для вторичных файлов журналов):
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;Сравнение активности файлов данных и журналов за период времени с помощью сохранения снимков статистики:
-- Создание таблицы для снимка 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
- Ms SQL fn virtualfilestats - аргументы и возвращаемое значение
- Функция sql fn_virtualfilestats - описание
- fn virtualfilestats - примеры
- fn virtualfilestats - похожие методы на sql
- fn_virtualfilestats на mySQL, Oracle, PostgreSQL, SQLite
- fn virtualfilestats изменения sql
- Примеры fn_virtualfilestats на ms SQL