我想在 SQL Server 2008 R2 中处理一个大型数据集(> 10 亿行)。我听说如果您设置“分片”或“水平分区”,它可以更快地处理大型数据集,因为它将表分成多个文件。
您以前使用过分片或水平分区吗?如果是这样,您能否建议任何模式,根据您的经验,与单个大型表相比,可以实现更好的结果?
我想在 SQL Server 2008 R2 中处理一个大型数据集(> 10 亿行)。我听说如果您设置“分片”或“水平分区”,它可以更快地处理大型数据集,因为它将表分成多个文件。
您以前使用过分片或水平分区吗?如果是这样,您能否建议任何模式,根据您的经验,与单个大型表相比,可以实现更好的结果?
首先,请注意,在普通商品服务器硬件上使用分区架构可以有效处理 10 亿行。对于这个数据卷,Exotic shared nothing 架构不是必需的,但是,您可能会从表分区中获得显着的好处。
分片与水平分区不同,它意味着“无共享”架构,大多数版本的 SQL Server 1都不支持
SQL Server 可以支持水平分区,共享磁盘体系结构足以容纳约 10 亿行。
在 SQL Server 中,您创建一个分区函数,根据表上列中的值或值范围选择分区,例如
然后创建一个或多个文件组来分配分区。对于大型数据集,这些文件组可以设置在不同的物理卷上。请注意,在几乎所有情况下,直接附加存储都比 SAN 快得多。在下面的示例中,我们将创建 6 个名为 PartVol1-PartVol6 的文件组。
可以创建一个或多个分区方案来根据分区函数的值将表分区分配给文件组,例如
该方案旨在按会计期间进行分区。尽管可以使用任何键,但日期也经常用于此目的。
您可以在分区方案上创建一个表,就好像它是一个文件组一样,例如
请注意,表是在分区方案而不是指定的文件组上创建的,并且子句指定要用作分区键的列。根据分区键,表中的行将分配给分区方案中的文件组之一。
注意:设计分区方案的一个经验法则是,每个分区的行数应该在数百万的低位,比如在 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 渠道获得。现成的版本不支持此功能。