0

我有报告为我的数据库中的每个用户执行一些耗时的数据计算,结果是为每个用户计算 10 到 20 条新记录。为了提高报告响应能力,创建了一个夜间作业来运行计算并将结果转储到数据库中的快照表中。它只为活跃用户运行。

因此,对于 50k 用户,其中 30k 处于活动状态,该作业将大型快照表中的 300k 记录“更新”到 600k 条记录。它当前使用的方法是删除给定用户的所有先前记录,然后插入新集合。表上没有PK,只用一个业务key对数据集进行分组。

所以我的问题是,当每晚删除和添加多达 60 万条记录时,是否有技术来优化表来处理这个问题?例如,由于可以按需重新创建数据,有没有办法在进行这些更改时禁用表的日志记录?

更新:

一个问题是我不能批量执行此操作,因为脚本的工作方式是一次检查一个用户,因此它会查看一个用户,删除之前的 10-20 条记录,并插入一组新的 10-20 条记录。它一遍又一遍地这样做。我担心事务日志会用完空间或可能出现其他性能问题。我想将表配置为现在担心数据保存或其他可能减慢它的项目。我不能删除索引和所有这些,因为人们正在同时访问该表以对其进行更新。

4

3 回答 3

1

还值得注意的是,索引可能会加速这种批量更新而不是减慢它,因为UPDATEDELETE语句仍然需要能够首先定位受影响的行,并且如果没有适当的索引,它将求助于表扫描。

我至少会考虑在标识用户的列上使用非聚集索引,并且(假设您使用的是 2008)考虑该MERGE语句,这绝对可以避免当前使用的质量DELETE/INSERT方法的缺点.

根据数据加载性能指南(MSDN),MERGE使用跟踪标志对插入进行最低限度的记录。

在知道您使用的是哪个版本的 SQL Server 之前,我不会多说。

于 2012-10-04T15:13:42.360 回答
0

这称为批量插入,您必须删除目标表中的所有索引并以大包(数百个插入语句)发送插入命令;

另一种方法是使用 BULK INSERT 语句http://msdn.microsoft.com/en-us/library/ms188365.aspx
但它涉及将数据转储到文件。

另请参阅:批量插入 Sql Server 数百万条记录

于 2012-10-04T14:17:52.760 回答
0

这真的取决于很多事情

  • 你机器的速度
  • 正在处理的记录的大小
  • 网速

等等

通常,将记录添加到“堆”或未索引的表会更快。因此,删除所有索引并在加载后重新创建它们可能会提高您的性能。

如果您按活动用户和非活动用户进行分区,则对表进行分区可能会带来性能优势(尽管为此数据集可能有点小)

确保您测试每次调整增加或减少您的负载并从那里开始工作的时间。

于 2012-10-04T14:36:33.417 回答