创建分区的表和索引

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例中创建 已分区表或索引。 已分区表和已分区索引的数据水平分为若干单元,可分布于一个数据库中的多个文件组中,或存储于单个文件组中。 分区可以使大型表和索引更易于管理并且更灵活。

创建已分区表或索引通常涉及三个或四个操作:

  1. (可选)创建一个文件组或多个文件组以及相应的文件,以用于放置分区方案所指定的分区。 在多个文件组上放置分区的主要原因,是为了确保可在文件组上独立执行备份和还原操作。 如果不是必须如此操作,则可以选择使用现有文件组(例如 PRIMARY)或具有相关数据文件的新文件组,将所有分区分配给单个文件组。 几乎在所有情况下,无论是否使用多个文件组,都可实现所有分区优势

  2. 创建一个将根据指定列的值将表或索引的各行映射到分区的 分区函数。 可以使用单个分区函数对多个对象进行分区。

  3. 创建一个将已分区表或已分区索引的分区映射到一个文件组或多个文件组的 分区方案。 可以使用单个分区函数对多个对象进行分区。

  4. 创建或更改表或索引,并将分区方案指定为存储位置,以及用作分区依据列的列。

注意

Azure SQL 数据库完全支持分区。 由于 Azure SQL 数据库中仅支持 PRIMARY 文件组,因此所有分区都必须放置在 PRIMARY 文件组上。

Azure Synapse Analytics 的专用 SQL 池中也提供了表分区功能,但语法存在一些差异。 要了解详细信息,请参阅 在专用 SQL 池中对表分区

权限

创建已分区表需要在数据库中具有 CREATE TABLE 权限,对在其中创建表的架构具有 ALTER 权限。 创建已分区索引需要对要创建索引的表或视图具有 ALTER 权限。 创建已分区表或索引需要以下附加权限之一:

  • ALTER ANY DATASPACE 权限。 默认情况下,此权限授予 sysadmin 固定服务器角色和 db_ownerdb_ddladmin 固定数据库角色的成员。

  • 对在其中创建分区函数和分区方案的数据库的 CONTROL 或 ALTER 权限。

  • 对在其中创建分区函数和分区方案的数据库所在服务器的 CONTROL SERVER 或 ALTER ANY DATABASE 权限。

使用 Transact-SQL 在一个文件组上创建已分区表

如果不需要单独对文件组执行备份和还原操作,则使用单个文件组对表进行分区可随着时间的推移简化对已分区表的管理。

此示例适用于不支持添加文件和文件组的 Azure SQL 数据库。 Azure SQL 数据库通过在 PRIMARY 文件组中创建分区来支持表分区。 对于 SQL Server 和 Azure SQL 托管实例,可能需要根据文件组和文件管理实践指定用户创建的文件组。

本示例演示了使用 Transact-SQL 在 SQL Server Management Studio (SSMS) 中创建已分区表,并将所有分区分配给 PRIMARY 文件组的过程。 示例:

  • 使用 datetime2 数据类型创建一个名为 myRangePF1 并具有三个边界值的 RANGE RIGHT 分区函数。 三个边界值将导致一个具有四个分区的已分区表。
  • 创建一个名为 myRangePS1 的分区方案,该方案使用 ALL TO 语法将 myRangePF1 分区函数中的所有分区分配给 PRIMARY 文件组。
  • myRangePS1 分区方案中创建一个名为 PartitionTable 的表,并指定名为 col1 的列为分区依据列。
  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 该示例会创建一个分区功能和一个分区方案。 将创建一个新表,该表具有指定为存储位置的分区方案。

CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
    AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
GO  

CREATE PARTITION SCHEME myRangePS1  
    AS PARTITION myRangePF1  
    ALL TO ('PRIMARY') ;  
GO  

CREATE TABLE dbo.PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
    ON myRangePS1 (col1) ;  
GO

