当运行像“insert into table”这样的查询时,我们如何处理提交大小?即,另一个表中的所有记录是否在单个事务中插入,还是有一种方法可以设置提交大小?
感谢您的提问。请注意,本站点非常适合初次使用者。
感谢您的提问。请注意,本站点非常适合初次使用者。
如果原帖作者想要避免回滚空间问题,答案就很简单。回滚段的大小应该根据事务的大小来确定,而不是反过来。当你的事务完成时,再提交。
除非您明确编写代码,否则无法处理提交大小。例如,您可以使用where循环,并编写一种限制所选数据量的方法。
David Aldridge是正确的,根据最大事务大小来调整回滚段大小,当您希望INSERT作为一个整体成功或失败时。
一些替代方案:
如果您不关心能否回滚(这就是该段存在的原因),则可以使用ALTER TABLE并添加NOLOGGING子句。但除非您正在加载报告表并删除所有旧行并加载新行,或者其他特殊情况,否则这不是明智之举。
如果您可以接受某些行插入而其他行由于某种原因失败,则可以添加支持处理故障的语法INSERT INTOLOG ERRORS INTO。
我想这样做的原因是为了避免回滚段空间不足。此外,我希望能够定期查看目标表中的结果。
我不想使用where循环,因为它可能会增加性能开销。不是吗?
~ Sri
你说得对,你可能想要分批运行大量插入操作。附上的链接展示了在SQL Server中执行此操作的方法,如果你使用不同的后端,你需要做类似的事情,但确切的语法可能会有所不同。这是一个可以接受循环的情况。
TOP
N
”来确保查询仅返回有限数量的行。INSERT INTO thisTable
SELECT TOP 100 * FROM anotherTable;
INSERT INTO TableInserted
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
FROM TableSelected
) X
WHERE RowNumber BETWEEN 101 AND 200
你可以很容易地将上述内容包装到一个while循环中,用变量替换101和200。这比一次处理一条记录要好。
我不知道哪些版本的Oracle支持窗口函数。