【问题标题】:How to implement mod partitioning on sql server 2008 r2?如何在 sql server 2008 r2 上实现 mod 分区?
【发布时间】:2010-11-25 11:52:45
【问题描述】:

我可能会在一个巨大的表(数十亿行)上实现分区。

每个表格行都有关于特定设备的某种状态,该状态每分钟插入一次。因此,每台设备每天将有 1440 (24 x 60) 行。每个设备都有一个唯一的 ID (DeviceID)。

我考虑过使用 DeviceID MOD {TheNumberOfPartitionsThatIWant} 进行分区,我认为 TheNumberOfPartitionsThatIWant 为 250 是一个很好的折衷方案。使用这种策略,我可以将设备平均分布在整个分区中,而且,在查询特定设备时,查询引擎只需要触及一个分区,而不是所有 250 个分区。

问题是我需要在我的表中添加一个额外的列,只是为了指示该行所属的分区,以便我可以使用该列在 Partition Schema 上定义表。将 (DeviceID MOD 250) 提供给分区模式会好得多,而不是让这个列具有如此简单的表达式。有解决办法吗?

【问题讨论】:

  • 我在您之前的@​​987654321@ 中看到一条评论说您有 2 个驱动​​器。使用 2 个分区.. 不是吗?如果你想处理这些类型的卷,你就不会在所有硬件上节衣缩食。
  • 那只是一种体验。在最终解决方案中,我们可能会使用 DAS 或 SAN 配置。
  • 您的分区策略的目的是什么?是在查询中实现分区消除、支持快速数据加载还是允许选择性归档旧数据?您可以根据 DeviceID 对计算列进行分区以创建 250 个范围,但考虑到所有分区可能每天都会更新,这不是一个明智的分区策略。另外,每天表的预期大小是多少(以 MB/GB 为单位)?
  • 目的是在查询中消除分区。但是在我的测试中,分区表上的查询比非分区表上的查询要慢。设置了索引,它只访问一个分区(我在实际执行计划中检查过),但速度较慢。为什么?

标签: sql-server sql-server-2008


【解决方案1】:

您可以基于函数对模式绑定的计算列进行分区 - 然而,虽然这确实有效,但好处将是有限的,我希望看到对其进行缩放测试。然后,它还要求对该表的每次访问都在 where 条件内使用相同的函数。

关键点是由 dportas 提出的 - 分区旨在使数据老化成为一项微不足道的操作,在某些时候系统中的数据由于太旧/没有价值而需要清除,此时您减少到长时间运行的删除以删除此数据。

就在多个磁盘上分散数据而言,分区并没有为现有的文件组/文件设施提供任何额外的功能。

【讨论】:

    【解决方案2】:

    适当的索引可能会比分区获得更好的结果。正如@Andrew 所说,分区主要是为了快速加载和卸载数据(即切换分区进出)。

    【讨论】:

      【解决方案3】:

      我创建了一个计算列,解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多