当前位置:首页 > 问答 > 正文

怎么在SQL Server里搞定分区函数创建那些事儿,步骤和注意点分享

想在 SQL Server 里搞定分区函数创建这件事,说白了就是把一张很大的表,按照你设定的规则,切成几小块来存放和管理,这样做的好处很多,比如查询时如果只涉及某一块数据,速度会快很多;维护起来也更方便,可以只对某个分区做备份或索引重建,不用动整张表,整个过程的核心就是三个东西:分区函数、分区方案和创建表或索引时应用这个方案,下面我一步步说清楚,并把要注意的关键点也一起讲了。

第一步:想清楚按什么分(分区键和分区函数)

这是最基础也是最重要的一步,你得先决定表里的数据按照哪个列来分割,这个列就是“分区键”,常用的分区键是日期时间列(比如订单日期、日志创建时间)或者数字列(比如年份、地区编号)。

选好分区键后,就要创建“分区函数”,这个函数的作用就是定义一条“分界线”,告诉 SQL Server:什么样的数据该放进哪个分区里,创建分区函数的语法大概是这样的:

CREATE PARTITION FUNCTION 你的分区函数名 (数据类型) AS RANGE [LEFT | RIGHT] FOR VALUES (边界值1, 边界值2, ...);

这里有几个关键点需要注意(根据微软官方文档关于分区函数创建的说明):

  1. 数据类型:必须和你选的分区键的数据类型完全匹配,比如分区键是 datetime,这里就不能写 int
  2. RANGE LEFT 还是 RANGE RIGHT:这是最容易搞混的地方,但它决定了边界值本身属于哪个分区。
    • RANGE LEFT:意思是“边界值归属于左边的分区”(即小于等于边界值的放一起)。FOR VALUES (20230101, 20240101),使用 LEFT 的话,所有小于等于 2023-01-01 的数据进第1分区,大于 2023-01-01 且小于等于 2024-01-01 的进第2分区,大于 2024-01-01 的进第3分区。
    • RANGE RIGHT:意思是“边界值归属于右边的分区”(即小于边界值的放一起),同样用上面的边界值,使用 RIGHT 的话,所有小于 2023-01-01 的数据进第1分区,大于等于 2023-01-01 且小于 2024-01-01 的进第2分区,大于等于 2024-01-01 的进第3分区。
    • 建议:通常按日期分区时,用 RANGE RIGHT 会更直观,因为 2024-01-01 自然属于2024年这个分区,而不是2023年。
  3. 边界值:这些值定义了分区的具体切割点,边界值的数量决定了分区总数是 n+1(n个边界值会产生n+1个分区),边界值必须能隐式转换为分区键的数据类型,并且要按升序排列。

第二步:把分区映射到文件组(分区方案)

光有分区的规则还不行,你得告诉 SQL Server 这些切好的数据块分别放在硬盘的什么地方,这就是“分区方案”的工作,文件组是数据库里管理一组数据文件的逻辑单元,你可以把不同的分区放在不同的文件组,甚至不同的物理硬盘上,这样可以提高I/O性能。

怎么在SQL Server里搞定分区函数创建那些事儿,步骤和注意点分享

创建分区方案的语法是:

CREATE PARTITION SCHEME 你的分区方案名 AS PARTITION 你的分区函数名 TO ([文件组1], [文件组2], ..., [PRIMARY]);

这里的关键点和注意事项(根据微软官方文档关于分区方案创建的说明):

  1. 必须指定文件组:你需要为每一个分区指定一个存放的文件组,也就是说,如果你有4个分区(3个边界值),你就得在 TO 后面列出4个文件组。
  2. 文件组必须已存在:在创建分区方案之前,你提到的所有文件组(除了 PRIMARY)都应该已经创建好了。
  3. 使用 PRIMARY:你可以使用默认的 PRIMARY 文件组,但这不是最佳实践,为了更好的管理和性能,建议为分区创建专用的文件组。
  4. 最后一个文件组的重用:一个常见的技巧是,如果所有分区都想使用相同的存储配置,你可以只为第一个分区指定一个文件组,然后使用 ALL TO ([文件组名]) 语法,但更灵活的做法还是为每个分区指定文件组。
  5. 预分配足够的文件组:分区方案一旦创建,文件组的映射关系就固定了,如果你以后想添加新的分区(比如按月分区,每个月一个新分区),你必须确保分区方案中已经预分配了足够多的文件组,或者使用 ALTER PARTITION SCHEME 来添加下一个要用的文件组,提前规划好非常重要。

第三步:创建表或索引时应用分区

怎么在SQL Server里搞定分区函数创建那些事儿,步骤和注意点分享

规则和地图都准备好了,最后一步就是建表(或者对现有表创建分区索引)的时候,告诉它使用我们刚才建好的分区方案。

创建新表的语法如下:

CREATE TABLE 你的表名 ( ... 列定义 ... ) ON 你的分区方案名 (分区键列名);

对现有表进行分区,通常是通过在那个分区键列上创建一个聚集索引,并指定分区方案来实现,因为一张表的数据存储方式是由其聚集索引决定的。

重要的后续操作和注意事项

  1. 分区切换(Partition Switching):这是分区技术最强大的功能之一,它允许你几乎瞬时地将一个分区中的数据移出到一个普通表(归档表),或者将一个普通表的数据移入到一个空的分区,这个操作是元数据级别的,非常快,因为它不实际移动数据,这对于数据归档和加载非常有用(根据微软官方文档关于分区表数据管理的说明)。
  2. $PARTITION 函数:这是一个内置函数,你可以用它来查询某一行数据属于哪个分区号,SELECT $PARTITION.你的分区函数名(‘某个具体值’),这在管理和排查问题时非常有用。
  3. 索引的对齐:你可以在分区表上创建非聚集索引,如果非聚集索引也使用相同的分区方案和分区键,这就叫“索引对齐”,对齐的索引可以同样受益于分区切换等操作,如果不对齐,管理起来会复杂很多。
  4. 规划是关键:分区不是创建完就一劳永逸的,特别是按时间范围分区,你需要有一个定期维护的任务,比如每月初自动添加新的分区,以容纳新月份的数据,如果规划不当,新数据可能会因为找不到对应的分区而无法插入。
  5. 不是万灵药:分区主要解决的是管理大型表和提升特定查询(特别是范围查询)性能的问题,它并不能解决所有性能问题,比如在分区键上进行模糊查询或者在不相关的列上做连接查询,可能依然很慢,表的设计和索引的创建仍然至关重要。

搞定 SQL Server 分区的步骤就是:选好分区键 -> 创建分区函数(定规则) -> 创建分区方案(分地盘) -> 建表或索引时应用方案,整个过程的核心在于前期对业务数据特点和未来增长的充分理解与规划,否则后期调整会非常麻烦。