2012-10-04 46 views
0

我有一些报告,为我的数据库中的每个用户执行一些耗时的数据计算,结果为每个用户计算10到20个新记录。为了提高报告响应速度,创建了一个夜间作业来运行计算并将结果转储到数据库中的快照表。它只针对活跃用户运行。SQL Server优化大型更改表

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

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

UPDATE:

的一个问题是,我不能在批处理做到这一点,因为脚本的工作方式,它在一次检查一个用户,所以它着眼于用户,删除先前10-20纪录,并插入一组新的10-20条记录。它一遍又一遍地做这个。我担心事务日志将耗尽空间或可能发生其他性能问题。我想配置表格,现在担心数据保存或其他可能会降低速度的项目。我不能删除索引以及所有这些,因为人们正在同时访问该表并更新它。

回答

1

另外值得一提的是,索引可能潜在加快此批量更新,而不是慢下来,因为UPDATEDELETE报表仍然需要能够定位在首位受影响的行,如果没有适当的索引它将诉诸表扫描。

我至少会考虑识别用户的列上的非聚集索引,并且(假设您使用的是2008)考虑MERGE声明,这肯定可以避免缺陷目前采用的方法DELETE/INSERT

根据The Data Loading Performance Guide(MSDN),使用跟踪标志对MERGE进行插入记录的最小日志记录。

我不会说太多,直到我知道您使用的是哪个版本的SQL Server。

+0

MERGE太棒了。不知道这一点。谢谢。 – CodeGrue

0

这就是所谓的批量插入,你不得不放弃在目标表中的所有指标和大礼包送INSERT命令由;

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

参见:Bulk Insert Sql Server millions of record

+0

谢谢。我在我的问题中添加了一个更新,以讨论为什么我不能走这条路。 – CodeGrue

+0

那么,如果数据库正在使用,而你正在更新它,我想你只能有一个镜像数据库。您可以在该数据库上执行所有耗时的操作,并将用户重新路由到该数据库。反之亦然。 – Anri

0

这真的取决于很多东西,快把你的机器

  • 被处理的记录
  • 大小
  • 网络速度

等。

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

分区表中可以看到性能优势,如果你的活跃和不活跃用户分区(虽然数据集可能是此一点点小)

确保您测试每个TWEAK多久增加或减少你的负荷和工作从那里。

+0

这与MERGE结合应该是一个很好的解决方案。 – CodeGrue