더북(TheBook)

가끔은 조인이 싫다고 말하자

NoSQL 모델을 설계할 때 ‘절대로’라는 말을 절대로 사용하지 말아라. 확장성이 좋고 관리가 쉬운 애플리케이션을 개발할 때 유용한 모범 사례, 지침, 설계 패턴이 있다. 이 중 어떤 것도 반드시 따라야 하는 것은 아니다. 특히, 그런 모범 사례나 지침, 설계 패턴을 따르면 성능이 더 개선되고 기능이 더 좋아지며 유지 관리를 더 잘할 수 있다는 증거가 없다면 말이다.

애플리케이션 요구 사항이 관련 정보를 둘 이상의 컬렉션에 저장하는 것이라면 그 선택을 따르도록 해라. 애플리케이션 코드에서 조인을 구현할 수 있다. 가장 나쁜 시나리오는 크기가 큰 컬렉션 두 개를 for 루프 두 개와 조인하는 것이다. 다음을 보자.


for doc1 in collection1:
  for doc2 in collection2:
      <두 문서에 대한 처리>

컬렉션1에 문서 N개가 있고 컬렉션2에 문서 M개가 있다면 이 문장은 NxM번 실행될 것이다. 이 루프 실행 시간은 급속히 늘어날 수 있다. 첫 번째 컬렉션에 문서 100,000개가 있고 두 번째 컬렉션에 500,000개가 있다면 이 문장은 50,000,000,000(=5×105)번 실행될 것이다. 이렇게 큰 컬렉션을 다루고 있다면 인덱스를 사용하고 필터를 걸고, 어떤 경우에는 정렬까지 해서 전체적인 작업 수행 횟수를 줄여 조인을 최적화하고 싶을 것이다(그림 8-6).

▲ 그림 8-6 컬렉션 하나에 있는 모든 문서와 다른 컬렉션에 있는 모든 문서를 비교하는 단순 조인은 컬렉션의 크기가 크면 성능이 나빠질 수 있다. 이와 같은 조인은 인덱스를 사용해 필터를 걸고 어떤 경우에는 정렬을 하여 성능을 향상시킬 수 있다

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.