oracle - 提交空交易很昂贵吗?

标签 oracle oracle11g transactions

在某个 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/

相关文章:

go - 如何检测占用锁的goroutine?

oracle: INSERT 其中 a=b

mysql - 如何从Oracle存储过程中选择/插入MySQL表?

sql - '....where A.ID = B.ID (+)'是什么类型的联接

oracle - Oracle 中删除行后重用空间

transactions - 是否可以通过机器边界(通过 tcp-ip)进行交易?

java - ibm liberty 中的 JTA 事务配置

ORACLE 加入 V$SQLAREA V$SESSION

oracle - Dapper & Oracle Clob 类型

sql - 替换字符串中的所有字符