조기 로딩

(조기 로딩 (ORM)에서 넘어옴)

1 개요[ | ]

eager loading, preloading
eager 로딩, 이거 로딩, 이른 로딩, 즉시 로딩, 사전 로딩, 선행 로딩, 조기 로딩, 프리로딩
  • 로딩시 참조해야 하는 정보를 미리 명시하는 일
  • N+1 쿼리 문제의 해결을 통해 성능 향상
  • ORM 활용시 흔히 발생할 수 있는 N+1 문제 해결 가능
  • 대략 지연 로딩의 반대되는 개념이다.

2 예시[ | ]

2.1 라라벨[ | ]

N+1 쿼리 상황
foreach (Book::all() as $book)
{
    echo $book->author->name;
}
Book::all()에는 author 정보가 없어서 Book 건수만큼 쿼리 추가 수행 (1+N회)
SELECT * FROM books;
SELECT * FROM authors WHERE id=1;
SELECT * FROM authors WHERE id=2;
SELECT * FROM authors WHERE id=3;
... (생략)
eager 로딩 적용
foreach (Book::with('author')->get() as $book)
{
    echo $book->author->name;
}
Book::with('author')에서 author 정보를 사용하겠다고 미리 알려줌으로써 쿼리 최소화 (2회)
SELECT * FROM books;
SELECT * FROM authors WHERE id IN (1, 2, 3, ...);

2.2 Ruby On Rails[ | ]

keywords = Keyword.all
keywords.each do |keyword|
  keyword.user.id
end
→ (테이블 관계 설명) keywords 테이블에는 users 테이블과 연결시킬 외래키 컬럼을 가지고 있습니다.
keywords에는 user.id 정보가 없어서 keyword 건수만큼 쿼리 추가 수행 (1+N회)
Keyword Load (2.4ms)  SELECT "keywords".* FROM "keywords"
  User Load (4.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 9], ["LIMIT", 1]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 12], ["LIMIT", 1]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 15], ["LIMIT", 1]]
... (생략) ...
preload(선행 로딩) 적용
keywords = Keyword.preload(:user)
keywords.each do |keyword|
  keyword.user.id
end
Keyword.preload(:user)에서 users 테이블의 정보를 사전에 사용하겠다고 알려줌으로써 쿼리 최소화 (2회)
Keyword Load (0.6ms)  SELECT "keywords".* FROM "keywords" LIMIT $1  [["LIMIT", 11]]
  User Load (1.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN ($1, $2, $3, $4, $5, $6)  [["id", 9], ["id", 12], ["id", 15], ["id", 29], ["id", 28], ["id", 24]]

3 같이 보기[ | ]

4 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}