sql server—更新sql中用于报告的表中的批量数据的最佳实践

e0bqpujr  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(212)

我创建了一个用于报告的表,其中存储了大约50列的数据,并且在某个时间间隔内,我的调度程序执行一个服务,该服务处理其他表并填充我的平面表中的数据。
目前,我正在删除和插入该表中的数据,但我想知道这是否是一个良好的做法,或者我应该检查每一行中的每一列,如果发现任何更改,则更新它,如果数据不存在,则插入新记录。
仅供参考,重新插入的行总数为100k+。

tpgth1q7

tpgth1q71#

这是一个非常广泛的问题,只有进入您的环境并讨论您的个人需求才能真正得到回答。显然,这不可能通过堆栈溢出实现。
这意味着你需要自己做决定。
要做到这一点,您需要了解的信息是可用的表更新类型以及如何实现这些更新,通常称为缓慢变化的维度。有几种不同的类型,每种类型都有各自的优点、缺点和最佳用例。
一旦您了解了如何让您的数据按需增量更新,您就可以了解为什么以及实现这一点所需的额外处理逻辑是否值得。包含几十万行数据的数据集并不庞大,因此可能还不需要这种处理级别,尽管这种评估将取决于当前进程的复杂程度和时间消耗以及运行它的时间。

v1uwarro

v1uwarro2#

重新填充10万行的表可能更快。要进行更新,您仍然需要:
生成要插入的所有行
比较每行中的值
更新已更改的值
更新行的开销很大程度上取决于数据页级别的日志记录和数据移动操作。此外,还需要将数据汇集在一起。
如果更新正在更新相当一部分行,甚至可能只是其中的百分之几,那么很可能所有数据页都将被修改。所以i/o非常相似。
当您简单地替换表时,您将从删除表或截断表开始。这些操作相对便宜,因为它们不在行级别记录。然后您将插入表中。从一个表到另一个表插入100000行应该相当快。
以上是一般性指导。当然,如果您每天只更改表中的3行,那么 update 会更快。或者,如果每天都要添加新的数据层,那么只需 insert ,再加上一些改变了的历史价值观或许是一个不错的方法。

相关问题