meh*_*tfi 0 sql-server sql-server-2012
我使用SQL Server 2012并在我的数据库中有一个表,其中包含10行,通常在sql server profiler中没有查询.但是当我dm_db_index_usage_stats用于索引的调查使用时,该表的主键索引具有高user_update和user_seek.
我不知道为什么这个索引有很高的更新和寻求.
此未使用表的平均更新大约是每分钟1000次更新.
编辑
此表没有与另一个表的任何外键,并且没有任何依赖项.
我认为这个问题是sql server中的一个bug.
编辑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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
查询不正确.sys.dm_db_index_usage_stats将从整个服务器(所有数据库)返回条目,但您将加入当前的数据库object_id/ index_id.结果错误地聚合来自所有DB的条目,并将它们显示为当前DB中的用法.添加ddius.database_id = DB_ID()到WHERE:
WHERE i.index_id <= 1 -- clustered or heap
AND ddius.database_id = DB_ID()
Run Code Online (Sandbox Code Playgroud)