我运行了下面的查询以找到要删除的索引。
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
但是返回的结果集相当混乱。对于具有不同 database_id 的相同索引,我收到多行,因此名称也不同。假设我们有一个索引,它的名称是 IDXName,它是 IDXID。该索引位于 DB1 数据库中的 TBL1 下。但是这个索引有多个行,具有相同的索引名称和相同的索引 ID 以及相同的表名但数据库 ID 不同。
我仔细检查了 Microsoft 文档,它确认该视图中的数据库 ID 是索引所在的数据库。那么我怎么会有那个索引不存在的数据库的ID?
您没有将查询限制在当前数据库,这就是为什么您会看到来自不同数据库的索引的使用情况统计信息:
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