SQL Server 1B+ 记录表 - 处理 upserts 的最佳方式?

Posted

技术标签:

【中文标题】SQL Server 1B+ 记录表 - 处理 upserts 的最佳方式?【英文标题】:SQL Server 1B+ records table - best way to handle upserts? 【发布时间】:2018-06-05 20:58:01 【问题描述】:

我工作的公司正在建立一个数据集市,希望在其中保留 7 年的数据。不幸的是,一张表有超过 10 亿条记录。

我的问题是这样的:保持此表最新的最佳方法是什么? (每日更新或更快)

我知道 MERGE 语句对此非常有益,但我希望不必为每个 MERGE 解析 10 亿条记录。因为我们没有 SQL Server 企业版,所以表分区已经过时了。

任何方向都将不胜感激:)

【问题讨论】:

Table partition。根据数据的年龄对表进行分区。您甚至可以将每个分区存储在自己的存储卷上 表分区、压缩和列存储索引在 SQL Server 2016 SP1 及更高版本的所有版本中都可用。 【参考方案1】:

这里有几个选项;上面在评论中解释了两个。 答案取决于您要对记录执行的操作。 如果您只想修改最近的记录,最好的方法是将这些记录保留在活动表中,并将其他记录作为存档移动到存档表中。这样,您需要一个计划的作业来将不必要的记录移动到存档表中。 如果您还想拥有一个报告模块,您可能需要提供一个额外的表格,其中包含一些数据摘要,以便您可以提取所需的报告。

【讨论】:

【参考方案2】:

您将需要认真考虑拆分表格。例如,请参阅operational versus archive 范例。

从如此庞大的表中拆分数据的第一步是识别clustering index(如果它有一个)和所有其他索引,因为你会想要避免导致大重建和数据转移的操作。

否则,如果您需要保持现状,使用良好的索引(您应该硬着头皮定义一个如果他们以某种方式在没有索引的情况下存活了这么久) ,您可以依靠查询优化器快速执行index seek(比扫描要好得多,尤其是表扫描,这似乎是您所关心的问题)。因此,只需编写您的 MERGE 语句并确保在 ON 子句中使用索引(并且不惜一切代价避免在索引列上使用 using functions!)。

【讨论】:

以上是关于SQL Server 1B+ 记录表 - 处理 upserts 的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 批处理变量定义和赋值

Vegas原创查询SQL Server更改记录的语句

记录sql server 的批量删除主外键的sql语句

在 SQL Server 中处理 Null 值和重复记录

sql server相邻表记录交换(单双两两交换)

sql server 的after触发器之insert触发器实例