Запрос dm_db_index_usage_stats возвращает пустую строку

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть пользователь, сообщающий мне, что некоторые данные в нашем приложении изменились.

Используя этот пример, я выполнил следующий запрос к таблице, которая заполняет данные в приложении:

 SELECT OBJECT_NAME(OBJECT_ID) AS TableName,
 last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'Mydatabase')
AND OBJECT_ID=OBJECT_ID('mytable')
  

Я не получаю никаких строк обратно, поэтому, похоже, нет истории данных в таблице, поскольку они были обновлены?

Я запустил

 SELECT OBJECT_NAME(OBJECT_ID) AS TableName,
 last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'Mydatabase')
  

и я получил обратно 13 строк, хотя у некоторых из них было null для имени таблицы.

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

1. Вы получаете обратно object_id? Возможно ли, что object_id сопоставляется с объектом в другой базе данных или на другом сервере?

Ответ №1:

Первый пункт:

Счетчики инициализируются как пустые при каждом запуске службы SQL Server (MSSQLSERVER). Кроме того, всякий раз, когда база данных отсоединяется или закрывается (например, из-за того, что для параметра AUTO_CLOSE установлено значение ON), все строки, связанные с базой данных, удаляются.

Итак, если ваш сервер был перезапущен или что-то еще, у вас нет статистики.

Второй момент:

Используйте database_id параметр при вызове OBJECT_NAME функции:

 SELECT OBJECT_NAME(OBJECT_ID, DB_ID( 'Mydatabase')) AS TableName,
 last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'Mydatabase')