繁体   English   中英

sql server高索引使用率

[英]sql server high index usage

我使用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)
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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM