JPA/hibernate

hibernate入門を読んだ。JPAのN+1問題の解決方法

投稿日:2017年12月21日 更新日:

この本をkindleで読んだ。お勧めしておきます。著者はケンブリッジ大学の理系出身。

常にN+1SELECTが悪いわけではなく、むしろいい意味で処理が分散して処理が高速化したり、より安定することもあります。

FetchMode.SELECT

コレクションにアクセスする度にSELECTする。つまり、N+1問題が発生する。

FetchMode.JOIN

OUTER JOINにより、1回でコレクションも取得する。つまり、N+1問題は起きない。

FetchMode.SUBSELECT

関連コレクションは別SELECTで取得する。つまり、N+1は起きない。コレクションの数(コレクション内の要素の数ではない)だけ、SELECTが発行される。

JOINまたはSUBSELECTを使用するには、Criteria API を使用する必要がある。

双方向の関連の設計においては、N+1問題は避けられないことが多々あります。しかし実際問題として、N+1が悪者にされる程なのかというと議論の余地があります。理由としては、サブクエリーやJoin節の処理は早いほうではなく、一つ一つSELECT文でレコードを取得するほうが、高速に処理できることがあります。

N+1問題はJPA関連の記事です必ず目にするが、問答無用で悪いものではない。

-JPA/hibernate

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Spring-data-JPA/hibernateを案件で使ってみて得た知識

ORMが解決するのは、オブジェクトの相関関係とデータベースの相関関係がミスマッチすること。 基本的にはORMを使うなら、既存のDB構造(スキーマ)を、ORMには合わせる、つまりオブジェクトの相関関係に …

no image

Spring-boot-JPAの実行SQLをログ出力する

せっかくJPA導入したのだから、ネイティブSQLは使用しない方がいいです。 しかし、データストアがRDBの場合は、パフォーマンスチューニングや開発時に欲しいデータが取れない場合は、SQLを見直したい時 …

no image

Spring-data-JPAかmy-batisか

JPAとJDBCは異なるもの。 両方使うことも出きるし、片方だけ使うこともできる。 Springboot使い始めると、JPA使うか否かの選択になります。 言い換えると、SQL使うか否かですね。 私の意 …

no image

N+1問題でJPAを諦めるのはもったいない

JPAを実案件で使ってみて。時間をかけて勉強することが必ず必要となる。 自分はいきなりJPAで組むことになった。最初はJPQL使わずにJPAPepositoryの標準メソッドだけでごまかしごまかしやっ …