好的说我要插入100行,每行有大约150列(我知道这听起来像很多列,但我需要将这些数据存储在一个表中)。插入将随机发生(即每当一组用户决定上传包含数据的文件时),大约每月20次。但是,数据库将在连续加载处理大型企业应用程序的其他功能。列是varchars,int,以及各种其他类型。
在事务中包装这些插入的性能提升(而不是一次一个地运行它们)是巨大的,最小的还是介于两者之间?
为什么?
编辑: 这是针对Sql Server 2005的,但如果有不同的话,我会对2000/2008感兴趣。另外我应该提一下,我理解交易主要是为了数据一致性,但我想关注性能影响。
答案 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来确保完整性。
答案 4 :(得分:2)
正如其他人所说,交易与性能无关,而是与数据的完整性有关。
话虽如此,当你只谈论每月插入100行数据大约20次(意味着每月2000条记录)时,担心性能的方式是愚蠢的。过早优化是浪费时间;除非您反复测试这些插件的性能影响(尽可能小,并且不常见)并发现它们是一个主要问题,但不要担心性能。与您提到的服务器负载相比,它可以忽略不计。
答案 5 :(得分:0)
实际上-非常。具有大插入量,100 ++(假设您将mysql配置为具有增加的查询大小和事务大小以支持可怕的查询/事务,对不起,您不记得确切的变量名了)-插入时间通常可以快10倍甚至更多更多