使用 Transact-SQL 在多个文件组上创建已分区表

按照本节中的步骤,使用 Transact-SQL 在 SSMS 中创建一个或多个文件组、相应的文件和一个已分区表。

SQL Server 和 Azure SQL 托管实例都支持创建文件组和文件。 Azure SQL 托管实例将为添加的所有数据库文件自动配置路径,因此Azure SQL 托管实例中的 ALTER DATABASE ADD FILE 命令不允许使用 FILENAME 参数。 Azure SQL 数据库仅支持在 PRIMARY 文件组中创建已分区表。 有关适用于 Azure SQL 数据库的示例代码,请参阅 使用 Transact-SQL 在一个文件组上创建已分区表

使用一个空数据库运行以下示例。 示例:

  • 将四个新文件组添加到一个数据库。
  • 将一个文件添加到每个文件组。
  • 创建一个名为 myRangePF1RANGE RIGHT 分区函数,该函数使用三个边界值将一个表分为四个分区。
  • 创建一个名为 myRangePS1 的分区方案,该分区方案会将 myRangePF1 应用到四个新文件组。
  • 创建一个名为 PartitionTable 已分区表,该已分区表将使用 myRangePS1col1 进行分区。
  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准工具栏上,选择“新建查询”

  3. 此示例将创建并使用一个新数据库。 然后将创建若干新文件组、一个分区函数和一个分区方案。 将创建一个新表,该表具有指定为存储位置的分区方案。 复制以下示例并将其粘贴到查询窗口中。

    如果使用托管实例,请从 ALTER DATABASE ADD FILE 命令中移除 FILENAME 参数和相关值。 托管实例将自动确定文件路径。

    如果使用 SQL Server 实例,请将 FILENAME 参数的值自定义为适合实例的位置。

    要使用现有数据库,请移除 CREATE DATABASE 命令并将 USE 语句更改为相应的数据库名称。

    选择“执行”

    CREATE DATABASE PartitionTest;
    GO
    
    USE PartitionTest;
    GO
    
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test1fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test4fg;   
    
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest1,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest1.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test1fg;  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest2,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest2.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest3,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest3.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest4,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest4.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test4fg;  
    GO  
    
    CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
        AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
    GO  
    
    CREATE PARTITION SCHEME myRangePS1  
        AS PARTITION myRangePF1  
        TO (test1fg, test2fg, test3fg, test4fg) ;  
    GO  
    
    CREATE TABLE PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
        ON myRangePS1 (col1) ;  
    GO  
    

使用 SSMS 对表进行分区

(可选)按照本节中的步骤创建文件组和相应的文件,然后使用 SQL Server Management Studio 中的“创建分区向导”创建已分区表或对现有表进行分区。 SSMS 中提供的“创建分区向导”适用于 SQL Server 和 Azure SQL 托管实例。 对于 Azure SQL 数据库,请参阅 使用 Transact-SQL 在一个文件组上创建已分区表

创建新文件组(可选)

如果要将已分区表放置在一个或多个新 文件组 上,请按照本节中的步骤操作。 SQL Server 和 Azure SQL 托管实例都支持创建文件组和文件。 对于 Azure SQL 托管实例,系统会自动配置所创建任何文件的路径。

  1. 在对象资源管理器中,右键单击要创建已分区表的数据库,然后选择“属性”

  2. 在“数据库属性 - database_name”对话框中“选择页”下,选择“文件组”

  3. 在“行”下选择“添加”。 在新行中,输入文件组名称。

    警告

    如果指定多个文件组,则在创建分区时,除了为边界值指定的文件组数外,还必须始终具有一个额外的文件组。

  4. 继续添加行,直到创建了已分区表的所有文件组。

  5. 选择“确定”

  6. “选择页”下,选择 “文件”

  7. 在“行”下选择“添加”。 在新行中,输入文件名并选择文件组。

  8. 继续添加行,直到为每个文件组至少创建了一个文件。

