[책 공부] SQL 레벨업

1 minute read

책 소개

책 - SQL 레벨업

SQL 첫걸음 다음으로 본 책인 SQL 레벨업입니다. SQL 첫걸음보다 좀 더 SQL의 성능적인 측면에서 설명을 보충해주고 있습니다. DBMS 구조가 어떻게 되었는지, 왜 빠른지, 옵티마이저가 무엇인지 상세하게 설명해주고 있습니다. 이후에 애플리케이션 개발에 반드시 필요한 인덱스에 대해서도 배울 수 있습니다.

서브쿼리의 문제점

  • 연산 비용 추가: SELECT 구문 실행에 발생하는 비용이 추가되며, 서브쿼리의 내용이 복잡하면 실행비용이 더 높아진다.
  • 데이터 I/O 비용 발생: 연산 결과는 어딘가에 저장하기 위해 써두어야 하는데, 데이터양이 큰 경우 DBMS가 저장소에 있는 파일에 결과를 쓸 때도 있다.
  • 최적화를 받을 수 없음: 서브쿼리에는 메타정보가 없기 때문에 옵티마이저가 쿼리를 해석하기 위해 필요한 정보를 얻을 수 없다.

쿼리 작성이 편하다고 생각되어 서브쿼리를 남용하는 것이 있는데, 최대한 서브쿼리를 줄이는 것이 성능 최적화의 방향일 수 있다. 다만, 스칼라 서브쿼리는 이러한 성능에 덜 영향을 받는다. 그럼에도 실행계획(EXPLAIN)을 통한 성능 최적화를 살펴볼 필요가 있다.

인덱스

  • B-tree: B-tree 인덱스가 RDB에서 사용되는 이유는 균형이 잘 잡혀있으며, 대부분의 DB에서는 트리의 리프 노드에만 키값을 저장하는 B+tree 알고리즘을 채택한다. 즉, 트리의 깊이가 대개 3~4 정도의 수준으로 일정할 뿐 아니라, 데이터가 정렬 상태를 유지하므로 이분 탐색을 통해 검색 비용을 크게 줄일 수 있다.

카디널리티와 선택률

  • 카디널리티: 값의 균형, 카디널리티가 가장 높은 필드는 모든 레코드에 다른 값이 들어가 있는 유일키 필드이다.
  • 카디널리티가 높은 것이 인덱스의 후보이다.
  • 선택률이 낮을 것, 즉 한번의 선택으로 레코드가 조금만 선택되는 것이 좋은 후보이다.
  • 선택률이 10%보다 높다면 테이블 풀 스캔을 하는 편이 더 빠를 수 있다.

따라서 이 역시 실행계획(EXPLAIN)을 통해 성능 최적화가 필요하다.

Comments