以前DBからのデータ取得問題でディフォルトだとlazy loadingが発生し、俗にいうN+1問題が発生するので、eagar loadingにすべきみたいな記事を書きました。
このときにlazy loadingってどんなメリットがあるのだろう・・と思っていたのですが、大量データをDBから取得する際に、メリットがあると気づきました。
eager loadingとlazy loading
そもそもの前提としてのeagerloadingとlazy loadingですが、一般的にはDBの例の中ででてくることが多いと思います。
例えばJOINなどでデータを取得する際が一番わかりやすいのですが、
eager loadingだと一気にデータを取得しますのでループでデータを発行する際などはイレギュラーなケースでなければ、基本eagerローディングが良いと思います。
よく出てくるのが以下の例だと思います。
eager loadingの場合データを取得する際にまとめてデータを取得するので、クエリの発行回数が少なくなります。
で、肝心のlazy loadingですが、そもそもの意図は遅延処理です。webページを読み込んだときに全てのデータを読み込んでから表示されるわけではなく、だんだんと表示されていきます。(画像なんかが多いページだとだんだん画像が表示されることがあるとおもいます。)
この場合、すべての画像を読み込むのが時間がかかるため、このような処理にしているのだと思います。
なのでDBからデータを取得する際も、効果を発揮するケースとしては、大量のデータを取得し、順々にループさせていく・・処理になります。chunkとほぼ同じですね・・
一般的には以下のように
- 大量データを取得する際に一気に読み込むとメモリを圧迫する
- 分割処理をすることでメモリを節約できる
などのケースで使います。