sys.internal_tables(Transact-SQL)

适用范围:SQL Server

为每个作为内部表的对象返回一行。 内部表由 SQL Server 自动生成,以支持各种功能。 例如,创建主 XML 索引时,SQL Server 会自动创建一个内部表来保存已碎的 XML 文档数据。 内部表出现在每个数据库的架构中 sys ,并具有唯一的系统生成名称,这些名称指示其函数,例如或 xml_index_nodes_2021582240_32001queue_messages_1977058079

列名称 数据类型 说明
继承自 sys.objects 有关此视图继承的列的列表,请参阅 sys.objects
internal_type tinyint 内部表的类型:

3 = QUERY_DISK_STORE_QUERY_HINTS
4 = QUERY_DISK_STORE_QUERY_TEMPLATE_PARAMETERIZATION
6 = QUERY_DISK_STORE_WAIT_STATS
201 = QUEUE_MESSAGES
202 = XML_INDEX_NODES
203 = FULLTEXT_CATALOG_FREELIST
204 = FULLTEXT_INDEX_MAP
205 = QUERY_NOTIFICATION
206 = SERVICE_BROKER_MAP
207 = EXTENDED_INDEXES (如空间索引)
208 = FILESTREAM_TOMBSTONE
209 = CHANGE_TRACKING
210 = TRACKED_COMMITTED_TRANSACTIONS
220 = CONTAINED_FEATURES
225 = FILETABLE_UPDATES
236 = SELECTIVE_XML_INDEX_NODE_TABLE
240 = QUERY_DISK_STORE_QUERY_TEXT
241 = QUERY_DISK_STORE_QUERY
242 = QUERY_DISK_STORE_PLAN
243 = QUERY_DISK_STORE_RUNTIME_STATS
244 = QUERY_DISK_STORE_RUNTIME_STATS_INTERVAL
245 = QUERY_CONTEXT_SETTINGS
internal_type_desc nvarchar(60) 内部表的类型说明:

QUERY_DISK_STORE_QUERY_HINTS
QUERY_DISK_STORE_QUERY_TEMPLATE_PARAMETERIZATION
QUERY_DISK_STORE_WAIT_STATS
QUEUE_MESSAGES
XML_INDEX_NODES
FULLTEXT_CATALOG_FREELIST
FULLTEXT_INDEX_MAP
QUERY_NOTIFICATION
SERVICE_BROKER_MAP
EXTENDED_INDEXES
FILESTREAM_TOMBSTONE
CHANGE_TRACKING
TRACKED_COMMITTED_TRANSACTIONS
CONTAINED_FEATURES
FILETABLE_UPDATES
SELECTIVE_XML_INDEX_NODE_TABLE
QUERY_DISK_STORE_QUERY_TEXT
QUERY_DISK_STORE_QUERY
QUERY_DISK_STORE_PLAN
QUERY_DISK_STORE_RUNTIME_STATS
QUERY_DISK_STORE_RUNTIME_STATS_INTERVAL
QUERY_CONTEXT_SETTINGS
parent_id int 父级的 ID,无论其是否在架构范围内。 否则, 0 如果没有父级。

queue_messages = object_id 队列

xml_index_nodes = object_id 的 XML 索引

fulltext_catalog_freelist = fulltext_catalog_id 全文目录的

fulltext_index_map = object_id 全文索引的

query_notificationservice_broker_map = 0

extended_indexes = object_id 的扩展索引,例如空间索引

object_id 为其启用表跟踪的表的表 = change_tracking
parent_minor_id int 父项的次要 ID。

xml_index_nodes = index_id 的 XML 索引
extended_indexes = index_id 的扩展索引,例如空间索引

0 = queue_messages、、fulltext_catalog_freelistquery_notificationfulltext_index_map、、 service_broker_mapchange_tracking
lob_data_space_id int 对于该表,非零值是存放大型对象 (LOB) 数据的数据空间(文件组或分区方案)的 ID。
filestream_data_space_id int 保留供将来使用。

内部表不包含用户可访问的数据,其架构是固定的且不可更改。 不能在 Transact-SQL 语句中引用内部表名。 例如,不能执行诸如 SELECT * FROM <sys.internal_table_name>. 但是,可以查询目录视图以查看内部表的元数据。

权限

目录视图中仅显示用户拥有的安全对象的元数据,或用户对其拥有某些权限的安全对象的元数据。 有关详细信息,请参阅 Metadata Visibility Configuration

注解

内部表与父实体位于同一文件组。 可以使用 示例 F 中显示的目录查询返回用于行内、行外和大型对象(LOB)数据的页数。

可以使用 sp_spaceused 系统过程返回内部表的空间使用情况数据。 sp_spaceused 通过以下方式报告内部表空间:

  • 当指定队列名称时,将引用与队列关联的基础内部表并报告其存储空间使用情况。

  • 列中包含 index_size XML 索引、空间索引和全文索引的内部表使用的页面。 指定表或索引视图名称时,该对象的 XML 索引、空间索引和全文索引的页面将包含在列中reservedindex_size

示例

下列示例说明如何使用目录视图查询内部表元数据。

答: 显示继承 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
     INNER JOIN sys.columns AS col
         ON itab.object_id = col.object_id
     INNER 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
     INNER 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
     INNER 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
     INNER 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)
     INNER JOIN sys.partitions AS p
         ON p.object_id = idx.object_id
        AND p.index_id = idx.index_id
     INNER 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
     INNER JOIN sys.tables AS t
         ON it.parent_id = t.object_id
     INNER 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
     INNER JOIN sys.service_queues AS q
         ON it.parent_id = q.object_id
WHERE it.internal_type_desc = 'QUEUE_MESSAGES';
GO

一。 返回所有 Service Broker 服务的内部表元数据

SELECT * FROM tempdb.sys.internal_tables
WHERE internal_type_desc = 'SERVICE_BROKER_MAP';
GO