为什么Oracle插入比Mysql更快

时间:2016-05-02 11:44:27

标签: mysql sql performance oracle11g sql-insert

我在oracle 11gR2和Mysql 5.6之间有一点点对比。

我在DBMS中使用3个表创建相同的模式 - 科 - 客户 - 贷款 loan有一个外键给客户端,而一个客户端有一个外键来分支,除了它们都有主键。

我创建了分支机构和客户端(200_000个客户端),我想测试插入性能和贷款表,该表包含大约50列。

大多数clolumns是double或integer或string。

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;

mysql中的过程几乎完全相同,我只是使用他们的原生随机生成器来获取值。

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

但是对于50000个插件,Oracle在Mysql中有15s vs 30s。

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

1 个答案:

答案 0 :(得分:1)

如果你一次“批量”100行,MySQL可以在3秒内完成。使用en_AU可能更快。

您需要多少次插入50K行?换句话说,为什么重要?

告诉我们LOAD DATA;可能存在各种问题(有利或不利)与索引或缺少它们,以及数据类型,尤其是“引擎”。

他们“完成了”吗? Oracle和MySQL都在“延迟写入”上做了一些变体,以避免让你等待。 15岁或30岁可能是可持续的,也可能是不可持续的。

您使用旋转驱动器还是SSD?带写缓存的RAID? autocommit与BEGIN的设置怎么样... COMMIT?你甚至做过提交吗?或者时间是否包括回滚?!在每个SHOW CREATE TABLE之后提交并不是一个好主意,因为它有很大的开销。

设置是否调整得最佳?

表格中是否有数据?你插入“在最后”?还是随机的?

如果你已经回答了所有这些问题,我可能会有另外10个问题,这些问题将表明可以采取进一步的措施来使你的基准“证明”一个供应商或其他更快。< / p>