首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >insert-select语句庞大吗?

insert-select语句庞大吗?
EN

Stack Overflow用户
提问于 2011-02-24 00:28:52
回答 3查看 288关注 0票数 0

当一个事务中的一条select语句使用多个插入时,数据库如何跟踪事务期间的更改?如果事务打开的时间太长,资源(如内存或硬盘空间)会出现问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-24 07:16:28

对于大型事务,您可能会遇到很多问题。首先,在大多数数据库中,您不希望逐行运行,因为对于一百万条记录,这将需要数小时。但是,在一条复杂的语句中插入一百万条记录可能会导致锁定所涉及的表,并损害其他所有人的性能。如果您终止事务,回滚也可能需要一段时间。通常,最好的替代方法是批量循环。我通常一次测试50,000个,并根据需要多长时间来提高或降低设置。我有一些数据库,我在一个基于集合的操作中不会超过1000次。如果可能,应该在数据库运行的非高峰时间安排较大的插入或更新。如果真的很大(而且是一次性的,通常是大型数据迁移),您甚至可能想要关闭数据库以进行维护,将其置于单用户模式并删除索引,执行插入和重新索引。

票数 0
EN

Stack Overflow用户

发布于 2011-02-24 00:39:33

简短的答案是,这取决于select的大小。从技术上讲,select是事务的一部分,但大多数select不必“回滚”,因此数据库更改的实际日志不会包含select本身。它将为select语句的每个结果包含一个新行,作为insert语句。如果select语句有10k行,提交将会相当大,但不会比在显式事务中编写10k个单独insert语句更大。

票数 1
EN

Stack Overflow用户

发布于 2011-02-24 07:01:22

这究竟是如何工作的,取决于数据库。例如,在Oracle中,它将需要撤消空间(最终,如果用完了,您的事务将被中止,或者您的DBA将对您大喊大叫)。在PostgreSQL中,它将防止对旧的行版本进行清理。在MySQL/InnoDB中,它将使用回滚空间,并可能导致锁定超时。

数据库必须将空间用于以下几个方面:

回滚存储事务已更改的行(旧值、新值或两者),以便回滚可以跟踪事务可见的数据,以便维护一致的视图(在事务隔离级别中,而不是

  1. )。request.
  2. Keeping跟踪哪些数据对其他事务可见的隔离越多,这种开销通常会越大(除非整个数据库在read uncommitted)
  3. Keeping中运行,并跟踪哪些对象事务发生了更改,因此遵循隔离规则,特别是在可序列化隔离中)。(可能空间不大,但有很多锁)。

通常,您希望事务尽快提交。因此,例如,您不希望在空闲连接上保持一个打开。如何最好地批量插入取决于数据库(通常,一个事务上的多个插入比每个插入一个事务要好)。当然,事务的主要目的是数据完整性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5093746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档