SQL Server优化大型更改表

时间:2012-10-04 14:01:27

标签: sql-server optimization

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

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

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

更新

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

3 个答案:

答案 0 :(得分:1)

值得注意的是,索引可能加速此批量更新而不是减慢速度,因为UPDATEDELETE语句仍然需要能够找到在第一个受影响的行中,如果没有适当的索引,它将采用表扫描。

我至少会考虑标识用户的列上的非聚集索引,并且(假设您使用的是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
但它涉及将数据转储到文件。

另请参阅:Bulk Insert Sql Server millions of record

答案 2 :(得分:0)

这真的取决于很多事情

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

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

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

确保您测试每次调整增加或减少负载和工作的时间。