sys.internal_tables (Transact-SQL)
为每个作为内部表的对象返回一行。 内部表由 SQL Server 自动生成以支持各种功能。 例如,创建主 XML 索引时,SQL Server 将自动创建一个内部表以保存拆分的 XML 文档数据。 内部表出现在每个数据库的 sys 架构中,具有指示其功能的由系统生成的专有名称,例如 xml_index_nodes_2021582240_32001 或 queue_messages_1977058079。
内部表不包括用户可访问的数据,并且其架构是固定的,不可改变。 不能在 Transact-SQL 语句中引用内部表名称。 例如,不能执行 SELECT * FROM <sys.internal_table_name> 之类的语句。 但是,可以查询目录视图以查看内部表的元数据。
列名 |
数据类型 |
说明 |
---|---|---|
<从 sys.objects 继承的列> |
|
有关此视图所继承列的列表,请参阅 sys.objects (Transact-SQL)。 |
internal_type |
tinyint |
内部表的类型: 201 = queue_messages 202 = xml_index_nodes 203 = fulltext_catalog_freelist 204 = fulltext_catalog_map 205 = query_notification 206 = service_broker_map 207 = extended_indexes(如空间索引) 208 = filestream_tombstone 209 = change_tracking 210 = tracked_committed_transactions |
internal_type_desc |
nvarchar(60) |
内部表的类型说明: QUEUE_MESSAGES XML_INDEX_NODES FULLTEXT_CATALOG_FREELIST FULLTEXT_CATALOG_MAP QUERY_NOTIFICATION SERVICE_BROKER_MAP EXTENDED_INDEXES FILESTREAM_TOMBSTONE CHANGE_TRACKING TRACKED_COMMITTED_TRANSACTIONS |
parent_id |
int |
父项的 ID,无论该父项的是否在架构范围内。 否则,其值为 0(如果没有父项)。 queue_messages = 队列的 object_id xml_index_nodes = xml 索引的 object_id fulltext_catalog_freelist = 全文目录的 fulltext_catalog_id fulltext_index_map = 全文索引的 object_id query_notification,或 service_broker_map = 0 extended_indexes = 扩展索引(如空间索引)的 object_id 启用了表跟踪的表的 object_id = change_tracking |
parent_minor_id |
int |
父项的次要 ID。 xml_index_nodes = XML 索引的 index_id extended_indexes = 扩展索引(如空间索引)的 index_id 0 = queue_messages、fulltext_catalog_freelist、fulltext_index_map、query_notification、service_broker_map 或 change_tracking |
lob_data_space_id |
int |
对于该表,非零值是存放大型对象 (LOB) 数据的数据空间(文件组或分区方案)的 ID。 |
filestream_data_space_id |
int |
保留以供将来使用。 |
权限
目录视图中仅显示用户拥有的安全对象的元数据,或用户对其拥有某些权限的安全对象的元数据。 有关详细信息,请参阅元数据可见性配置。
备注
内部表与父实体位于同一文件组。 可以使用下面示例 F 中所示的目录查询返回内部表中用于行内数据、行外数据和大型对象 (LOB) 数据的页数。
您可以使用 sp_spaceused 系统进程来返回内部表的空间使用情况数据。 sp_spaceused 通过以下方式报告内部表空间:
当指定队列名称时,将引用与队列关联的基础内部表并报告其存储空间使用情况。
XML 索引、空间索引和全文索引的内部表所使用的页包括在 index_size 列中。 当指定表或索引视图名称时,此对象的 XML 索引、空间索引和全文索引的页包括在 reserved 和 index_size 列中。
示例
下列示例说明如何使用目录视图查询内部表元数据。
A.显示继承 sys.objects 目录视图中的列的内部表
SELECT * FROM sys.objects WHERE type = 'IT';
B.返回所有内部表元数据(包括从 sys.objects 中继承的元数据)
SELECT * FROM sys.internal_tables;
C.返回内部表列和列数据类型
SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
,itab.name AS internal_table_name
,typ.name AS column_data_type
,col.*
FROM sys.internal_tables AS itab
JOIN sys.columns AS col ON itab.object_id = col.object_id
JOIN sys.types AS typ ON typ.user_type_id = col.user_type_id
ORDER BY itab.name, col.column_id;
D.返回内部表索引
SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
, itab.name AS internal_table_name
, idx.*
FROM sys.internal_tables AS itab
JOIN sys.indexes AS idx ON itab.object_id = idx.object_id
ORDER BY itab.name, idx.index_id;
E.返回内部表统计信息
SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
,itab.name AS internal_table_name
, s.*
FROM sys.internal_tables AS itab
JOIN sys.stats AS s ON itab.object_id = s.object_id
ORDER BY itab.name, s.stats_id;
F.返回内部表分区和分配单元信息
SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
,itab.name AS internal_table_name
,idx.name AS heap_or_index_name
,p.*
,au.*
FROM sys.internal_tables AS itab
JOIN sys.indexes AS idx
-- JOIN to the heap or the clustered index
ON itab.object_id = idx.object_id AND idx.index_id IN (0,1)
JOIN sys.partitions AS p
ON p.object_id = idx.object_id AND p.index_id = idx.index_id
JOIN sys.allocation_units AS au
-- IN_ROW_DATA (type 1) and ROW_OVERFLOW_DATA (type 3) => JOIN to partition's Hobt
-- else LOB_DATA (type 2) => JOIN to the partition ID itself.
ON au.container_id =
CASE au.type
WHEN 2 THEN p.partition_id
ELSE p.hobt_id
END
ORDER BY itab.name, idx.index_id;
G.返回 XML 索引的内部表元数据
SELECT t.name AS parent_table
,t.object_id AS parent_table_id
,it.name AS internal_table_name
,it.object_id AS internal_table_id
,xi.name AS primary_XML_index_name
,xi.index_id as primary_XML_index_id
FROM sys.internal_tables AS it
JOIN sys.tables AS t
ON it.parent_id = t.object_id
JOIN sys.xml_indexes AS xi
ON it.parent_id = xi.object_id
AND it.parent_minor_id = xi.index_id
WHERE it.internal_type_desc = 'XML_INDEX_NODES';
GO
H.返回 Service Broker 队列的内部表元数据
SELECT q.name AS queue_name
,q.object_id AS queue_id
,it.name AS internal_table_name
,it.object_id AS internal_table_id
FROM sys.internal_tables AS it
JOIN sys.service_queues AS q ON it.parent_id = q.object_id
WHERE it.internal_type_desc = 'QUEUE_MESSAGES';
GO
I.返回所有 Service Broker 服务的内部表元数据
SELECT *
FROM tempdb.sys.internal_tables
WHERE internal_type_desc = 'SERVICE_BROKER_MAP';
GO