SQL Server索引使用情况统计信息

ata*_*ebi 3 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.indexes i ON i.object_id = ius.object_id AND i.index_id =
ius.index_id
ORDER BY user_updates DESC
Run Code Online (Sandbox Code Playgroud)

但返回的结果集非常令人困惑.我正在为具有不同database_ids的相同索引接收多行,因此名称.假设我们有一个索引,它的名字是IDXName,它是IDXID.该索引在DB1数据库中的TBL1下.但是,此索引有多个行具有相同的索引名称和相同的索引ID以及相同的表名但具有不同的数据库ID.

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

dea*_*ean 5

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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)