为 SQL Server 2008 R2 设置分片以处理大型数据集的模式?

Con*_*ngo 14 sql-server-2008 sql-server

我想在 SQL Server 2008 R2 中处理一个大型数据集(> 10 亿行)。我听说如果你设置“分片”或“水平分区”,它可以更快地处理大型数据集,因为它将表分成多个文件。

您以前使用过分片或水平分区吗?如果是这样,根据您的经验,您能否提出与单个大型表相比取得更好结果的任何模式?

Con*_*lls 23

首先,请注意,在普通商品服务器硬件上使用分区架构可以有效处理 10 亿行。对于此数据量,不需要异乎寻常的无共享架构,但是,您可能会从表分区中获得显着的好处。

分片与水平分区不同,它意味着一种“无共享”架构,大多数版本的 SQL Server 1都不支持这种架构

SQL Server 可以支持水平分区,共享磁盘体系结构足以处理约 10 亿行。

在 SQL Server 中,您创建一个分区函数,根据表上列中的值或值范围选择一个分区,例如

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go
Run Code Online (Sandbox Code Playgroud)

然后创建一个或多个文件组来分配分区。对于大型数据集,这些文件组可以设置在不同的物理卷上。请注意,在几乎所有情况下,直连存储都比 SAN 快得多。在下面的示例中,我们将创建 6 个名为 PartVol1-PartVol6 的文件组。

可以创建一个或多个分区方案,根据分区函数的值将表分区分配给文件组,例如

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go
Run Code Online (Sandbox Code Playgroud)

该方案旨在按会计期间划分。日期也经常用于此目的,尽管可以使用任何键。

您可以在分区方案上创建一个表,就好像它是一个文件组一样,例如

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go
Run Code Online (Sandbox Code Playgroud)

请注意, table 是在分区方案上创建的,而不是在指定的文件组上创建的,并且该子句指定要用作分区键的列。根据分区键,表中的行将分配给分区方案中的文件组之一。

注意:设计分区方案的经验法则是,每个分区的行数应该在数百万的低 10 之间,比如在 10 到 5000 万之间,具体取决于行的宽度。分区所在的磁盘卷应该足够快,可以在几秒钟内扫描至少一个分区。

分区、分片和无共享系统

一些术语似乎是为了消除有关此主题的一些讨论的歧义。

  • “无共享”系统是一个并行系统,其中节点没有共享的 SAN 存储,但使用节点本地的存储。这种架构的典型例子是 Teradata。无共享系统可以很好地扩展到非常大的数据集,因为它们没有中央 I/O 瓶颈。I/O 吞吐量随着系统中节点的数量而扩展。

  • “共享磁盘”系统是一个或多个数据库服务器共享单个磁盘存储子系统的系统。数据库可以是具有本地存储或连接到 SAN 的单个服务器,也可以是连接到共享 SAN 的服务器集群。这种类型的系统受到存储子系统可用吞吐量的限制。

  • “分片”是一个术语,用于描述在无共享架构中的多个物理服务器之间拆分数据库。各种平台或多或少会支持分片数据库。在 Teradata 圈子中,没有使用该术语,因为 Teradata 向客户端提供透明的单个系统映像,即使物理架构是无共享类型。

    旧版本的 SQL Server 对通过分布式分区视图进行分片的支持有限。Microsoft 现在制作了一个 SQL Server 2008 R2 版本,该版本支持具有单个系统映像的无共享架构,但该版本仅适用于 OEM,并且只能以硬件捆绑包的形式购买。

对于 10 亿行

对于 10 亿行(除非个别行非常宽),无共享或分片架构在过度杀伤领域中很舒服。如果具有足够快的磁盘子系统,则可以在具有合理规格的单个服务器上处理此类卷。

就性能价格而言,本地直连磁盘是迄今为止最具成本效益的。单个 SAS RAID 控制器可以占用多个阵列,并且可以在服务器中安装多个控制器。根据配置,现代 24-25 插槽 SAS 阵列可以承受数千 IOPS 或 1GB+/秒的流传输性能;具有多个 PCI-e 总线和多个控制器的服务器理论上可以处理更多。

使用商用服务器硬件和这种类型的直连存储可以轻松且廉价地实现使用 10 亿行数据库所需的性能类型。也可以使用 SAN,但您可能需要多个 SAN 控制器才能获得相同的性能,而且硬件可能要贵一个数量级。

作为一般建议,除非您需要非常好的正常运行时间,否则对具有大量 I/O 要求的应用程序使用直连存储。在现代数据中心运营中,配置和变更控制错误是导致计划外停机的更大来源,而不是硬件故障。

如果您拥有大量应用程序组合,SAN 可以为您提供更易于管理的存储平台,因为它们为您提供了一系列集中存储管理设施。然而,这需要付出高昂的代价,而且从基于 SAN 的基础设施中获得高性能既困难又昂贵。

1 Microsoft 确实制作了 SQL Server 的并行版本,但只能通过与硬件捆绑的 OEM 渠道获得。现成的版本不支持此功能。

  • 哇 - 惊人的答案,我认为这就是让这个项目正常运行所需的所有提示。 (3认同)