SQL Server 2012 表可以容纳多少行,我应该在什么时候对其进行分区?

Hik*_*ari 4 sql-server partitioning sql-server-2012

假设一个表存储有关某个事件的粒度数据。它有事件的日期、大约 30K 类型的类型维度和大约 100 个类别的类别维度,以及一些数字事实。

平均每天有 1500 万笔交易。每年超过 50 亿,每十年超过 60G。这不是大数据,但数量很多。

SQL Server 2012 表可以容纳多少行?

当然,较旧的数据使用频率较低,并且可能会在同一数据库的多个表中进行分区。但是这种划分应该什么时候开始呢?一年一张桌子?5年?

从评论中收集的其他信息:

考虑一下:我有足够的存储空间来保存该事件的 300 亿条记录。如果每个事件记录需要 1KB,那么我在该表中有 30TB,以及足够的存储空间(以及它的日志)。它的PK是bigint。

您如何看待一张包含历史数据的表和另一张包含最新数据的表?该表没有事务性事件,而是有一个目录,例如客户。OLTP 的目录每天都被复制到 DW 中。所以我有一个包含历史数据的表和另一个包含最新记录的表。

在我使用的设计中,ETL 提供历史表,然后我使用 row_number() 通过其 NK 获取每个实体的最新记录。运行起来非常昂贵,但通过这种方式,我保留了过去存在的实体,不再存在于 OLTP 上。

Sol*_*zky 10

MSSQL2012 表可以容纳多少条记录?

正如SQL Server 的最大容量规范(对于 SQL Server 2012)的 MSDN 页面所述:

“每表行数 = 受可用存储限制”(32 位和 64 位平台均相同)

但是这种划分应该什么时候开始呢?一年一张桌子?5年?

这一切都取决于系统的需要。没有固有的分区需要,真的,仅仅基于性能问题。分区主要是为了更轻松地管理将大量数据以尽可能快的速度传入或传出表,并尽可能减少争用。如果纯粹是为了提高查询性能,可能会开始测试大约 10 亿行,但即便如此,如果您拥有良好的数据模型和良好的索引,您可能甚至不需要为此烦恼。此外,对于人们选择实现表分区(如果他们的意图纯粹与性能相关)的许多情况,过滤索引甚至过滤统计可能会做得很好。

但是,如果您需要快速删除一大块行,也许是为了老化旧数据,那么表分区将有所帮助,因为您可以SWITCH删除“旧”数据。在这个层面上,这不是行数的问题,而是您想要管理的时间量的问题。如果要按月换出数据,就按月做分区。如果您想每年对数据进行老化,请尝试每年分区。


更新

不知道为什么我之前没有提到这一点,但你应该看看 Partitioned Views。那就是当你有多个相同模式的表和一个在它们之间CHECK CONSTRAINT执行UNION ALL 的视图时,每个表都有一个强制执行该表中特定范围的数据(因此查询优化器知道从哪里获取数据)。通过这样做,您可以拥有两个表——当前表和历史表——然后查询命中一个或另一个(如果提前知道时间范围,例如只命中最近 90 个的查询天),或者如果数据可以在任何一个中,则使用视图。请参阅以下内容了解更多信息:

我相信您甚至可以将“当前”表进行分区(以便您可以快速切入传入数据并切出正在变“旧”的数据),一个未分区的历史表和一个分区视图加入他们两个。然后,您只需要一种方法将新切换出的分区中的数据放入“历史”表中。

此外,关于性能,还提供了其他功能,具体取决于您使用的版本(有些仅随企业版提供)。但是您应该研究列存储索引、数据压缩以及其他一些内容。