SQL2005分区表功能的知识要点(二):基本概念和术语

定义和术语

要在 SQL Server 2005 中实现分区,必须了解一些新的概念、术语和语法。要理解这些新概念,首先我们看一下与创建和放置操作有关的表结构。在以前的版本中,表通常是一个物理和逻辑概念,但使用 SQL Server 2005 分区表和索引,您在存储表的方式和位置方面就有了多种选择。在 SQL Server 2005 中,可以使用以前版本中的相同语法创建表和索引,作为一个表结构放置到 DEFAULT 文件组或用户定义的文件组中。另外,在 SQL Server 2005 中,还可以根据分区架构创建表和索引。分区架构可以将对象映射到一个或多个文件组。为了确定数据的相应物理位置,分区架构将使用了分区函数。分区函数定义了用来定向行的算法,而架构则将分区与其相应的物理位置(即文件组)相关联。换句话说,表仍然是一个逻辑概念,但与以前的版本相比,表在磁盘上的物理位置有了很大的不同;表还可以拥有架构。

范围分区

范围分区是按照特定和可定制的数据范围定义的表分区。范围分区的边界由开发人员选择,还可以随着数据使用模式的变化而变化。通常,这些范围是根据日期或排序后的数据组进行划分的。

范围分区主要用于数据存档、决策支持(当通常只需要特定范围内的数据时,例如给定的月份或季度)以及组合的 OLTP 和决策支持系统 (DSS)(数据使用在行的生命周期内会发生变化)。SQL Server 2005 分区表和索引的最大优点,尤其是在存档和维护方面,就是可以管理特定范围内的数据。通过范围分区,可以非常快速地存档和替换旧的数据。当数据访问通常用于对大范围数据的决策支持时,最适合使用范围分区。在这种情况下,数据所在的具体位置至关重要,这样才能在需要时只访问相应的分区。另外,由于事务数据已经可用,因此可以轻松快捷地添加数据。范围分区最初定义起来很复杂,因为需要为每个分区定义边界条件。此外,还需要创建一个架构,将每个分区映射到一个或多个文件组。但是,它们通常具有一致的模式,因此,定义后很容易通过编程方式进行维护(参见图 4)。

4 :具有 12 个分区的范围分区表

定义分区键

对表和索引进行分区的第一步就是定义分区的关键数据。分区键必须作为一个列存在于表中,还必须满足一定的条件。分区函数定义键(也称为数据的逻辑分离)所基于的数据类型。函数只定义键,而不定义数据在磁盘上的物理位置。数据的位置由分区架构决定。换句话说,架构将数据映射到一个或多个文件组,文件组将数据映射到特定的文件,文件又将数据映射到磁盘。分区架构通常使用函数来实现此目的:如果函数定义了五个分区,则架构必须使用五个文件组。文件组不需要各不相同;但是,如果拥有多个磁盘(最好是多个 CPU),使用不同的文件组可以获得更好的性能。将架构与表一起使用时,您需要定义用作分区函数的参数的列。

对于范围分区,数据集可以根据逻辑和数据驱动的边界进行划分。实际上,数据分区不可能实现真正的平衡。当以定义分析的特定边界(也称为范围)的方式使用表时,数据的使用即表明范围分区。范围函数的分区键可以只包含一个列,而分区函数可以包含整个域,即使表中可能不存在数据(由于数据完整性/约束)。换句话说,可以为每个分区定义边界,但第一个分区和最后一个分区可能包含最左侧的行(小于最低边界条件的值)和最右侧的行(大于最高边界条件的值)。因此,要将值域限制到特定的数据集,必须将分区与 CHECK 约束结合使用使用 CHECK 约束强制应用业务规则和数据完整性约束,使您可以将数据集限制到特定的范围,而不是不确定的范围。当维护和管理过程中需要定期存档大量数据,当查询访问范围子集内的大量数据时,范围分区是理想的选择。

索引分区

除了对表的数据集进行分区之外,还可以对索引进行分区。使用相同的函数对表及其索引进行分区通常可以优化性能。当索引和表按照相同的顺序使用相同的分区函数和列时,表和索引将对齐。如果在已经分区的表中建立索引,SQL Server 会自动将新索引与该表的分区架构对齐,除非该索引的分区明显不同。当表及其索引对齐后,SQL Server 则可以更有效地将分区移入和移出分区表,因为所有相关的数据和索引都使用相同的算法进行划分。

如果定义表和索引时不仅使用了相同的分区函数,还使用了相同的分区架构,则这些表和索引将被认为是按存储位置对齐。按存储位置对齐的一个优点是,相同边界内的所有数据都位于相同的物理磁盘上。在这种情况下,可以单独在某个时间段内执行备份操作,还可以根据数据的变化在备份频率和备份类型方面改变您的策略。如果连接或收集了相同文件或文件组中的表和索引,则可以发现更多的好处。SQL Server 可以通过在多个分区中并行操作来获益。在按存储位置对齐和多 CPU 的情况下,每个处理器都可以直接处理特定的文件或文件组,而不会与数据访问产生任何冲突,因为所有需要的数据都位于同一个磁盘上。这样,可以并行运行多个进程,而不会相互干扰。

分区的特殊情况:拆分、合并和移动

