sql-server - SQL Server 中的事务大小限制

标签 sql-server transactions

我正在将大量数据从文本文件加载到 SQL Server 中。目前,每条记录都在单独的事务中插入(或更新),但是如果记录失败,这会使数据库处于错误状态。

我想将其全部放入一笔大交易中。就我而言,我正在查看大约 250,000 次插入或更新,也许还有大约 1,000,000 次查询。文本文件大约为 60MB。

把整个操作放到一个事务中是不是不合理?限制因素是什么?

最佳答案

这样做不仅不是不合理的,而且如果您想在任何记录失败时保持完整性,那么这是必须的,因此您会得到“全有或全无”的导入,正如您所注意到的。对于 SQL 来说,处理 250000 次插入或更新是没有问题的,但我会看看这百万次查询是什么。如果不需要它们执行数据修改,我会将它们从事务中删除,这样它们就不会减慢整个过程。

您必须考虑到,当您有一个开放事务(无论大小)时,将在它所涉及的表中进行查找,并且像您这样的冗长事务可能会导致其他尝试同时读取它们的用户阻塞。如果您预计导入量很大且耗时,并且系统将处于负载状态,请考虑在夜间(或任何非高峰时段)执行整个过程以减轻影响。

关于大小,SQL Server中没有具体的大小限制,理论上它们可以修改任意数量的数据而没有问题。实际限制实际上是目标数据库的事务日志文件的大小。当事务进行时,数据库引擎将所有临时和修改的数据存储在该文件中(因此可以在需要时使用它来回滚),因此该文件的大小将会增加。它必须在数据库属性中有足够的可用空间,并且有足够的硬盘空间供文件增长。此外,引擎将在受影响的表上放置的行锁或表锁会消耗内存,因此服务器也必须有足够的可用内存来完成所有这些管道操作。不管怎样,60MB 的大小通常太小,不用担心。 250,000 行是相当大的,但也不是那么多,所以任何大小合适的服务器都能够处理它。

关于sql-server - SQL Server 中的事务大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555757/

相关文章:

sql-server - 尝试通过 DTExec.exe 运行 SSIS 包时出现 Appcrash Kernelbase.dll 错误

sql-server - SQL Server 存储过程中的表变量插入性能不佳

sql - 在 SQL SERVER 2008 中计算几何链接返回

spring - Spring 交易中的一个连接?

java - 手动创建的多个数据源的事务管理

mySQL - 表锁定与行锁定

java - <tx :annotation-driven/> leads to java. lang.ClassNotFoundException : org. aopalliance.aop.Advice

c# - 如何使用 Join 搜索字段?

sql-server - 将 WHERE 与 Group By 一起使用并具有

mysql - 尝试根据 mysql 保存用户应用程序时,WSO2 App Store 抛出错误