【问题标题】:Why Oracle insert faster than Mysql为什么Oracle插入比Mysql快
【发布时间】:2016-08-27 04:05:46
【问题描述】:

我对 oracle 11gR2 和 Mysql 5.6 进行了一点比较。

我在两个 DBMS 中使用 3 个表创建相同的架构 - 分支 - 客户 - 贷款 贷款有一个外键给客户,一个客户有一个外键给分行,而且它们都有主键。

我创建了分支机构和客户(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 中有 15 秒和 30 秒的结果。

什么原因,你能帮忙吗?

【问题讨论】:

  • 1000个原因,一个是服务器配置
  • 嗯。 . .甲骨文拥有超过 30 年的持续改进,这家公司在产品上投入了大量资金。你很好奇为什么它比免费软件更快?
  • @BerndBuffen,我猜你会说,我的 dbms 不具备同等条件?我该如何解决?
  • 附注:如果不是真的需要,不要使用近似浮点数据类型。两种 DBMS 都提供精度超过 60 位的精确十进制数据类型。
  • 查看 MySQL 中的执行计划:EXPLAIN .... 或打开分析:SET profiling=on;显示配置文件......瓶颈是什么。在 my.cnf 中更改它并重试。我几乎可以肯定 MySQL 更快,但 Oracle 有更多功能

标签: mysql sql performance oracle11g sql-insert


【解决方案1】:

如果您一次“批处理”100 行,MySQL 可以在 3 秒内完成。使用LOAD DATA 可能会更快。

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

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

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

您使用的是旋转驱动器还是 SSD?带写缓存的 RAID?自动提交与 BEGIN...COMMIT 的设置如何?你甚至做了一个承诺吗?或者时间是否包括回滚?!在每个 INSERT 之后提交并不是一个好主意,因为它的开销很大。

设置是否优化?

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

当您回答了所有这些问题后,我可能还有另外 10 个问题,这些问题将表明可以做进一步的事情来使您的基准“证明”一个供应商或另一个更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多