为了更好地使用分区表,需要了解与分区管理有关的几个新功能和概念。因为分区适用于可以缩放的大型表,所以创建分区函数时选择的分区数随着时间而变化。可以将 ALTER TABLE 语句与新的拆分选项结合使用,在表中添加一个分区。拆分分区时,可以将数据移动到新的分区中;但是为了维护性能,不应移动行。

相反,要删除分区,请先移出数据,然后合并边界点。如果使用范围分区,则通过指明应删除的边界点来发出合并请求。在只需要特定时段的数据并且定期进行数据存档(例如,每月一次)的情况下,您可能希望在当前月份的数据可用时存档部分数据(最早月份的数据)。例如,您可以选择获取一年的数据,而在每个月末移入当前月份,然后移出最早的月份,从而区分当前月份的读/ OLTP 与以前月份的只读数据。如以下方案所述,可以通过一个特殊的操作流使处理更有效。

您保留了一年的只读数据。目前,表中的数据是从 2003 9 月到 2004 8 月的数据。而当前月份 2004 9 月位于另一个数据库中,并为 OLTP 性能而进行了优化。在只读版本的表中,共有 13 个分区:十二个分区包含数据(从 2003 9 月到 2004 8 月),最后一个分区是空的。最后这个分区为空的原因在于,范围分区总是包括整个域,即最左侧和最右侧。如果您打算在滑动窗口方案中管理数据,通常需要有一个可以拆分的空分区,以便放置新数据。在使用 LEFT 边界点定义的分区函数中,空分区逻辑上位于最右侧。将最后一个分区保留为空使您可以拆分空分区(用来存储即将产生的新数据),而且不需要将最后一个分区的行(因为不存在)移动到添加(拆分空分区以存储其他数据块时进行此操作)的新文件组中。这是一个相当复杂的概念,但其核心思想是,所有数据添加或删除操作都应该只是元数据操作。为了确保只进行元数据操作,需要从策略上管理表中不断变化的那个分区。为了确保此分区为空的,您需要使用 CHECK 约束将此数据限定在基础表中。在这种情况下,OrderDate 应该在 2003 9 1 日之后(包括此日),在 2004 9 1 日之前。如果最后定义的边界点是 8 31 11:59:59.997为什么是 997,后文有详细的说明),则分区函数与此约束的组合将使最后一个分区为空。虽然这些只是概念,但重要的是要了解拆分和合并是通过 ALTER PARTITION FUNCTION 进行的,而移动是通过 ALTER TABLE 进行的

 

5 :加载 / 存档数据前的范围分区边界

进入 10 月份后(在 OLTP 数据库中),9 月份的数据应移到分区表中,用于进行分析。移入和移出表的过程非常快,而且准备工作可以在分区表外完成。核心思想是,您可以使用分段表,该表最终将成为分区表中的一个分区。在此过程中,您将表的一个分区移出(参见图 6)到相同文件组内的一个非分区表中。因为相同文件组中已经存在非分区表(这是成功的关键),SQL Server 可以将此移动视为元数据更改。因为只是元数据更改,所以可以在几秒钟内完成,而不需要执行可能需要几小时并在大型表中产生阻塞的删除操作。移出此分区后,您仍然拥有 13 个分区;第一个(最旧的)分区现在是空的,最后一个(最近的,也是空的)分区是需要拆分的。

6 :移出分区

要删除最旧的分区(2003 9 月),请将新的合并选项(如图 7 所示)与 ALTER TABLE 结合使用。有效地合并边界点将删除边界点,从而删除分区。这将加载数据的分区数减少到 n-1(本例中为 12)。如果不需要移动行,合并分区应该是一个非常快的操作(因为要合并的边界点没有数据行)。在本例中,因为第一个分区为空,不需要从第一个分区向第二个分区中移动任何行。如果在第一个分区非空的情况下合并边界点,必须将第一个分区的行移动到第二个分区中,这可能是一个代价非常高昂的操作。但是,在最常见的滑动窗口方案中(空分区与活动分区合并,并且不移动任何行),不需要执行此操作。

7 :合并分区

最后,必须将新表移入分区表要将此操作作为元数据更改来执行,必须在新表中(分区表的边界之外)加载和建立索引。要移入分区,请先将最后一个范围和最近一个空范围拆分为两个分区。另外,还需要更新表的约束以允许新的范围。分区表将再次拥有 13 个分区。在滑动窗口方案中,使用 LEFT 分区函数的最后一个分区将始终为空。

8 :拆分分区

最后,新加载的数据已准备就绪,可以移入第十二个分区,即 2004 9 月。

9 :移入分区

表的结果是:

10 :加载 / 存档数据后的范围分区边界

因为一次只能添加或删除一个分区,所以应重新创建需要添加或删除多个分区的表。要更改为这种新的分区结构,请先创建新的分区表,然后将数据加载到新创建的表中。与每次拆分后重新平衡整个表相比,这种方法更好。此过程是使用新的分区函数和新的分区架构,然后将数据移动到新分区的表中来完成的。要移动数据,请先使用 INSERT newtable SELECT columnlist FROM oldtable 复制数据,然后删除原始表。用户不应在此过程中修改数据,以防数据丢失。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值