ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7장 서브쿼리
    DB & SQL/SQL 레벨업 2023. 8. 8. 11:10

    21. 서브쿼리가 일으키는 폐해

    - 서브쿼리란 SQL 내부에서 작성되는 일시적인 테이블이다

    - SQL은 테이블과 서브쿼리를 같은 것 취급한다. ( 기능적인 관점에서 )

    - 테이블, 뷰, 서브쿼리의 차이점

        ㆍ테이블 : 영속적인 데이터를 저장

        ㆍ뷰 : 영속적이지만 데이터는 저장하지 않음, 따라서 접근할 때마다 SELECT 구문이 실행됨

        ㆍ서브쿼리 : 비영속적인 생존 기간(스코프)이 SQL 구문 실행 중으로 한정

     

    1. 서브쿼리의 문제점

    - 서브쿼리의 성능적 문제는 결과적으로 서브쿼리가 실체적인 데이터를 저장하고 있지 않다는 점에서 기인한다.

     

    연산 비용 추가

    - 실체적인 데이터를 저장하고 있지 않다는 것은 서브쿼리에 접근할 때마다 SELECT 구문을 실행해서 데이터를 만들어야 한다는 뜻이다

    - 따라서 SELECT 구문 실행에 발생하는 비용이 추가된다.

     

    데이터 I/O 비용 발생

    - 연산 결과는 어딘가에 저장하기 위해 써두어야 한다.

    - 메모리 용량이 충분하다면 이러한 오버헤드가 적지만, 데이터양이 큰 경우등에는 DBMS가 저장소에 있는 파일에 결과를 쓸 떄도 있다.

    - TEMP 탈락 현상의 일종이라고 말할 수 있는데, 이렇게 되면 저장소 성능에 따라 접근 속도가 급격하게 떨어진다.

     

    최적화를 받을 수 없음

    - 서브쿼리로 만들어지는 데이터는 구조적으로 테이블과 차이가 없다.

    - 하지만 명시적인 제약 또는 인덱스가 작성되어 있는 테이블과 달리, 서브쿼리에는 그러한 메타 정보가 하나도 존재하지 않는다.

        ㆍ따라서 옵티마이저가 쿼리를 해석하기 위해 필요한 정보를 서브쿼리에서 얻을 수 없다.

     

    2. 서브쿼리 의존성

    서브쿼리의 단점

    - 1. 코드가 복잡해서 읽기 어렵다

    - 2. 성능

        ㆍ1. 서브쿼리는 대부분 일시적인 영역(메모리 또는 디스크)에 확보되므로 오버헤드가 생긴다.

        ㆍ2. 서브쿼리는 인덱스 또는 제약 정보를 가지지 않기 때문에 최적화되지 못한다.

        ㆍ3. 이 쿼리는 결합을 필요로 하기 때문에 비용이 높고 실행 계획 변동 리스크가 발생한다.

        ㆍ4. 테이블에 스캔이 두 번 필요하다.

     

    3. 장기적 관점에서의 리스크 관리

    - 옵티마이저가 이해하기 쉽게 쿼리를 단순하게 작성해야 한다.

     

    - 실행 계획이 단순할수록 성능이 안정적이다.

    - 엔지니어는 기능(결과)뿐만 아니라 비기능적인 부분(성능)도 보장할 책임이 있다.

     

    4. 서브쿼리 의존증 - 응용편

    5. 서브쿼리는 정말 나쁠까?

    - 서브쿼리 자체가 나쁜 것이 아니다.

    - 게다가 서브쿼리를 사용하지 않으면 해결할 수 없는 상황도 많다.

     


    22. 서브쿼리 사용이 더 나은 경우

    - 서브쿼리를 사용하는 편이 성능 측면에서 더 나은 경우

        ㆍ결합과 관련된 쿼리 - 결합할 때는 최대한 결합 대상 레코드 수를 줄이는 것이 중요하다.

     

    1. 결합과 집약 순서

    - 결합 대상 레코드 수를 집약하는 편이 I/O 비용을 더 줄일 수 있다.

    - 튜닝 선택지 중 하나로 '사전에 결합 레코드 수를 압축한다' 라는 방법이 있다.

     


    마치며..

    - 서브쿼리는 복잡한 문제를 분할할 수 있는 편리한 도구지만, 결합을 늘리는 성능 악화를 일으킬 수 있음

    - SQL 성능을 결정하는 요인은 I/O가 절대적

    - 서브쿼리와 결합을 원드우 함수로 대체하면 성능을 개선할 가능성이 있음

    - 서브쿼리를 사용할때는 결합 대상 레코드 수를 사전에 압축해서 성능을 개선할 수 있음

    'DB & SQL > SQL 레벨업' 카테고리의 다른 글

    9장 갱신과 데이터 모델  (0) 2023.08.09
    8장 SQL의 순서  (0) 2023.08.08
    6장 결합  (0) 2023.08.08
    5장 반복문  (0) 2023.08.07
    4장 집약과 자르기  (0) 2023.08.07

    댓글

Designed by Tistory.