2013-09-21 3 views
0

Я использую SQL Server 2012 и имею таблицу в моей базе данных с 10 строками, которые не имеют запроса в sql-сервере профилировщика. Но когда я использую dm_db_index_usage_stats для использования индексов обследований, индекс первичного ключа этой таблицы имеет высокие user_update и user_seek.sql server высокий индекс использования

Я не знаю, почему этот индекс имеет высокое обновление и поиск.

Среднее обновление для этой неиспользованной таблицы составляет около 1000 обновлений в минуту.

Редактировать

эта таблица не имеет никакого внешнего ключа с другой таблицей и не имеют какой-либо зависимости.

Я думаю, что эта проблема была ошибкой в ​​sql-сервере.

EDIT 2

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

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

EDIT 3

я пишу после обновления триггера на этой таблице, и сохранить обновленную запись в другой таблице (JohnLBevan suggest) но не вставляйте какие-либо записи на новую таблицу, значит этот триггер дону Не бегай. но index user_seek и index user_update изменяются. Я твердо верю, что эта проблема является ошибкой в ​​SQL Server. но я не знаю, что эти обновления и поиск эффективны в производительности.

Edit 4

Я использую ниже код, чтобы получить использование индекса:

SELECT * 
From 
(SELECT DB_NAME(ddius.database_id)AS DatabaseName, OBJECT_NAME(ddius.object_id) AS object_name , 
     CASE 
     WHEN (SUM(user_updates + user_seeks + user_scans + user_lookups) = 0) 
     THEN NULL 
     ELSE (CAST(SUM(user_seeks + user_scans + user_lookups) AS DECIMAL) 
        /CAST(SUM(user_updates + user_seeks + user_scans 
           + user_lookups) AS DECIMAL)) 
     END AS RatioOfReads , 
     CASE 
     WHEN (SUM(user_updates + user_seeks + user_scans + user_lookups) = 0) 
     THEN NULL 
     ELSE (CAST(SUM(user_updates) AS DECIMAL) 
        /CAST(SUM(user_updates + user_seeks + user_scans 
           + user_lookups) AS DECIMAL)) 
     END AS RatioOfWrites , 
     SUM(user_updates + user_seeks + user_scans + user_lookups) 
                AS TotalReadOperations , 
     SUM(user_updates) AS TotalWriteOperations 
FROM sys.dm_db_index_usage_stats AS ddius 
     JOIN sys.indexes AS i ON ddius.object_id = i.object_id 
           AND ddius.index_id = i.index_id 
WHERE i.type_desc IN ('CLUSTERED', 'HEAP') --only works in Current db 
GROUP BY ddius.database_id,ddius.object_id) Z 
ORDER BY TotalWriteOperations desc --OBJECT_NAME(ddius.object_id) 
+1

Этот вопрос, как представляется, не по теме, потому что ему не хватает достаточной соответствующей информации –

+0

неиспользуемые таблицы не обновляются. –

+0

Неиспользуемые таблицы не должны обновляться. но эта таблица имеет большое обновление без использования. –

ответ

5
SELECT * 
From 
(SELECT OBJECT_NAME(ddius.object_id) AS object_name , 
     ... 
FROM sys.dm_db_index_usage_stats AS ddius 
     JOIN sys.indexes AS i ON ddius.object_id = i.object_id 
           AND ddius.index_id = i.index_id 
WHERE i.type_desc IN ('CLUSTERED', 'HEAP') --only works in Current db 
GROUP BY ddius.object_id) Z 
ORDER BY TotalWriteOperations desc --OBJECT_NAME(ddius.object_id) 

Запрос неверен. sys.dm_db_index_usage_stats будет возвращать записи со всего сервера (все БД), но вы соединяетесь с любыми текущими БД object_id/index_id. Результаты неверно агрегируют записи из всех БД и представляют их как использование в текущей БД. Добавить ddius.database_id = DB_ID() в WHERE:

WHERE i.index_id <= 1 -- clustered or heap 
AND ddius.database_id = DB_ID() 
+0

+1 спасибо за ваш ответ. Я буду назначать бонусы, когда это разрешено системой (через 24 часа). –

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