querysetで複数updateしたいならbulk_updateの方が早いから使うべき

今回はquerysetで複数のデータに対してupdateしたいならbulk_updateの方が早いから使うべきということについてお話ししていきたいと思います。



querysetで複数updateしたいならbulk_updateの方が早いから使うべき

querysetで複数のデータに対してupdateしたいならbulk_updateの方がパフォーマンスが良いためbulk_updateを使うべきです。

今回はupdateとbulk_updateでどれくらい実行時間が異なるのか調査してみました。

調査に当たって以下のソースを準備しました。

create_data()は下準備のための関数です。
Bookモデルを使ってパフォーマンスの調査をしますが、create_data()でBookオブジェクトを1万個生成いたします。

update_test()はquerysetのupdate()をする関数です。
update()を1万個のBookオブジェクトに対して片っ端から行います。
また、timeモジュールを使ってupdate_test()の実行時間を計測します。

bulk_update_test()はquerysetのbulk_update()をする関数です。
update_test()と同じように1万個のBookオブジェクトに対して処理を行い、実行時間を計測します。

create_data()を使って1万個のBookオブジェクトを生成したのち、update_test()を3回行ってみましょう。
なお、一回処理を行うごとにオブジェクトを一旦すべてdeleteして再度create_data()を使って1万個のBookオブジェクトを生成し直しております。

update_test()を3回実行した結果はこちらです。

上記の結果より、update_test()の実行時間は16秒前後という結果になりました。

一方、bulk_update_test()を3回実行してみます。
update_test()と同じように1万個のBookオブジェクトに対して処理を行い、一回処理を行うごとにオブジェクトを一旦すべてdeleteして再度create_data()を使って1万個のBookオブジェクトを生成し直すということをします。

bulk_update_test()を3回実行した結果は次の通りです。

bulk_update_test()の実行時間は2秒程度です。
update()よりもbulk_update()の方が断然早いということが分かりますね。

querysetで複数のオブジェクトに対して更新したいときはupdate()よりもbulk_update()を使用するようにしましょう。

終わりに

今回はquerysetで複数updateしたいならbulk_updateの方が早いから使うべきということについてお話しいたしました。

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いいたします。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。






Django

Posted by ちこ