索引使用统计 DMV 表示没有索引活动

use*_*123 7 index sql-server

我正在尝试获取有关索引的信息。根据几个网站,下面的 TSQL 查询应该将索引信息加入索引表,返回索引和相关信息。下面的查询被简化为裸连接,因为我目前正在尝试返回数据,然后从那里返回我需要的内容:

SELECT *
FROM sys.indexes i
     INNER JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id
Run Code Online (Sandbox Code Playgroud)

此查询不返回任何内容。然而,在几个数据库中有数百个表至少有一个索引,根据网上的各种文章,这个查询应该返回这些索引(因为它连接到对象 ID)。此外,如果我尝试将查询更改为以下查询,它也不会返回任何内容:

SELECT *
FROM DATABASENAME.sys.indexes i
    INNER JOIN DATABASENAME.sys.dm_db_index_usage_stats s ON i.object_id = s.object_id
Run Code Online (Sandbox Code Playgroud)

为什么这个查询不返回数据?

添加

如果我运行以下查询,我会从这两个SELECT查询中收到数据:

SELECT *
FROM sys.indexes

SELECT *
FROM sys.dm_db_index_usage_stats
Run Code Online (Sandbox Code Playgroud)

问题(在原始查询上)是object_id连接。但是,我不知道为什么我在一个表中的对象在另一个表中不存在。

最终:Martin 最初给出了正确答案——即使数据是从sys.dm_db_index_usage_stats表中返回的,它也在msdb数据库中,而不是我正在寻找的特定数据库中。我再次对表运行查询,并在表中找到了数据库 ID。不确定为什么该sys.dm_db_index_usage_stats表没有保留先前对该数据库查询的数据。

Mar*_*ith 8

一种可能性是您没有足够的权限来查看元数据。

另一个是sys.dm_db_index_usage_stats仅报告自服务器上次重新启动以来至少使用过一次的索引。

每当数据库分离或关闭时(例如,因为 AUTO_CLOSE 设置为 ON),与该数据库关联的所有行都将被删除。

AUTO_CLOSE 是 SQL Server Express 的默认设置。

你需要过滤sys.dm_db_index_usage_statsdatabase_id,以确定其是否已加载的元数据为特定数据库也加入应当包括index_id

SELECT *
FROM   sys.indexes i
       LEFT JOIN sys.dm_db_index_usage_stats s
         ON i.object_id = s.object_id
            AND i.index_id = s.index_id
            AND s.database_id = DB_ID() 
Run Code Online (Sandbox Code Playgroud)