创建已分区表

  1. (可选)展开“表”文件夹,并按常规方式创建一个表。 有关详细信息,请参阅 创建表(数据库引擎)。 也可以在下一步中指定现有的表。

  2. 右键单击要分区的表,指向“存储”,然后选择“创建分区…”

  3. 在“创建分区向导”的“欢迎使用创建分区向导”页上,选择“下一步”

  4. “选择分区列” 页的 “可用分区列” 网格中,选择要对表分区的列。 “可用分区列” 网格只显示其数据类型可以用于对数据进行分区的列。 如果选择将计算列作为分区依据列,必须将该列创建为持久列。

    可供选择的分区列和值范围主要由数据按逻辑方式可分组的范围所决定。 例如,您可以选择按一年的月份数或季度数将数据分成逻辑组。 您计划对数据进行的查询将确定此逻辑组对于管理表分区是否足够。 所有数据类型都可有效用作分区列,除了 textntextimagexmltimestampvarchar(max)nvarchar(max)varbinary(max)、别名数据类型或 CLR 用户定义的数据类型。

    此页还提供以下附加选项:

    将此表与选定的已分区表并置
    允许您选择一个已分区表,其中包含根据分区列要与此表相联接的相关数据。 对于其分区已按分区列联接的表,通常可以更有效地进行查询。

    将非唯一索引和唯一索引的存储空间调整为与索引分区列一致
    将已分区表的所有索引调整为与同一分区方案一致。 当表及其索引对齐时,由于数据是使用同一方式进行分区的,因此可以更有效地在已分区表中移入和移出分区。

    选择分区依据列和任意其他选项后,选择“下一步”

  5. 在“选择分区函数”页的“选择分区函数”下,选择“新建分区函数”或“现有分区函数”。 如果选择 “新建分区函数”,则输入函数的名称。 如果选择“现有分区函数”,则从列表中选择要使用的函数名称。 如果数据库中没有其他分区函数, “现有分区函数” 选项将不可用。

    完成此页后,选择“下一步”。

  6. 在“选择分区方案”页的“选择分区方案”下,选择“新建分区方案”或“现有分区方案”。 如果选择 “新建分区方案”,则输入方案的名称。 如果选择“现有分区方案”,则从列表中选择要使用的方案名称。 如果数据库中没有其他分区方案, “现有分区方案” 选项将不可用。

    完成此页后,选择“下一步”。

  7. 在“映射分区”页上的“范围”下,选择“左边界”或“右边界”。 “左边界”用于指定分区的上边界值。 “右边界”用于指定分区的下边界值。 详细了解分区函数中的左右范围。

    指定多个边界点时,除了向文件组分配边界值的行外,还必须始终输入一个额外的行。

    “选择文件组并指定边界值” 网格的 “文件组”下,选择要对数据进行分区的文件组。 在 “边界”下,输入每个文件组的边界值。 要将多个分区或所有分区分配给同一个文件组,请为每个行选择相同的文件组名称。 如果在单行上选择一个文件组,并且边界值留空,则分区函数会使用分区函数名称将整个表或索引映射到单个分区。

    此页还提供以下附加选项:

    设置边界…
    打开 “设置边界值” 对话框可以为分区选择所需的边界值和日期范围。 仅在您选择了包含以下数据类型之一的分区列时,此选项才可用: datedatetimesmalldatetimedatetime2datetimeoffset

    预计存储空间
    估计为分区指定的每个文件组的存储空间的行计数、所需空间和可用空间。 这些值将以只读值形式显示在网格中。

    “设置边界值” 对话框允许包含以下附加选项:

    开始日期
    选择分区范围值的开始日期。

    结束日期
    选择分区范围值的结束日期。 如果在“映射分区”页上选择了“左边界”,此日期将是每个文件组/分区的最后一个值。 如果在“映射分区”页上选择了“右边界”,此日期将是倒数第二个文件组中的第一个值。

    日期范围
    为每个分区选择所需的日期粒度或范围值增量。

    完成此页后,选择“下一步”。

  8. “选择输出选项” 页上,指定要如何完成已分区表。 选择 “创建脚本” 可以基于向导中的前一页创建 SQL 脚本。 选择 “立即运行” 可以在完成向导中的其余页后创建新的已分区表。 选择 “计划” 可以在将来的预定时间创建新的已分区表。

    如果选择 “创建脚本”“脚本选项” 下的以下选项将可用:

    将脚本保存到文件
    将脚本生成为 .sql 文件。 在“文件名”框中输入文件名和位置,或选择“浏览”以打开“脚本文件位置”对话框 。 从 “另存为” 选择 “Unicode 文本”“ANSI 文本”

    将脚本保存到剪贴板
    将脚本保存到剪贴板。

    将脚本保存到“新建查询”窗口
    将脚本生成到新的查询编辑器窗口。 这是默认选项。

    如果选择“计划”,则选择“更改计划” 。

    1. 在“新建作业计划”对话框的“名称”框中,输入作业计划的名称 。

    2. “计划类型” 列表中选择计划类型:

      • SQL Server 代理启动时自动启动

      • CPU 空闲时启动

      • 重复执行。 如果新的已分区表定期使用新信息更新,请选择此选项。

      • 执行一次。 这是默认选项。

    3. 选择或清除 “已启用” 复选框以启用或禁用计划。

    4. 如果选择 “重复执行”

      1. “频率” 下的 “执行” 列表中,指定执行的频率:

        • 如果选择 “每天” ,请在 “执行间隔” 框中输入重复作业计划的频率(天)。

        • 如果选择 “每周” ,请在 “执行间隔” 框中输入重复作业计划的频率(周)。 选择运行作业计划的一周中的某天或某些天。

        • 如果选择 “每月” ,可以选择 “天”“特定日期”

          • 如果选择 “天” ,请输入要运行作业计划的当月日期和作业计划的重复频率(月)。 例如,如果要每隔一个月在当月的 15 日运行计划作业,请选择“天”,在第一个框中输入“15”,在第二个框中输入“2”。 第二个框中允许的最大数字是“99”。

          • 如果选择 “特定日期” ,请选择要运行作业计划的当月内一周的特定一天和作业计划的重复频率(月)。 例如,如果要每隔一个月在当月的最后一个工作日运行作业计划,请选择“天”,从第一个列表中选择“最后一周”,从第二个列表中选择“工作日”,然后在最后一个框中输入“2” 。 还可以从前两个列表中选择“第一周”、“第二周”、“第三周”或“第四周”以及特定工作日(例如:星期日或星期三)。 最后一个框中允许的最大数字是“99”。

      2. “每天频率” 下,指定作业计划运行的当天作业计划的重复频率。

        • 如果选择 “执行一次,时间为:” ,请在 “执行一次,时间为:” 框中输入运行作业计划的当天的特定时间。 输入当天的小时、分钟和秒以及 AM 或 PM。

        • 如果选择 “执行间隔” ,请在 “频率” 下指定所选日运行作业计划的频率。 例如,如果要在运行作业计划的当天每隔 2 小时重复一次,请选择“执行间隔”,在第一个框中输入“2”,然后从列表中选择“小时” 。 从此列表中还可以选择“分钟”和“秒”。 第一个框中允许的最大数字是“100”。

          “开始时间” 框中,输入开始运行作业计划的时间。 在 “结束时间” 框中,输入停止重复作业计划的时间。 输入当天的小时、分钟和秒以及 AM 或 PM。

      3. “持续时间” 下的 “开始日期” 中,输入希望作业计划开始运行的日期。 选择 “结束日期”“无结束日期” 以指示作业计划应在何时停止运行。 如果选择 “结束日期” ,输入希望作业计划停止运行的日期。

    5. 如果选择“执行一次”,请在“执行一次”下的“日期”框中输入将运行作业计划的日期。 在 “时间” 框中,输入将运行作业计划的时间。 输入当天的小时、分钟和秒以及 AM 或 PM。

    6. “摘要” 下的 “说明” 中,验证所有作业计划设置均正确。

    7. 选择“确定”。

    完成此页后,选择“下一步”。

  9. “检查摘要” 页的 “检查所做选择”下,展开所有可用选项以验证所有分区设置是正确的。 如果一切正常,请选择“完成”。

  10. “创建分区向导进度” 页上,监视有关创建分区向导的操作的状态信息。 根据在向导中选择的选项,“进度”页可能会包含一个操作或多个操作。 最上面的方框显示向导的总体状态和向导已接收到的状态、错误和警告消息数。

    “创建分区向导进度” 页上提供以下选项:

    详细信息
    提供向导执行的操作所返回的操作、状态和所有消息。

    Action
    指定每个操作的类型和名称。

    Status
    指示向导操作作为一个整体返回的值是“成功”还是“失败”。

    消息
    提供从该进程中返回的任何错误或警告消息。

    Report
    创建包含创建分区向导结果的报告。 这些选项是 “查看报告”“将报告保存到文件”“将报告复制到剪贴板”“将报告作为电子邮件发送”

    查看报告
    打开“查看报告”对话框,其中包含关于创建分区向导进度的文本报告。

    将报告保存到文件
    打开“将报告另存为”对话框。

    将报告复制到剪贴板
    将向导的进度报告结果复制到剪贴板。

    “将报告作为电子邮件发送”
    将向导的进度报告结果复制到电子邮件。

    完成后,选择“关闭”。

