SQL Server 分区策略

SQL Server 分区策略

我有以下要求:

  • 我们存储了过去一年中 10 家公司的每日订单详情。

日期 公司 订单
2010 年 1 月 1 日 公司 A 订单 # 1
2010 年 1 月 1 日 公司 A 订单 # 2
2010 年 1 月 1 日 公司 B 订单 # 1
..
2010 年 12 月 31 日 公司 A 订单 # 1
2010 年 12 月 31 日 公司 A 订单 # 2
2010 年 12 月 31 日 公司 B 订单 # 1

  • 数据库每小时都会加载一个或多个公司的新订单或更新订单详细信息。(注意:每个公司每小时可能会收到数千个订单)

  • 目前我们通过 SQL Server 2005 分区处理此问题,如下所示:

    • 创建一个按日期列分区的存档表。该表将类似于上表。
    • 每小时将所有新到达的数据收集到单独的表中,同时从存档中添加未修改的行,切换出存档表中的当前日期分区,最后切换入新准备的表。

这种方法效果很好。但是,由于我们每小时都会添加“来自档案的未修改行”,因此此过程并非最佳。例如,假设我们在特定小时内只收到 1 家公司的订单,根据当前实施,我们最终会复制所有其他 9 家公司的订单以填充小时表。

有人可以推荐一种更好的方法吗?

我们一直在考虑按公司而不是按日期创建分区,但是我们如何处理每小时的切换过程?

答案1

理想情况下,您只想切换新添加的小时,而不复制或触及以前的数据。但这需要每小时 1 个分区,并且您将在 4 天内用完分区。即使使用 SQL 2008 SP2增加分区支持,您只能存储不到 2 年的数据。作为一个延伸,使用 3 个表并将分区从当前分区切换到较旧的分区,然后再切换到更旧的分区,您将能够覆盖 5 年,这是典型的数据保留策略要求,但我不会轻易推荐这样做。

对于您所处的情况,我实际上认为您正在采取最好的解决方案。我会考虑提前准备下一个小时的分区:

  • 在 H 时,您开始接收最新数据并将其存储在表 T 中。该表已准备好与当前分区的现有存档数据的时间一致(换句话说,是当前分区的副本)。
  • 当数据接收完成后,使用快速批量操作(select into、bcp、insert bulk、openrowset bulk 等)创建表 T 的副本 T'。此 T' 副本将成为接收新数据的表下一个小时。
  • 表 T 中的 switch
  • 将 T' 重命名为 T,您已准备好接收下一个数据。

当然,我在这里做了一个假设,一旦导入,数据就不会被修改,这在大多数 ETL 场景中相当常见。

相关内容