【问题标题】:SQL Server index usage statsSQL Server 索引使用情况统计
【发布时间】:2014-04-02 01:57:14
【问题描述】:

我已运行以下查询以查找要删除的索引。

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呢?

【问题讨论】:

  • 那么你的 join 语句肯定有错误。今年(2008 年)我也遇到了问题,所以不记得了。谷歌搜索 DMV 架构布局。我有一个 PDF 或我从 MS 那里得到的显示关系的东西。
  • 如果我只为 sys.dm_db_index_usage_stats 视图运行没有连接的查询,结果基本上是相同的结果。我的结果具有相同的事件 ID、相同的对象 ID(表 ID)但不同的数据库 ID。但是每个数据库 id 对于一个事件只存在一次。我对此有一个理论,我想知道是否有人可以确认它,即使它不符合微软的文档。是否有可能如果一个数据库下的过程或某物通过索引访问另一个数据库下的表,那么他的索引使用统计视图也将其显示为一行?
  • 你确定原因了吗?我碰巧遇到了完全相同的问题。

标签: sql sql-server indexing usage-statistics


【解决方案1】:

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

【讨论】:

  • 好的。那你能告诉我为什么我在没有这样的表或没有这样的索引的那一行中看到数据库的原因吗?!?请阅读我对上述答案的评论。不太可能限制左右。
  • sys.dm_db_index_usage_stats 返回当前在元数据缓存中的所有索引的数据,对于所有数据库,是否将其加入 sys.databases。如果您只想查看某个数据库的数据,请在 WHERE 子句中包含一个 database_id。至于不同数据库中相同的object_id,可能是从同一个备份中恢复的吧?
  • 伙计,请不要为了回答而尝试回答。它没有恢复或任何东西。这些索引是唯一的!!!因此,无论是否使用“where”子句,通常都无法在其他数据库中查看它们。数据库 X 在任何表下都没有任何名为 IXAAA 的索引,但我仍然在结果集中看到具有该索引和该数据库的一行。很简单。再次记住:X 没有 IXAAA。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多