SQL Server索引使用统计信息

SQL Server索引使用统计信息,sql,sql-server,indexing,usage-statistics,Sql,Sql Server,Indexing,Usage Statistics,为了找到要删除的索引,我运行了下面的查询 SELECT d.name AS DatabaseName, t.name AS TableName, i.name AS IndexName, ius.* FROM sys.dm_db_index_usage_stats ius JOIN sys.databases d ON d.database_id = ius.database_id JOIN sys.tables t ON t.object_id = ius.object_id JOIN sys

为了找到要删除的索引,我运行了下面的查询

SELECT d.name AS DatabaseName, t.name AS TableName, i.name AS IndexName, ius.*
FROM sys.dm_db_index_usage_stats ius
JOIN sys.databases d ON d.database_id = ius.database_id
JOIN sys.tables t ON t.object_id = ius.object_id
JOIN sys.indexes i ON i.object_id = ius.object_id AND i.index_id =
ius.index_id
ORDER BY user_updates DESC
但是返回的结果集非常混乱。我收到多行相同的索引,它们具有不同的数据库ID和名称。假设我们有一个索引,它的名字是IDXName,它的名字是IDXID。该索引位于DB1数据库中的TBL1下。但此索引有多行,它们具有相同的索引名和索引id,以及相同的表名和不同的数据库id


我仔细检查了Microsoft文档,它确认该视图中的数据库id就是索引所在的数据库。那么,为什么我有那个索引不存在的数据库的ID呢?

Yoy没有将查询添加到当前数据库,这就是为什么您看到来自不同数据库的索引数据:

SELECT d.name AS DatabaseName, t.name AS TableName, i.name AS IndexName, ius.*
FROM sys.dm_db_index_usage_stats ius
JOIN sys.databases d ON d.database_id = ius.database_id
JOIN sys.tables t ON t.object_id = ius.object_id
JOIN sys.indexes i ON i.object_id = ius.object_id AND i.index_id = ius.index_id
WHERE d.database_id = db_id()
ORDER BY user_updates DESC
如果sys.databases只需要一个数据库名称,则根本不需要连接:

SELECT db_name() AS DatabaseName, t.name AS TableName, i.name AS IndexName, ius.*
FROM sys.dm_db_index_usage_stats ius
JOIN sys.tables t ON t.object_id = ius.object_id
JOIN sys.indexes i ON i.object_id = ius.object_id AND i.index_id = ius.index_id
WHERE ius.database_id = db_id()
ORDER BY user_updates DESC

那一定是你的join语句出错了。我今年也遇到了一些问题,所以记不得了。在谷歌上搜索DMV模式布局。我有一个PDF格式的,或者是从MS那里得到的显示关系的东西。如果我只对sys.dm\u db\u index\u usage\u stats视图运行没有连接的查询,结果基本上是相同的。我有相同事件Id、相同对象Id(表Id)但不同数据库Id的结果。但每个数据库Id对于一个事件只存在一次。我有一个理论,我想知道是否有人可以证实这一点,即使它不符合微软的文档。如果一个数据库下的某个过程或某物通过索引访问另一个数据库下的某个表,那么他的index usage stat视图是否也会将其显示为一行?好的。那么你能告诉我为什么我在那一行看到db没有这样的表或索引吗?!?请阅读我对上述答案的评论。不太可能限制so.sys.dm_db_index_usage_stats返回当前元数据缓存中所有索引的数据,对于所有数据库,是否将其加入sys.databases。如果只想查看某个数据库的数据,请在WHERE子句中包含一个数据库id。对于不同数据库中的同一个对象ID,它们可能是从同一个备份中恢复的吗?伙计,请不要为了回答而尝试回答它。它没有被修复或其他任何东西。这些索引是唯一的!!!因此,无论是否使用“where”子句,在其他数据库中查看它们通常是不可能的。数据库X在任何表下都没有任何名为IXAAA的索引,但我仍然看到结果集中有一行包含此索引和此数据库。这很简单。再次记住:X没有IXAAA。