- 출처 : 자바서비스넷 -
http://www.javaservice.net/~java/bbs/read.cgi?b=qna2&c=r_p&m=resource&n=1122623557&s=t
제목 : Re: N+1조회문제가 뭔가요? 글쓴이: 이희승(anoripi) 2005/07/30 07:38:23 조회수:238 줄수:24 |
구글에서 N + 1 query issue 로 검색하니 나오네요. ORM 툴들은 보통 lazy loading 을 합니다. 그런데 lazy loading 이란 건 사용자가 예기치 않게 데이터를 원하게 될 때만 유용합니다. 즉, lazy loading 할 데이터가 사실은 사용자가 의도적으로 한 번에 다 읽고 싶은 데이터였다면? (i.e. join 을 통한 explicit fetching) 이 때는 lazy loading 의 성능이 훨씬 떨어지게 되는데, 왜냐하면, 오리지널 쿼리 1 개 + 셀렉트된 row 에 대한 각각의 쿼리 N 개 가 발생하기 때문입니다. (부서쿼리가 오리지널 쿼리이고, 부서에 소속한 사원 쿼리를 각 부서에 대해 따로 수행한다고 생각하시면 됩니다.) 이것을 N+1 이슈라고 부릅니다. 만약 Department 라는 빈에 getEmployees() 라는 메소드가 있을 경우, iBatis 의 경우에는 lazy loading 없이 한 번의 쿼리로 데이터를 가져올 수 있는지 잘 모르겠습니다만, 만약 그렇다면 N+1 이슈를 갖고 있는 것이겠지요. (이부분에 대한 아시는 분의 답변이 필요합니다.) 반대로 Hibernate 와 같은 프레임워크는 iBatis 와는 달리 hbm.xml 파일에 디비 매핑 정보가 상세히 기술되어 있어 좀 더 똑똑하게, 또는 사용자가 원하는 대로 튜닝이 가능하다는 뜻인 듯 합니다. |