“创建分区向导”将创建分区函数和方案,然后将分区应用于指定的表。 若要验证表分区,请在对象资源管理器中,右键单击表,然后选择“属性”。 选择“存储”页。 该页面将显示分区函数和方案的名称以及分区数目之类的信息。

查询已分区表和索引的元数据

可以查询元数据以确定表是否已分区、已分区表的边界点、已分区表的分区依据列、每个分区中的行数,以及分区上是否实现了数据压缩

确定是否已将表分区

如果表 PartitionTable 已经分区,或者表的任何非聚集索引已经分区,则以下查询将返回一行或多行。 如果表未分区,并且未对表中的非聚集索引进行分区,则不会返回任何行。

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, *   
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
JOIN sys.partition_schemes ps   
    ON i.data_space_id = ps.data_space_id   
WHERE t.name = 'PartitionTable';   
GO  

确定已分区表的边界值

以下查询对于 PartitionTable 表中的每个分区返回边界值。

该查询使用 sys.indexes 中的 type 列,以仅返回表聚集索引的信息;如果表属于 ,则返回基表的信息。 要在查询结果中包含任何已分区的非聚集索引,请从查询中移除或取消注释 AND i.type <= 1

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number, p.partition_id, i.data_space_id, f.function_id, f.type_desc, 
    r.boundary_id, r.value AS BoundaryValue   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE 
    t.name = 'PartitionTable' 
    AND i.type <= 1  
