在事务中包装插入有多少可以帮助在Sql Server上实现性能?

时间:2009-02-06 19:46:43

标签: sql sql-server database performance transactions

好的说我要插入100行,每行有大约150列(我知道这听起来像很多列,但我需要将这些数据存储在一个表中)。插入将随机发生(即每当一组用户决定上传包含数据的文件时),大约每月20次。但是,数据库将在连续加载处理大型企业应用程序的其他功能。列是varchars,int,以及各种其他类型。

在事务中包装这些插入的性能提升(而不是一次一个地运行它们)是巨大的,最小的还是介于两者之间?

为什么?

编辑: 这是针对Sql Server 2005的,但如果有不同的话,我会对2000/2008感兴趣。另外我应该提一下,我理解交易主要是为了数据一致性,但我想关注性能影响。

6 个答案:

答案 0 :(得分:17)

实际上可能会产生影响。交易点不是关于你做了多少,而是关于保持数据更新的一致性。如果您有需要一起插入并且相互依赖的行,那么这些是您在事务中包装的记录。

交易是关于保持数据的一致性。这应该是您在使用交易时首先考虑的事情。例如,如果您从支票帐户中扣款(取款),则需要确保信用(存款)也已完成。如果其中任何一个不成功,则应回滚整个“事务”。因此,两个动作必须包含在事务中。

进行批量插入时,将它们分解为3000或5000条记录并循环显示。 3000-5000对我来说是一个甜蜜的编号范围;除非你已经测试过服务器可以处理它,否则不要超过它。此外,我将把批次中的GO放在大约每3000或5000个记录中用于插入。更新和删除我将GO设置为大约1000,因为它们需要更多资源来提交。

如果您使用C#代码执行此操作,那么在我看来,您应该构建批量导入例程,而不是通过编码一次执行数百万个插入。

答案 1 :(得分:8)

虽然事务是一种保持数据一致的机制,但如果它们被错误地使用或过度使用,它们实际上会对性能产生巨大影响。我刚刚完成blog post关于明确指定事务的性能影响,而不是让它们自然发生。

如果要插入多行,并且每个插入都发生在自己的事务中,则锁定和解锁数据会产生大量开销。通过在单个事务中封装所有插入,可以显着提高性能。

相反,如果您针对数据库运行了许多查询并且还发生了大量事务,则它们可能会相互阻塞并导致性能问题。

交易与绩效明确挂钩,无论其潜在意图如何。

答案 2 :(得分:2)

这取决于你所谓的巨大,但它会有所帮助(它实际上取决于你正在做的插入的总数)。它会强制SQL Server在每次插入后都不进行提交,这会及时累加。使用100个插入时,您可能不会注意到增加的数量,具体取决于数据库的频率和其他内容。

答案 3 :(得分:2)

事务不是为了提高性能,而是为了数据完整性。根据实施情况,只有100行才会有真正的性能增益/损失(它们只会被另外记录,因此它们都可以回滚)。

有关性能问题需要考虑的事项:

  • TA将与其他查询进行交互
    • 编写TA将锁定元组/页面/文件
  • 提交可能是(取决于锁定协议)更新时间戳
  • 可以为TA编写更多日志(一个应该能够返回TA,但数据库可能已经广泛记录,顺序记录很便宜)
  • 隔离程度(我知道可以在某些DB中切换此级别 - 并且几乎没有人使用级别3)

总而言之:使用TA来确保完整性。

答案 4 :(得分:2)

正如其他人所说,交易与性能无关,而是与数据的完整性有关。

话虽如此,当你只谈论每月插入100行数据大约20次(意味着每月2000条记录)时,担心性能的方式是愚蠢的。过早优化是浪费时间;除非您反复测试这些插件的性能影响(尽可能小,并且不常见)并发现它们是一个主要问题,但不要担心性能。与您提到的服务器负载相比,它可以忽略不计。

答案 5 :(得分:0)

实际上-非常。具有大插入量,100 ++(假设您将mysql配置为具有增加的查询大小和事务大小以支持可怕的查询/事务,对不起,您不记得确切的变量名了)-插入时间通常可以快10倍甚至更多更多