为什么 SQL 服务器 Table 值函数列在 sys.indexes 中?

Why are SQL Server Table-Valued Functions listed in sys.indexes?

作为快速背景知识,我的任务是将 tables 和索引从 PRIMARY 文件组移到其他文件组。为了了解一切已经存在的地方,我使用以下查询:

SELECT s.name AS schemaName, o.[name] AS ObjectName, 
i.[name] indexName,
CASE o.[type]
    WHEN 'U' THEN 'User Table'
    WHEN 'S' THEN 'System Table'
    WHEN 'TT' THEN 'Table Type'
    WHEN 'IT' THEN 'Internal Table'
    WHEN 'TF' THEN 'Table Valued Function'
    ELSE o.[type]
    END
AS objectType, 
f.[name] AS [FileGroup]
FROM sys.indexes i
INNER JOIN sys.filegroups f
ON i.data_space_id = f.data_space_id
INNER JOIN sys.all_objects o
ON i.[object_id] = o.[object_id] 
INNER JOIN sys.schemas s
ON s.schema_id = o.schema_id
WHERE i.data_space_id = f.data_space_id
ORDER BY s.name, o.name, i.name
GO

运行 我看到用户定义的 table 值函数也出现在这里,并且列出了 'HEAP' 的类型描述。这是为什么?数据实际上是否以与 table 和索引相同的方式存储?

每个table都有一个物理组织。如果没有用户指定的聚簇索引,则table按堆存储,否则按聚簇索引存储

tables、用户定义的 table 类型和 return table 类型的函数也是如此。您看到的 table 值用户定义函数的索引行反映了函数序言中定义的 anonymous table 类型的组织。

我碰巧有很多用户定义的 table 类型,但只有两个 table 值的用户定义函数...并且看到那些 table 类型也是如此。这些实体的索引似乎都未命名 - 这似乎很合适。

使用用户定义的 table 值函数,您通常会在声明的 table 中累积数据,并在最后 return 它们...所以 SQL必须知道如何在执行期间存储数据。正如预期的那样,用户定义的 内联 table 值函数缺少索引,因为此类实体是使用基础对象索引的有效参数化视图。

编辑:

您可以向用户定义的 table 值函数以及用户定义的 table 类型的声明中定义的匿名 table 添加有限的索引.