1. ホーム
  2. orm

[解決済み] ORM(Object-Relational Mapping)における「N+1 selects問題」とは?

2022-03-14 12:39:10

質問

オブジェクトリレーショナルマッピング(ORM)の議論では、一般的に「N+1セレクト問題」が問題視されていますが、オブジェクトの世界では単純に見えることでも、データベースへの問い合わせを多くしなければならないことと関係があるのだと理解しています。

どなたか、この問題についての詳しい説明をお持ちの方はいらっしゃいませんか?

解決方法を教えてください。

のコレクションがあるとします。 Car オブジェクト (データベース行) があり、それぞれの Car のコレクションを持っています。 Wheel オブジェクト(行でもある)を作成します。 言い換えれば CarWheel は1対多の関係です。

ここで、すべての車を繰り返し処理し、それぞれの車について、ホイールのリストを出力する必要があるとします。素朴なO/R実装では、次のようになります。

SELECT * FROM Cars;

そして に対して、それぞれの Car :

SELECT * FROM Wheel WHERE CarId = ?

つまり、Carsのselectが1つあり、さらにN個のselectがあり、ここでNは車の総数です。

あるいは、すべてのホイールを取得し、メモリ内でルックアップを実行することもできます。

SELECT * FROM Wheel

これにより、データベースとの往復回数がN+1回から2回に減少します。 ほとんどのORMツールは、N+1セレクトを防ぐためのいくつかの方法を提供しています。

参考にしてください。 HibernateによるJavaの永続化 第13章をご覧ください。