자격증/SQLP

[SQLP 친절한 SQL 튜닝 정리] 5장- 소트튜닝(소트가 발생하지 않도록 SQL 작성)

90만식 2025. 2. 12. 00:28
728x90
SQLP를 준비하며 "친절한 sql 튜닝" 책 5장 소트튜닝 소트가발생하지 않도록 SQL 작성 부분을 정리한 내용 입니다.
친절한SQL튜닝 도서

5장-소트튜닝

5.2 소트가 발생하지 않도록 SQL 작성

 

5.2.1 Union vs Union All

  • Union : 상단과 하단 두 집합 간 중복을 제거하려고 소트 작업을 수행한다.
  • Union All : 중복을 확인하지 않는 단순 두 집합을 결합 하기 때문에 소트 작업을 수행하지 않는다,
  • 즉, 소트를 발생시키지 않는 Union All을 사용해야 한다.

Union All 주의 사항

SELECT 결제번호, 주문번호, 결제금액, 주문일자
FROM 결제
WHERE 결제수단코드 = 'M'
AND 결제일자 = '20180316'
UNION
SELECT 결제번호, 주문번호, 결제금액, 주문일자
FROM 결제
WHERE 결제수단코드 = 'C'
AND 결제일자 = '20180316'

  • PK가 결제수단 일 경우 위 SQL Union 상단과 하단 집합 사이에 인스턴스 중복 가능성은 없다.
  • 그런데도 Union을 사용 해 소트 연산을 발생 시키고 있다.
  • 위아래 두 집합이 상호 배타적으로 Union All로 대체해도 된다.
SELECT 결제번호, 결제수단코드, 주문번호, 결제금액
FROM 결제
WHERE 결제일자 = '20180316'
UNION ALL
SELECT 결제번호, 결제수단코드, 주문번호, 결제금액
FROM 결제
WHERE 주문일자 = '20180316'
AND 결제일자 <> '20180316'

  • Union ALL 하위 SQL 그룹에 조건절 AND 결제일자<> '20180316' 넣지 않으면, 상단과 하단 집합 사이에 인스턴스 중복 가능성이 있다.
  • 조건절 AND 결제일자<>'20180316'을 추가 하고 UNION을 UNION ALL로 변경 하면 소트 연산을 피할 수 있다.

NULL 허용 컬럼

--- SQL 1
AND (결제일자 <> '20180316' or 결제일자 is null)

-- SQL 2
AND LNNVL(결제일자 = '20180316)
  • 결제일자가 NULL 허용 컬럼일 경우 SQL1 의 쿼리를 SQL2 쿼리처럼 변경 해야 한다.

 

5.2.2 Exists 활용

 

Distinct 연산자의 사용

Distinct 연산자를 사용하면 조건에 해당하는 데이터를 모두 읽어 중복을 제거 하기 때문에, 부분범위 처리가 불가 하며 모든 데이터를 읽는 과정에 많은 I/O가 발생한다

 

Distinct 쿼리 변경

  • Distinct는 Exists 서브 쿼리문으로 변경 할 수 있다.
  • Exists 서브 쿼리는 데이터 존재 여부만 확인하면 되기 때문에 조건절을 만족하는 데이터를 모두 읽지 않는다.
  • Exists를 사용하면 상품유형코드 조건절에 해당하는 상품에 대해 계약일자 조건 기간에 발생한 계약 중 계약구분코드 조건절을 만족하는 데이터가 한건이라도 존재하는지만 확인

Minus 쿼리 변경

  • Minus 연산자도 Not Exists 서브 쿼리로 변환해서 튜닝 가능하다.
728x90