哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?

Posted

技术标签:

【中文标题】哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?【英文标题】:Which database stores sys.tables or sys.indexes in SQL Server? 【发布时间】:2019-03-12 06:04:17 【问题描述】:

我无法弄清楚这些系统表的存储位置,非常感谢您的帮助。

【问题讨论】:

这有关系吗?如果你弄清楚了,而供应商在下一个版本中更改了它的位置怎么办。 【参考方案1】:

这些是视图。

视图定义保存在隐藏的resource database 中,但它们访问每个单独数据库中保存的system base tables。

您可以使用sp_helptext 来查看sys.indexes 的定义(并且它访问sys.sysidxstatssys.syssingleobjrefssys.syspalvalues)但尝试使用sys.objects 只会显示SELECT 与@987654330 @。

如果您查看针对 sys.objects 进行选择的执行计划,则可以看到访问的对象。

  |--Hash Match(Right Outer Join, HASH:([n].[value])=([o].[type]), RESIDUAL:([mssqlsystemresource].[sys].[syspalnames].[value] as [n].[value]=[foo].[sys].[sysschobjs].[type] as [o].[type]))
       |--Clustered Index Seek(OBJECT:([mssqlsystemresource].[sys].[syspalnames].[cl] AS [n]), SEEK:([n].[class]='OBTY') ORDERED FORWARD)
       |--Hash Match(Right Outer Join, HASH:([r].[depid])=([o].[id]))
            |--Index Scan(OBJECT:([foo].[sys].[syssingleobjrefs].[nc1] AS [r]),  WHERE:([foo].[sys].[syssingleobjrefs].[class] as [r].[class]=(97) AND [foo].[sys].[syssingleobjrefs].[depsubid] as [r].[depsubid]=(0)))
            |--Filter(WHERE:(has_access('CO',[foo].[sys].[sysschobjs].[id] as [o].[id])=(1)))
                 |--Compute Scalar(DEFINE:([Expr1006]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(1),0), [Expr1009]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(16),0), [Expr1010]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(64),0)))
                      |--Clustered Index Scan(OBJECT:([foo].[sys].[sysschobjs].[clst] AS [o]), WHERE:([foo].[sys].[sysschobjs].[nsclass] as [o].[nsclass]=(0) AND [foo].[sys].[sysschobjs].[pclass] as [o].[pclass]=(1)))

但系统基表只能通过 DAC 直接查询,因此这些信息很少有用。

【讨论】:

【参考方案2】:

所有 sys 对象都存储在资源数据库中,并且在每个数据库的 sys 架构下逻辑可见。

例子:

Select * from Database.sys.sysaltfiles 将为您提供结果,尽管该视图不在该数据库中。

【讨论】:

您的回答并没有比 Martin 的回答有所改进。

以上是关于哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 文件操作

SQL Server 文件操作

sql server 存储过程如何调用存储过程

浮点数在数据库 Sql Server 中存储为 Real

SQL Server:我应该在 sys 表上使用 information_schema 表吗?

SQL SERVER如何查看一个表被哪些存储过程用到?用哪个系统存储过程?