[SQLP필기풀이]4장 조인튜닝(4)-고급조인기법

Yu River·2022년 7월 31일
0

SQLP필기연습

목록 보기
14/35

✍️ 45번 : 조인튜닝-고급조인기법

아래 SOL에 대한 튜닝 방안으로 가장 부적절한 것을 고르시오.

[데이터]
지점 : 30개
판매내역 : 월 평균 3만 건

[인덱스 구성]
지점_PK : 지점코드
판매내역_PK : 판매지점코드 + 판매월
판매내역_X1 : 판매월

[sql]
SELECT A, 지점명, SUM(B. 판매금액) 판매금액
FROM 지점 A, 판매내역 B
WHERE A, 지점코드 = B.판매지점코드
AND B. 판매월 BETWEEN '202101' AND '202103'
GROUP BY B.판매지점코드, A.지점명
ORDER BY 1,2 ;

  1. GROUP BY의 'B.판매지점코드'를 'A.지점코드'로 변경한다. 👉 ❌
  2. 조인 순서를 변경한다. 👉 ⭕️
  3. 판매월 조건을 만족하는 판매내역을 지점코드로 GROUP BY 한 후 지점 테이블과 조인하도록 SQL을 변환한다. 👉 ⭕️
  4. 해시 조인으로 유도한다. 👉 ⭕️

🍋 기출 포인트

  1. 현재 SQL의 가장 큰 문제점은 같은 지점코드에 대한 반복적인 조인 액세스가 많다는 데 있다.
  2. 다량의 판매내역을 읽으면서 작은 지점 테이블과 조인하기 때문에 생기는 현상이다.
  3. GROUP BY에 'B.판매지점코드' 기술하든 'A.지점코드'를 기술하든 성능과는 무관하다.

🍒 문제 해설

  1. 지점 테이블을 먼저 읽은 후 판매내역과 NL 조인한다면, 조인 액세스를 30번으로 줄일
    수 있다.
    마침 판매내역_PK 인덱스가 판매지점코드 + 판매 구성돼 있어 성능 개선이 가능하다
    .
  2. 해시 조인으로 유도하면 작은 지점 테이블로 PGA에 해시맵을 만들어서 조인하게 되므로
    SGA 버퍼 캐시를 반복해서 탐색하는 비효율을 제거할 수 있다.
  3. 3번 선지의 경우와 같이 SQL을 변환하면, 조인 액세스를 지점별로 한 번씩만 할 수 있어 성능 개선에 큰 도움이 된다. 단, 인라인 뷰가 Merging 되면 쿼리가 원래 형태로 돌아가므로 반드시 실행계획을 확인하고, 필요하다면 NO_MERGE 힌트로 뷰 Merging을 방지해 줘야 한다.

✍️ 46번 :

아래와 같이 SQL 튜닝하였다.개선 효과가 극대화되기 위해 만족해야 할 전제조건을 올바르게 나열하시오.

--[튜닝 전 SQL]
select c. 고객번호, min(c.고객명) 고객명 , sum(o.주문금액) 주문금액
from 주문 o, 고객 c
where o.주문일시 > add_months(sysdate, -1)
and c.등록지점코드 = 'KTG'
andc.고객번호 = o.고객번호
group by o. 고객번호 ;

--[튜닝 후 SQL]
select c.고객번호, c.고객명, o.주문금액
from (
  select 고객번호, sum(주문금액) 주문금액
  from 주문
  where 주문일시 >= add_months(sysdate, -1)
  group by 고객번호) o, 고객 c
where c.고객번호 = 0. 고객번호
and c. 등록지점코드 = 'KTG'

[ 성능 개선을 위한 전제조건 ]) 고객당 하루 주문 건수가 많다.) 고객당 하루 주문 건수가 적다.) 주문일시 조건을 만족하는 데이터가 많다.) 주문일시 조건을 만족하는 데이터가 적다.) 등록지점코드 조건을 만족하는 데이터가 많다.) 등록지점코드 조건을 만족하는 데이터가 적다.	
  1. 가) 고객당 하루 주문 건수가 많다. 👉 ⭕️
  2. 다) 주문일시 조건을 만족하는 데이터가 많다. 👉 ⭕️
  3. 마) 등록지점코드 조건을 만족하는 데이터가 많다. 👉 ⭕️

🍋 기출 포인트

  1. [튜닝 후 SQL]의 성능 개선 효과를 극대화하려면, ① 고객당 하루 주문 건수가
    많아야 하고, ⑦주문일시 조건을 만족하는 데이터가 많아야 하며, ③등록지점코드 조건을
    만족하는 데이터도 많아야 한다.
  2. 소수의 고객이 여러 번 반복해서 주문하는 쇼핑몰이라면 [튜닝 전 SQL]은 같은 고객에 대해 여러 번 반복해서 고객 테이블과 조인하는 비효율이 나타난다.
  3. 주문일시 조건을 만족하는 데이터가 많을수록 같은 고객이 더 여러 번 반복해서 나타나므로 비효율도 커진다.
  4. [튜닝 후 SQL] 처럼 고객번호로 GROUP BY 한 후에 조인하면 고객별로 한 번씩만 조인할 수 있어 성능 개선에 큰 도움이 된다.
  5. 다수의 고객이 어쩌다 한번 주문하는 쇼핑몰이라면, [튜닝 후 SQL]처럼 고객번호
    로 GROUP BY 한 후에 조인했을 때의 이점이 사라진다.주문일시 조건절 구간에 같은 고객이
    여러 번 나타나지 않기 때문이다.
  6. 등록지점코드 조건을 만족하는 고객이 소수일 때 [튜닝 후 SQL]은 더 불리해진다.한 달 치 주문 데이터를 모두 읽어서 GROUP BY 한 후에 고객 테이블과 조인했는데, 대부분 고객이 등록지점코드 조건을 만족하지 않아 필터링 되기 때문이다.
profile
도광양회(韜光養晦) ‘빛을 감추고 어둠속에서 힘을 기른다’

0개의 댓글