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で個別に実行
SQLのパースをするためにSQL::Statmentを使っているのですが、SQL::Statmentを使ってSQL文を解析するほうが、個別にexecuteするよりコストがかかっていると思われます。
他にもっと効率よくSQLをパースできればいいのですが。。。。