对于使用超大数据集工作的开发者来说,水平的分区和分片都是很重要的工具。尽管当前的数据库服务器,像 SQL Server,能够支持上 TB 的 RAM 以及上百个处理器,但是在单个表中所能够存储的数据量还是有限的。这正是水平分区起作用的地方。水平分区既可以在单个服务器中完成,也可以跨多个服务器完成,后者经常指的就是分片(sharding)。
在 SQL Server 2005 中,微软增加了为每个表创建最多 1000 个分区的能力。这种分区会位于单独的服务器中,我们可以使用它把单个的逻辑表分布在多个文件组中。这会立刻提高 I/O 能力,如果有设计良好的 schema,那么它还能够大大提升其它方面的性能。不幸的是这种特性也有很多缺点。因为它仅限于单个机器,所以想要让它有效率,你需要强大的数据库服务器和存储阵列网络。除了硬件成本之外,水平分区特性和需要企业版或者数据中心版本的许可,这两个版本对于每个处理器的零售价分别是 27,495 和 54,990 美元。
对此感兴趣的读者可以阅读白皮书《使用SQL Server 2008 的分区表和索引策略》。这部白皮书很长,但是对于想要在SQL Server 中使用这种特性的人来说,还是应该阅读的。当然,在 DB2 、 Oracle 、 Sybase Adapter Server 和 MySQL 中也都能找到类似的特性。
在 SQL Server 上暂时还无法实现跨多台服务器的完全数据分区。尽管在存储过程或者服务层代码中我们肯定可以实现必要的逻辑,但这样特别的方法,对于想要关注于产品真正需求的开发者来说,可能无法让他们满意。我们也可以使用 SQL Server 的分布式分区视图,但是规则非常麻烦。例如,我们无法针对分区的列使用标识列或者时间戳,而分区列需要是主键的组成部分。
SQL Azure 承诺,它会通过所谓的“联合(federation)”提供分区功能。乍看起来,这似乎是很大的改善,但即便是 SQL Azure 中的联合的预览版也需要很久之后才能够发布。
同时,希望继续使用 SQL Server 的人可以试着转向第三方的工具。其中一种选择是最近发布的 Enzo SQL Shard 库。 Blue Syntax 的这个开源的项目基于.NET 的任务并行程序库实现,承诺为 SQL Server 和 SQL Azure 提供分片的特性。
查看英文原文: Partitioning and Sharding Options for SQL Server and SQL Azure
评论