私はデータベースの経験がなく、「n + 1 selects issue」について読んだばかりです。フォローアップの質問:データベースがプログラムと同じマシンにあり、RAM にキャッシュされ、適切にインデックスが作成されていると仮定すると、n+1 クエリ パターンが遅いのはなぜですか?
例として、受け入れられた回答からコードを取り上げましょう。
SELECT * FROM Cars;
/* for each car */
SELECT * FROM Wheel WHERE CarId = ?
私のデータベース キャッシュのメンタル モデルでは、各SELECT * FROM Wheel WHERE CarId = ?
クエリに次のものが必要です。
- "Wheel" テーブルに到達するための 1 回のルックアップ (1 つのハッシュマップ
get()
) CarId
指定された(別の hashmapget()
)を持つ k ホイールのリストに到達するための 1 回のルックアップ- 一致する各ホイールのホイール行を取得するための k 回のルックアップ (k ポインターの参照解除)
内部メモリ構造のために追加のオーバーヘッドのために小さな定数係数を掛けたとしても、それでも目立たないほど高速になるはずです. プロセス間通信がボトルネック?
編集: Hacker News でこの関連記事を見つけました: Postgres Internals による Select ステートメントの追跡。- HN ディスカッション スレッド。
編集2:明確にするために、私は大きいと思いますN
。自明ではないオーバーヘッドが追加されると、顕著な遅延が発生します。上記の設定で、そもそもオーバーヘッドがそれほど重要ではない理由を尋ねています。