2016-04-28 2 views
2

Почему, когда я делаю это:Почему SELECT FROM sys.dm_db_index_usage_stats возвращает две строки/таблицу?

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,* 
FROM sys.dm_db_index_usage_stats 
WHERE OBJECT_ID=OBJECT_ID('TestTableName') 

Могу ли я получить два записи, а не один?

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

Столбец last_user_update идентичен в обеих записях, возвращаемых этим запросом. Могу ли я использовать значение в первой записи или они могут отличаться?

См захвата экрана ниже результатов:

Screen Capture of results

DatabaseName last_user_update database_id object_id index_id user_seeks user_scans user_lookups user_updates last_user_seek last_user_scan last_user_lookup last_user_update system_seeks system_scans system_lookups system_updates last_system_seek last_system_scan last_system_lookup last_system_update 
TestTableName 2016-04-27 07:53:51.740 5 939150391 1 0 101556 101557 6 NULL 2016-04-28 07:27:17.933 2016-04-28 07:27:17.927 2016-04-27 07:53:51.740 0 3 0 0 NULL 2016-04-27 07:52:49.203 NULL NULL 
TestTableName 2016-04-27 07:53:51.740 5 939150391 2 101559 3 0 6 2016-04-28 07:27:17.927 2016-04-26 17:31:21.200 NULL 2016-04-27 07:53:51.740 0 1 0 0 NULL 2016-04-27 18:21:53.977 NULL NULL 

ответ

5

IndexID 1 представляет кластерный индекс.

Indexid of 2 - это некластеризованный индекс.

Вы также можете увидеть индекс 0, если таблица структурирована как куча (без кластерного индекса), это на самом деле не индекс, но операции с ним в любом случае показаны в этом представлении.

Что касается вашего вторичного вопроса, то некластеризованный индекс охватывает все столбцы, которые вас интересуют? Если вам просто интересно, если любой обновленный столбец, вы можете также просто взглянуть на строку для кластерного индекса, поскольку любое обновление не может повлиять на NCI, но не на CI.

Вы можете получить ложные срабатывания, хотя и с вашим подходом, так как этот столбец показывает последний раз, когда был выполнен план выполнения, содержащий оператор, который может обновлять этот индекс, а не то, что обновление определенно произошло. Также значения будут нулевыми после перезапуска службы или база данных будет отключена (как это может произойти с автоматическим закрытием).

+0

Кроме того, ваш захват экрана показывает Index_id из 1, который является кластеризованным индексом – Shaneis

+0

@Shaneis. Я не смотрел на это. Я прочитал текст под ним и выглядел так, как будто я увидел 0, который относится к следующему столбцу. Спасибо, отредактирован. –

+0

+1 для «показывает последний раз, когда был выполнен план выполнения, содержащий оператор, который может обновлять этот индекс, а не то, что обновление определенно произошло. Также значения будут нулевыми после перезапуска службы или установки базы данных в автономном режиме (как это может произойти с авто закрыть). " – TheGameiswar

Смежные вопросы