ORDER BY SchemaName, t.name, i.name, p.partition_number;  

为已分区表的确定分区列

以下查询返回表 PartitionTable 的分区列的名称。

该查询使用 sys.indexes 中的 type 列,以仅返回表聚集索引的信息;如果表属于 ,则返回基表的信息。 要在查询结果中包含任何已分区的非聚集索引,请从查询中移除或取消注释 AND i.type <= 1


SELECT   
    t.[object_id] AS ObjectID
    , SCHEMA_NAME(t.schema_id) AS SchemaName
    , t.name AS TableName   
    , ic.column_id AS PartitioningColumnID   
    , c.name AS PartitioningColumnName
    , i.name as IndexName
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
    AND i.[type] <= 1 -- clustered index or a heap   
JOIN sys.partition_schemes AS ps   
    ON ps.data_space_id = i.data_space_id   
JOIN sys.index_columns AS ic   
    ON ic.[object_id] = i.[object_id]   
    AND ic.index_id = i.index_id   
    AND ic.partition_ordinal >= 1 -- because 0 = non-partitioning column   
JOIN sys.columns AS c   
    ON t.[object_id] = c.[object_id]   
    AND ic.column_id = c.column_id   
WHERE t.name = 'PartitionTable';   
GO  

确定描述每个分区中可能的值范围的行

