2016-05-02 9 views
-2

Oracle 11gR2とMysql 5.6の間に少しの相違があります。OracleがMysqlより高速に挿入する理由

は私が --loan ローンは、クライアントへの外部キーを持っており、それらのすべてが持っているほか、クライアントは、ブランチへの外部キーを持つ --branch --client 3つのテーブルと、両方のDBMSで同じスキーマを作成します主キー。

私はブランチを作成し、クライアント(200_000クライアント)と私は約50列からなるローンテーブルを使用してパフォーマンスを挿入したいと考えています。

clolumnsの大部分は、doubleまたはintegerまたはstringです。 MySQLで

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; 

手順はほぼ同じで、私はちょうど値のために、ネイティブの乱数発生器を使用していました。

私はOracleで並列実行を無効にし、キャッシュをフラッシュし、mysqlでキャッシュも無効にします。

しかし、50000個の挿入の結果、Oracleは15秒対30秒のMySQLを持っています。

何故ですか、お手伝いできますか?

+1

1000理由、1つはサーバーの設定 –

+5

Hmmmです。 。 。オラクルは、製品に膨大な資金を投入してきた企業から、30年以上にわたって継続的な改善を行ってきました。なぜフリーソフトウェアより速いのか不思議ですか? –

+0

@BerndBuffen、私のdbmsには等しい条件がないと言うでしょうか?私はそれをどのように解決できますか? – jenius

答えて

1

一度に100行ずつ「バッチ」すると、MySQLは3秒でそれを実行できます。おそらくLOAD DATAでさらに速くなります。

どのくらいの頻度で50K行を挿入する必要がありますか?言い換えれば、それはなぜ重要なのでしょうか?

私たちに表示SHOW CREATE TABLE;インデックスの有無に関わらず、データ型、特に「エンジン」にはさまざまな問題(好悪または不利)がある可能性があります。

「完了しましたか? OracleとMySQLの両方は、あなたが待つことを避けるために、「遅延書き込み」でいくつかの変種を実行します。持続可能であってもなくてもよい。

スピニングドライブまたはSSDを使用していましたか?書き込みキャッシュとRAID?オートコミットとBEGIN ... COMMITの設定はどうですか?あなたもコミットしましたか?または、タイミングにロールバックが含まれていますか?各INSERTの後にコミットするのは良い考えではありません。

設定が最適に調整されましたか?

テーブルには既にデータがありますか?あなたは「最後に」挿入しましたか?またはランダムに?

これらすべての質問に答えると、さらにベンダーマークが1つのベンダーまたは他のの方が速いことを証明できるようになることを示す10の質問があります。

関連する問題