24.12.25

Небольшая ошибка в столбце sample_ms в sys.dm_io_virtual_file_stats

Автор: Paul Randal, Small bug with sample_ms in sys.dm_io_virtual_file_stats

Мне написал бывший студент по поводу странного поведения столбца sample_ms в представлении sys.dm_io_virtual_file_stats. Предполагается, что он должен содержать количество миллисекунд, прошедших с момента запуска экземпляра SQL Server. У него есть экземпляр SQL Server 2016, работающий с августа 2019 года, и там отображается следующее:

  • ms_ticks из sys.dm_os_sys_info: 51915112684 (что соответствует 28 августа 2019 года)
  • sample_ms из sys.dm_io_virtual_file_stats: 375504432 (что составляет около 4,5 дней)

Очевидно, что внутренняя переменная в SQL Server несколько раз переполнилась или сбросилась, вероятно, при достижении 2^31 или 2^32, хотя начиная с SQL Server 2016 тип данных sample_ms должен быть bigint.

Мы проверили на клиентской системе под управлением 2017 версии и обнаружили:

  • ms_ticks из sys.dm_os_sys_info: 7540084931
  • sample_ms из sys.dm_io_virtual_file_stats: 3245117407

В этом случае значение sample_ms больше 2^31, но явно переполнилось или сбросилось, а значит, точка сброса должна быть на отметке 2^32 (поскольку 3245117407 + 2^32 = 7540084703, что почти точно соответствует значению ms_ticks).

Я сообщил об этом команде разработчиков SQL Server, и они подтвердили, что это ошибка в SQL Server 2016 и более поздних версиях, которую они исправят, а также обновят документацию, чтобы было ясно, что в версиях, выпущенных до SQL Server 2016, где sample_ms имеет тип int, это значение будет периодически сбрасываться до нуля.

Ошибка не критическая, потому что если вы выполняете вычисления с использованием sample_ms, вы можете просто заменить его на ms_ticks из представления sys.dm_os_sys_info. Однако об этом стоит знать.



Комментариев нет:

Отправить комментарий