以下查询将按表 PartitionTable 的分区返回行,以及使用中的分区方案的比较运算符说明。 Kalen Delaney 提供的原始查询。

该查询使用 sys.indexes 中的 type 列,以仅返回表聚集索引的信息;如果表属于 ,则返回基表的信息。 要在查询结果中包含任何已分区的非聚集索引,请从查询中移除或取消注释 AND i.type <= 1

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number AS PartitionNumber, f.name AS PartitionFunctionName, p.rows AS Rows, rv.value AS BoundaryValue, 
CASE WHEN ISNULL(rv.value, rv2.value) IS NULL THEN 'N/A' 
ELSE
    CASE WHEN f.boundary_value_on_right = 0 AND rv2.value IS NULL THEN '>=' 
        WHEN f.boundary_value_on_right = 0 THEN '>' 
        ELSE '>=' 
    END + ' ' + ISNULL(CONVERT(varchar(64), rv2.value), 'Min Value') + ' ' + 
        CASE f.boundary_value_on_right WHEN 1 THEN 'and <' 
                ELSE 'and <=' END 
        + ' ' + ISNULL(CONVERT(varchar(64), rv.value), 'Max Value') 
END AS TextComparison
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
LEFT JOIN sys.partition_range_values AS rv
    ON f.function_id = rv.function_id
    AND p.partition_number = rv.boundary_id     
LEFT JOIN sys.partition_range_values AS rv2
    ON f.function_id = rv2.function_id
    AND p.partition_number - 1= rv2.boundary_id
WHERE 
    t.name = 'PartitionTable'
    AND i.type <= 1 
ORDER BY t.name, p.partition_number;

TextComparison 列根据 分区函数 的定义描述每个分区中可能的值范围。 查询示例结果的视图如下:

架构名称 TableName IndexName PartitionNumber PartitionFunctionName rows BoundaryValue TextComparison
dbo PartitionTable PK_PartitionTable 1 PFTest 0 2022-03-01 00:00:00.000 >= 最小值且 < 2022 年 3 月 1 日午夜 12:00
dbo PartitionTable PK_PartitionTable 2 PFTest 2 2022-04-01 00:00:00.000 >= 2022 年 3 月 1 日午夜 12:00 且 < 2022 年 4 月 1 日午夜 12:00
dbo PartitionTable PK_PartitionTable 3 PFTest 1 2022-05-01 00:00:00.000 >= 2022 年 4 月 1 日午夜 12:00 和 < 2022 年 5 月 1 日午夜 12:00
dbo PartitionTable PK_PartitionTable 4 PFTest 0 2022-06-01 00:00:00.000 >= 2022 年 5 月 1 日午夜 12:00 和 < 2022 年 6 月 1 日午夜 12:00
dbo PartitionTable PK_PartitionTable 5 PFTest 1 2022-07-01 00:00:00.000 >= 2022 年 6 月 1 日午夜 12:00 和 < 2022 年 7 月 1 日午夜 12:00
dbo PartitionTable PK_PartitionTable 6 PFTest 0 Null >= 2022 年 7 月 1 日午夜 12:00 且 < 最大值

限制

有关分区限制和性能注意事项,请参阅 限制

后续步骤

通过以下文章详细了解相关概念: