【问题标题】:SQL Server Automatic Partitioning of Large Database Tables大型数据库表的 SQL Server 自动分区
【发布时间】:2010-12-10 17:40:36
【问题描述】:

我正在处理具有数千万行的数据库表(随着时间的推移有可能达到数亿行),并且正在考虑实施数据库分区以尝试在行数增加时保持性能稳定。这就是我想做的:

假设我有一张存放动物的桌子。其中一个字段是 AnimalType(即 Bird/Fish/Cat/Dog)。我希望每个 AnimalType 都是一个单独的分区,因为 99% 的查询只与一个 AnimalType 相关,并且表中的 AnimalType 数量大致相等(即 1000 条鱼、1000 只鸟、1000 条狗),所以这意味着分区应该很好并且均匀分布。但是,动物类型很多,我不想去手动为每个AnimalType创建数百个分区,然后每次输入一个新的AnimalType都必须创建一个新的分区。

因此,我想要的是一种告诉 SQL Server 基于 AnimalType 进行分区的方法。如果 AnimalType 已经有一个分区,请使用该分区,否则 SQL Server 将自动创建一个新分区。

这听起来很简单,但我似乎无法找到一种方法来做到这一点。有可能吗?

或者,还有哪些其他方法可以保持表访问速度又快又快?我想避免任何只是手动将内容移动到更多表中的事情,例如将旧记录移动到历史样式表中,因为查询可能需要来自完整数据集的数据,因此这实际上不会帮助。我已经有了一些有很大帮助的基本索引。

【问题讨论】:

    标签: sql-server partitioning vldb


    【解决方案1】:

    分区是存储问题的解决方案,即。根据某些字段值确定位于哪些文件组数据。就其本身而言,它并没有带来真正的性能优势,事实上它实际上在大多数时候都会减慢查询速度,因为需要添加新的分区位置运算符。强制查询只考虑一个分区的唯一方法是$PARTITION 语法,这不能在现实世界的应用场景中使用。选择仅查找一个分区的查询完全基于索引范围,并且将扫描完全相同数量的记录,无论是否分区。

    分区具有性能优势的唯一情况是用于管理活动,例如分区切入和切出表或批量导入操作。

    性能优势只能来自适当的索引和精心设计的查询。

    【讨论】:

    • 分区具有性能优势的唯一情况是用于管理活动 - 分区实际上不会减少锁争用吗?它不应该通过允许并行操作来提高吞吐量吗?如果索引也与表分区对齐,那么它应该只在大量使用时提高性能。此外,如果将分区沿多个磁盘拆分,则将允许更大的吞吐量。可以针对单个分区执行维护操作(索引重建和重组),这也将减少锁定并更快地执行作业。
    • @Groo:锁定减少 - 不。并行操作 - 不(实际上它会损害并行性)。 split io - 不,单个分区可以实现相同且更好的每个文件组多个文件。针对分区的维护:仅离线。在线操作仅针对每个表。此外,分区会引入计划复杂性、显着增加内存占用以及最后但并非最不重要的预读延迟。
    • 你能备份一下吗? According to MSDNSQL Server 的表分区旨在简化大表上的[维护操作],并提高正确过滤查询的性能[...]增强的并行查询操作 在可能提供更好的 CPU 利用率和查询性能的分区表上.
    • 同一链接还指出 “您可以重新组织分区索引并指定单个分区、分区列表甚至分区范围” 并且紧接着明确指出 “重新组织索引始终是在线操作”。关于并行性,又是一个 MSDN 链接:Partitioned Table Parallelism
    • 别误会,我不是 DBA,我不能声称我知道我在说什么。我最近才开始检查我们的选项,因为我们开始在周末安排的维护计划(在线索引重组)期间看到长时间的锁定。我们有一个数据库,其中包含一个巨大的表,其中包含约 20 台设备在一年内的 10fps 测量值,我们注意到我们的插入有时会超时,即使是约 10 分钟。命令超时(对于通常需要大约 80 毫秒才能完成的操作)。我们的理由只是在计划的计划中减少锁定的持续时间。
    【解决方案2】:

    这是一个非常古老的问题,因此可能需要一些更新的信息。首先,要回答最初的问题,是的,动态分区是可以通过预定作业的方式进行的:

    Marlon Ribunal article, see section on dynamic paritioning

    How to automate Table Partitioning in SQL Server by Jignesh Raiyani at SQL Shack

    我还想补充一点,在某些情况下,分区可以提高查询性能。对我来说,通过聚集列存储索引,我能够利用分区来促进段消除。请参阅 2018 年关于它的 SO 帖子:

    Partitioning columnstore tables for performance

    绝不能轻易进入分区方案。在实施之前应该证明它是额外的复杂性和开销以增强您的设计。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多