在某个 Oracle 11.2 环境中,我观察到不必要的提交,例如
-- some updates/inserts etc.
commit;
select * from mytable where somecond = 23;
commit;
甚至:
update mytable set foo = '42';
commit;
commit;
因此,在这两个示例中,第二次提交是不必要的,因为事务是“空的”——没有什么可提交的。
问题是:那些不必要的提交有多昂贵?
Oracle DB 是否“智能”到足以检测此类空事务并用 NOPs 替换那些不必要的提交? (没有)?
背景:那些多余的提交有时似乎来自某些框架的层,程序员不知道“隐藏”逻辑 - 或者有时它们只是疏忽。根据它们的成本(就数据库性能而言),以高优先级修复代码是有意义的。
最佳答案
空提交并不昂贵,可以忽略。空提交只需要少量 CPU,不会阻塞其他进程或阻止可扩展性。
正常提交很慢,因为它会导致将数据写入磁盘以确保持久性。数据库更改需要 REDO(以防数据库在
数据可以完全写入数据文件,允许恢复向前滚动),撤消(因此其他事务可以看到更改前的数据),
将新的系统更改编号记录到控制文件等。直到这些内容写入磁盘后,提交才会完成。
空提交不会做任何这些事情。它们使用 CPU 时间,但可能足以检查是否不需要进行任何更改。 CPU时间
与写入数据文件、重做日志或控制文件相比,成本较低。它应该可以很好地扩展。
下面的示例表明真正的问题是在每次微小更改后执行 COMMIT 时。仅靠运行时间不足以比较这三种方法。
如果您查看 GV$ACTIVE_SESSION_HISTORY 中的等待或磁盘 I/O(来自 Windows Resource Monitor、Solaris truss 等),您将看到下面的示例 #1
只使用 CPU。 Example #3 使用 CPU、重做日志、数据文件和控制文件。
--#1: Empty commits.
--15 seconds for 1 million commits.
--Only CPU waits, almost no I/O is generated.
begin
for i in 1..1000000 loop
commit;
end loop;
end;
/
--#2: Just inserts.
--34 seconds for 1 million inserts.
--CPU waits, plus some "other" waits.
create table test1(a number);
begin
for i in 1..1000000 loop
insert into test1 values(1);
end loop;
commit;
end;
/
--#3: Inserts and commits.
--107 seconds for 1 million inserts and commits.
--Lots of CPU waits, lots of "other" waits.
begin
for i in 1..1000000 loop
insert into test1 values(1);
commit;
end loop;
end;
/
关于oracle - 提交空交易很昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33042679/