CubicLouve

Spring_MTの技術ブログ

INSERTをまとめて実行できるモジュールを書いて使ってみたらかえって遅くなった件

深遠な理由で手を入れられないコードで、DBへのINSERTをfor文で回して入れている部分があったのでそれを一回のINSERTで済むようできないかなあと思って試しにモジュールを書いて見ました。

まだ、全然テスト段階なので、関数の名前とかイケてないです >_<

例えば、

for (my $i = 0; $i < 100; $i++) {
    $iをINSERTする処理;
}

こんな感じになっているところを、

use DBIx::InsertMultiTranslator qw/intercept/;

intercept {
    for (my $i = 0; $i < 100; $i++) {
        $iをINSERTする処理;
    }
};

のようにDSLっぽく囲ってあげると、その中で実行されるINSERT文をまとめて最後に一回でbulk insertするようになります。

で、試しにベンチとってみたら、めっちゃ遅くなってしまってました。。。。

for vs multi

で、プロファイルを取ってみた結果が下記です。

  • まとめて実行

f:id:Spring_MT:20130924053418j:plain

  • forで個別に実行

f:id:Spring_MT:20130924053448j:plain

SQLのパースをするためにSQL::Statmentを使っているのですが、SQL::Statmentを使ってSQL文を解析するほうが、個別にexecuteするよりコストがかかっていると思われます。

他にもっと効率よくSQLをパースできればいいのですが。。。。