我有报告为我的数据库中的每个用户执行一些耗时的数据计算,结果是为每个用户计算了10到20个新记录。为了提高报告响应能力,创建了一个夜间作业来运行计算并将结果转储到数据库中的快照表。它仅适用于活跃用户。
因此,对于50k用户,其中30k是活动的,该作业在大型快照表中“更新”300k到600k记录。它当前使用的方法是删除给定用户的所有先前记录,然后插入新集。表中没有PK,只使用业务键对数据集进行分组。
所以我的问题是,每晚删除和添加多达600k的记录时,是否有优化表来处理此问题的技巧?例如,由于可以按需重新创建数据,是否有办法在进行这些更改时禁用表的记录?
更新
一个问题是我无法批量执行此操作,因为脚本的工作方式,它一次检查一个用户,因此它查看用户,删除以前的10-20条记录,并插入一组新的10- 20条记录。它一遍又一遍地做到这一点。我担心事务日志将耗尽空间或可能发生其他性能问题。我想配置表现在担心数据保存或其他可能减慢它的项目。我不能删除索引和所有这些,因为人们正在同时访问该表以进行更新。
答案 0 :(得分:1)
值得注意的是,索引可能加速此批量更新而不是减慢速度,因为UPDATE
和DELETE
语句仍然需要能够找到在第一个受影响的行中,如果没有适当的索引,它将采用表扫描。
我至少会考虑标识用户的列上的非聚集索引,并且(假设您使用的是2008)考虑MERGE
语句,这肯定可以避免目前使用的质量DELETE
/ INSERT
方法的缺点。
根据The Data Loading Performance Guide(MSDN),使用跟踪标志的插入最少记录MERGE
。
在我知道您正在使用哪个版本的SQL Server之前,我不会说太多。
答案 1 :(得分:0)
这称为批量插入,您必须删除目标表中的所有索引,并以大;
另一种方法是使用BULK INSERT语句http://msdn.microsoft.com/en-us/library/ms188365.aspx
但它涉及将数据转储到文件。
答案 2 :(得分:0)
这真的取决于很多事情
等
通常,将记录添加到“堆”或未编制索引的表中会更快。因此,删除所有索引并在加载后重新创建它们可能会提高性能。
如果您按活动和非活动用户进行分区,则对表进行分区可能会看到性能优势(尽管数据集对此可能有点小)
确保您测试每次调整增加或减少负载和工作的时间。