为什么Oracle的插入速度比Mysql快

为什么Oracle的插入速度比Mysql快,mysql,sql,performance,oracle11g,sql-insert,Mysql,Sql,Performance,Oracle11g,Sql Insert,我在Oracle11gr2和MySQL5.6之间有一个小小的比较 我用3个表在两个DBMS中创建相同的模式 --分支机构 --客户 --贷款 贷款对客户机有一个外键,客户机对分支机构有一个外键,除此之外,它们都有主键 我创建了分支和客户机(200000个客户机),我想用大约由50列组成的loan表测试插入性能 大多数克隆都是双精度、整数或字符串 create or replace PROCEDURE create_loans( n number) as BEGIN Declare

我在Oracle11gr2和MySQL5.6之间有一个小小的比较

我用3个表在两个DBMS中创建相同的模式 --分支机构 --客户 --贷款 贷款对客户机有一个外键,客户机对分支机构有一个外键,除此之外,它们都有主键

我创建了分支和客户机(200000个客户机),我想用大约由50列组成的loan表测试插入性能

大多数克隆都是双精度、整数或字符串

create or replace PROCEDURE create_loans( n number)
as
BEGIN
    Declare 
    i number:=0;
    randDouble float ;
    randInt number;
    randString varchar2(50);
    Begin
      while i < n 
      Loop
         randDouble := ROUND(dbms_random.value(0,1),17);
         randInt := ROUND(dbms_random.value(1,100000000));
        randString := dbms_random.string('l', 50); 

        Insert into loan_row_model.loan values(null,
            randDouble,
            randDouble*10,
            randDouble*13,
            SUBSTR(randString,1,32),
            SUBSTR(randString,2,10),
            randDouble*155,
            SUBSTR(randString,1,9),
            SUBSTR(randString,9,10),
            SUBSTR(randString,1,32),
            randDouble*6123,--annual_inc
            SUBSTR(randString,3,32),--verification_status
            SUBSTR(randString,4,30),
            randDouble,
            randInt,--open_acc
            randInt*2,
            SUBSTR(randString,7,7),
        randInt*5,--total_acc
        SUBSTR(randString,1,3),--initial_list_status
            randDouble*64,
        randDouble*4,
        randDouble*231,
        randDouble,
        randDouble,
            randDouble*12,
            randDouble,--collection_recovery_fee
            SUBSTR(randString,19,30),
            randDouble*14,--last_pymnt_amnt
            SUBSTR(randString,21,32),
            SUBSTR(randString,9,30),
            SUBSTR(randString,16,15),--policy_code
            SUBSTR(randString,1,29),--application_type
            randInt,
            randInt*7,
            randInt*4,
            randInt,
            randInt,
            randInt,
            randInt*3,
            randInt,--mths_since_rcnt_il
            randDouble*6149,
            randInt*8,--open_rv_12m
            randInt*8,--open_rv_24m
            randDouble*475,
            randDouble*37,--all_util
            randInt*4,
            randInt,
            randInt*3,
            randInt,
            randInt*9,
            TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2016-01-01','J'),TO_CHAR(DATE '2046-12-31','J') )),'J'),
            ROUND(dbms_random.value(1,200000))
            );
         i := i+1;
        end loop;
    end;
END;
创建或替换程序创建贷款(n编号)
作为
开始
声明
i编号:=0;
双浮动;
随机数;
randString varchar2(50);
开始
而我
环
randDouble:=四舍五入(dbms_随机值(0,1),17);
randInt:=四舍五入(dbms_random.value(1100000000));
randString:=dbms_random.string('l',50);
插入loan_row_model.loan值(空,
randDouble,
randDouble*10,
randDouble*13,
SUBSTR(随机字符串,1,32),
SUBSTR(随机字符串,2,10),
randDouble*155,
SUBSTR(随机字符串,1,9),
SUBSTR(randString,9,10),
SUBSTR(随机字符串,1,32),
randDouble*6123,--年度公司
SUBSTR(随机字符串,3,32),--验证状态
SUBSTR(randString,4,30),
randDouble,
randInt,-open_acc
randInt*2,
SUBSTR(randString,7,7),
randInt*5,--总计
SUBSTR(随机字符串,1,3),--初始列表状态
randDouble*64,
randDouble*4,
randDouble*231,
randDouble,
randDouble,
randDouble*12,
randDouble,--收款(回收)(费用)
SUBSTR(randString,19,30),
randDouble*14,--最后一次
SUBSTR(randString,21,32),
SUBSTR(randString,9,30),
SUBSTR(randString,16,15),--策略代码
SUBSTR(随机字符串,1,29),--应用程序类型
兰丁,
randInt*7,
randInt*4,
兰丁,
兰丁,
兰丁,
randInt*3,
randInt,-mths\u自
randDouble*6149,
randInt*8,--开放式房车12米
randInt*8,--开启距离为24m
randDouble*475,
randDouble*37,--所有
randInt*4,
兰丁,
randInt*3,
兰丁,
randInt*9,
截止日期(TRUNC(DBMS随机值)(截止字符(日期'2016-01-01','J')、截止字符(日期'2046-12-31','J'))、'J'),
四舍五入(dbms_随机值(1200000))
);
i:=i+1;
端环;
结束;
结束;
mysql中的过程几乎相同,我只是使用了它们的本地随机生成器来生成值

在开始之前,我在oracle中禁用了并行执行,在mysql中禁用了刷新缓存

但结果是,对于50000次插入,Oracle在Mysql中的插入时间分别为15秒和30秒


原因是什么,你能帮忙吗?

如果你一次“批处理”100行,MySQL可以在3秒钟内完成。使用
加载数据
可能会更快

您需要多久插入一次50K行?换句话说,这有什么关系

显示我们
显示创建表
;索引或缺少索引可能存在各种问题(有利或不利),数据类型也可能存在这些问题,尤其是“引擎”

他们“完成”了吗?Oracle和MySQL都对“延迟写入”做了一些修改,以避免让您等待。15秒或30秒可能是可持续的,也可能不是可持续的

您使用的是旋转驱动器还是SSD?带写缓存的RAID?自动提交与开始…提交的设置如何?你有没有做过承诺?或者计时是否包括回滚?!每次插入
后提交
不是一个好主意,因为它会带来巨大的开销

设置是否进行了最佳调整

表中是否已有数据?你是不是在结尾插入了“结尾”?还是随机的


当您回答了所有这些问题后,我可能还有10个问题,这些问题将表明可以采取进一步的措施,使您的基准测试“证明”一个供应商或另一个供应商的速度更快。

1000个原因,一个是服务器配置HMMM。甲骨文有着30多年的持续改进,这是一家在该产品上投入了大量资金的公司内置的。你很好奇为什么它比自由软件快?@BerndBuffen,我猜你会说,我的dbms没有同等的条件?我如何解决它呢?一个旁注:如果不是真的需要,不要使用近似浮点数据类型。这两种DBMS都提供精度超过60位的精确十进制数据类型。。。。或者打开评测:SET profiling=on;显示个人资料。。。。。瓶颈是什么。在my.cnf中更改它,然后重试。我几乎可以肯定MySQL的速度更快,但Oracle有更多的功能