我只是想知道 SQL Server 中 sys.sysrowsets 的用法是什么?微软说它“存在于每个数据库中。为索引或堆的每个分区行集包含一行。” 但什么是分区?
另外这个表的 idmajor 和 idminor 是什么意思?我尝试查找表(246486340)的对象 ID,然后执行查询:
Select * from sys.sysrowsets where idmajor = 246486340
Run Code Online (Sandbox Code Playgroud)
结果有两条记录:
rowsetid ownertype idmajor idminor numpart status fgidfs rcrows
72057603504865280 1 246486340 1 1 6 0 2582
72057603612213248 1 246486340 6 1 2 0 2582
Run Code Online (Sandbox Code Playgroud)
但我认为应该只有一个具有该主要 id 的记录。
我正在阅读这篇文章:存储引擎内部:页面剖析。
我有一个数据库MyDB
,数据库中有一个表MyTable
。
我有以下问题:
如果我这样做:
(1) 使用以下查询查找表的对象 ID:
Use MyDB;
select sys.objects.name, sys.objects.object_id from sys.objects where (name = 'MyTable');
Run Code Online (Sandbox Code Playgroud)
(2) 然后使用以下命令查找分配给的所有页面MyTable
:
dbcc ind(MyDB, 'MyTable', -1);
Run Code Online (Sandbox Code Playgroud)
(3)然后在结果表中,我选择其中一个数据页(页类型= 1),并使用以下命令:
DBCC TRACEON(3604);
DBCC PAGE (MyDB, 1, 17386, 3);
Run Code Online (Sandbox Code Playgroud)
那么在步骤(3)的转储内容(页头)中, m_objId
(AllocUnitId.idObj
)字段应该等于步骤(1)中获得的对象ID。那是对的吗?
以及这是否适用于用户表和系统基表,例如sys.syscolpars
基表?
根据我的测试,以上两个结论都是正确的。
元数据:ObjectId 是什么意思?在文章中, 'metadata: objectId' <> m_objId
。但是从我自己的测试来看,'metadata: objectId' 总是等于m_objId
. 为什么?原始文章没有清楚地解释元数据。
我使用的是 SQL Server 2005、2008、2008 R2、2012 和 2014