0

我使用 SQL Server 2012 并在我的数据库中有一个表,其中包含 10 行,通常在 sql server profiler 中没有查询。但是当我dm_db_index_usage_stats用于索引的调查使用时,该表的主键索引具有高user_updateuser_seek.

我不知道为什么这个索引有很高的更新和搜索。

此未使用表的平均更新约为每分钟 1000 次更新。

编辑

该表与另一个表没有任何外键,也没有任何依赖关系。

我认为这个问题是 sql server 中的一个错误。

编辑 2

当我删除并重新创建该表并再次在其上插入数据时,该表的索引使用情况没有改变。

我认为可能存在一些像这个表这样的表(没有使用并且有索引更新和索引搜索)。

编辑 3

我在这个表上写了一个更新后触发器,并将更新的记录保存到另一个表JohnLBevan suggest但不在新表上插入任何记录,这意味着这个触发器不运行。但索引 user_seek 和索引 user_update 仍然发生变化。我坚信这个问题是 SQL Server 中的一个错误。但我不知道这些更新和搜索对性能有效。

编辑 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)
4

1 回答 1

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()
于 2013-09-23T12:58:03.847 回答