我已经在下面运行查询以找到要删除的索引。
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?
最佳答案
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