为何同一ObjectID 885578193会出现在两个不同数据库中?
同一ObjectID出现在多个数据库的原因分析
你遇到的核心问题是查询语句中的OBJECT_NAME函数使用错误,导致出现了同一个ObjectID跨数据库显示的假象,具体原因和解决方法如下:
1. 根本原因:OBJECT_NAME的上下文问题
sys.dm_db_index_usage_stats中的object_id是数据库级唯一的——不同数据库里完全可能存在ID相同的对象,但它们是完全独立的两个对象。
你使用的OBJECT_NAME(Object_id)没有指定第二个参数database_id,这个函数默认会用当前查询所在的数据库上下文去解析对象ID,导致:
- 当当前数据库是A库时,会把B库的object_id解析成A库中同名ID的对象;
- 反之亦然,最终看起来同一个object_id同时属于两个不同数据库。
2. 验证与修正方法
把查询语句中的OBJECT_NAME(Object_id)改为OBJECT_NAME(Object_id, Database_id),让函数用每个对象所属的数据库上下文去解析名称,就能得到正确的结果:
SELECT DB_NAME(Database_id) AS DBName , OBJECT_NAME(Object_id, Database_id) AS TableName , * FROM sys.dm_db_index_usage_stats WHERE DB_NAME(Database_id) NOT LIKE 'Master%' AND NOT DB_NAME(Database_id) = 'msdb' ORDER BY DBName, TableName;
执行修正后的语句后,你会发现两个数据库中的885578193对应完全不同的表名,证实它们是不同库的独立对象。
补充:其他少见场景
如果修正后确实存在同一ID跨库对应同一对象,那可能是以下情况:
- 数据库通过还原、备份复制创建,原库和复制库保留了相同的对象ID;
- 使用了跨数据库的对象引用(如同义词),但这种情况不会导致
sys.dm_db_index_usage_stats中出现跨库的同一ID记录。
内容的提问来源于stack exchange,提问作者Axium7
相关产品推荐
相关产品推荐

