我正在尝试获取有关索引的信息。根据几个网站,下面的 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
表没有保留先前对该数据库查询的数据。
一种可能性是您没有足够的权限来查看元数据。
另一个是sys.dm_db_index_usage_stats
仅报告自服务器上次重新启动以来至少使用过一次的索引。还
每当数据库分离或关闭时(例如,因为 AUTO_CLOSE 设置为 ON),与该数据库关联的所有行都将被删除。
AUTO_CLOSE
是 SQL Server Express 的默认设置。
你需要过滤sys.dm_db_index_usage_stats
的database_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)
归档时间: |
|
查看次数: |
1393 次 |
最近记录: |