![](/img/trans.png)
[英]SQL Server - Any better alternative to improve performance of a lengthy transaction with lot of inserts?
[英]How much does wrapping inserts in a transaction help performance on Sql Server?
好吧,假设我有 100 行要插入,每行大约有 150 列(我知道这听起来像很多列,但我需要将这些数据存储在一个表中)。 插入将随机发生(即,每当一组用户决定上传包含数据的文件时),大约每月 20 次。 然而,数据库将承受持续负载处理大型企业应用程序的其他功能。 列是 varchars、ints 以及各种其他类型。
在事务中包装这些插入(而不是一次运行一个)的性能增益是巨大的、最小的还是介于两者之间?
为什么?
编辑:这是针对 Sql Server 2005,但如果有不同的说法,我会对 2000/2008 感兴趣。 另外我应该提到我理解事务主要是为了数据一致性的观点,但我想专注于性能影响。
它实际上可能是一种影响。 事务的重点不在于你做了多少,而在于保持数据更新的一致性。 如果您有需要一起插入并相互依赖的行,那么这些记录就是您包装在事务中的记录。
事务是关于保持您的数据一致。 这应该是您在使用事务时首先考虑的事情。 例如,如果您从您的支票账户借记(取款),您要确保贷记(存款)也已完成。 如果其中任何一个不成功,则整个“事务”应该回滚。 因此,这两个操作都必须包含在一个事务中。
进行批量插入时,将它们分成 3000 或 5000 条记录,然后在整个集合中循环。 3000-5000 对我来说是一个很好的插入数字范围; 除非您已经测试过服务器可以处理它,否则不要超过它。 此外,我将大约每 3000 或 5000 条记录将 GO 放入批处理中以进行插入。 更新和删除 我将 GO 设置为大约 1000,因为它们需要更多资源来提交。
如果您从 C# 代码执行此操作,那么在我看来,您应该构建一个批量导入例程,而不是通过编码一次执行数百万次插入。
这取决于你所说的巨大,但它会有所帮助(这实际上取决于你正在做的插入的总数)。 它将强制 SQL Server 在每次插入后不进行提交,这会及时累加。 对于 100 次插入,您可能不会注意到增加太多,具体取决于数据库发生的频率和其他情况。
正如其他人所说,事务与性能无关,而是与数据的完整性有关。
话虽如此,当您只谈论每月插入 100 行数据大约 20 次(意味着每月 2000 条记录)时,以一种或另一种方式担心性能是愚蠢的。 过早的优化是浪费时间; 除非您反复测试了这些插入的性能影响(尽管它们很小,但很少出现)并发现它们是一个主要问题,否则不要担心性能。 与您提到的其他服务器负载相比,它可以忽略不计。
事务不是为了性能,而是为了数据完整性。 根据实现,只有 100 行不会有真正的性能增益/损失(它们只会被额外记录,因此它们都可以回滚)。
关于性能问题需要考虑的事项:
总而言之:使用 TA 来确保完整性。
实际上 - 非常。 使用大插入,100++(假设您将 mysql 配置为增加查询大小和事务大小以支持巨大的查询/事务,抱歉,不记得确切的变量名称)-插入时间通常可以快 10 倍甚至更多更多的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.