일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 베스트앨범 파이썬
- 백준 1034 램프 파이썬
- 백준 1613 역사
- 프로그래머스 순위
- SQL SERVER 장비교체
- 백준 2352 반도체 설계 파이썬
- 프로그래머스 등굣길
- 순위 파이썬
- SWEA
- 램프 파이썬
- 백준 1167 트리의 지름 파이썬
- 트리의 지름 파이썬
- 프로그래머스 가장 긴 팰린드롬
- 백준 2146 다리 만들기
- SQL SERVER MIGRATION
- 백준 1516 게임 개발
- 프로그래머스 베스트앨범
- 백준 11054.가장 긴 바이토닉 부분 수열
- 프로그래머스 순위 파이썬
- 다리 만들기 파이썬
- 가장 긴 바이토닉 부분 수열 파이썬
- 백준 1238 파티 파이썬
- 반도체 설계 파이썬
- 게임 개발 파이썬
- 가장 긴 팰린드롬 파이썬
- 프로그래머스 여행경로
- 다중 컬럼 NOT IN
- 역사 파이썬
- 백준 1043 거짓말 파이썬
- 등굣길 파이썬
Archives
- Today
- Total
공부, 기록
[SQL Server] 쿼리 개선 - UNION ALL -> OR 조건으로 수정 본문
DETAIL 테이블의 ParentDetailNo 컬럼으로 조건 조회를 하면서 테이블 풀스캔이 발생함.
해당 테이블에 인덱스 추가 또는 조건절 변경이 필요.
ParentDetailNo 컬럼은 해당 SP에서만 조회 조건으로 사용이 됨(인덱스 설정시 사용하는 쿼리가 하나..)
DETAIL 테이블과 MASTER 테이블 은 1:N 관계이고 MASTER 테이블의 PK 는 ParentDetailNo 컬럼 1:N 관계
MASTER 테이블 DETAIL 테이블 존재 관계는 1: N 또 DETAIL 테이블 내에서 하나의 PK는 여러 다른 ROW의 부모 값이 될 수 있는 상황
위 상황에서 DETAIL 테이블에 새로운 조건으로 WHERE 절이 추가되었고 해당 컬럼은 인덱스가 없는 상태에서 UNION ALL로 처리가 되고 있었음.
구성
테이블 : MASTER, DETAIL-> 1:N 관계
MASTER PK = MasterNo
DETAIL PK = DetailNo. DetailNo는 N개의 다른 행의 ParentDetailNo 가 될 수 있다.입력값은 @pi_intDetailNo 만 인입 되는 상황
기존 쿼리
SELECT *
FROM MASTER AS M WITH(NOLOCK)
JOIN DETAIL AS D WITH(NOLOCK) ON M.MasterNo = D.MasterNo
WHERE D.DetailNo = @pi_intDetailNo
UNION ALL
SELECT *
FROM MASTER AS M WITH(NOLOCK)
JOIN DETAIL AS D WITH(NOLOCK) ON M.MasterNo = D.MasterNo
WHERE D. ParentDetailNo = @ pi_intDetailNo
-> 드라이빙 테이블인 MASTER 테이블을 WHERE 조건에서 MasterNo 조회 범위를 줄여주면 인덱스를 사용할것이고 드라이븐 테이블인 DETAIL 테이블은 JOIN 조건에서 사용되는 MasterNo 컬럼의 인덱스를 사용할 것이므로 WHERE 조건에서 DETAIL 테이블은 필터 조건으로만 사용이 될 것으로 생각하였다.
개선 쿼리
SELECT @v_MasterNo = MasterNo
FROM DETAIL WITH(NOLOCK)
WHERE DetailNo = @pi_intDetailNo
SELECT *
FROM MASTER AS M WITH(NOLOCK)
JOIN DETAIL AS D WITH(NOLOCK) ON M.MasterNo = D.MasterNo
WHERE M. MasterNo = @v_MasterNo
AND (D. DetailNo = @pi_intDetailNo OR D.ParentDetailNo = @pi_intDetailNo)
결국 대부분의 경우 드라이빙 테이블과 드라이븐 테이블에 대해 생각하는게 중요하며 인덱스는 테이블당 대부분의 경우 하나만 사용이 되므로 UNION ALL 없이 OR 조건으로 별도 인덱스 생성 없이 처리가 가능했다.
'공부 > DATABASE' 카테고리의 다른 글
[SQL Server] 쿼리 개선 - SP RECOMPILE 추가 (0) | 2024.01.31 |
---|---|
[SQL Server] 운영 개선건 - 분기 단위 대량 작업의 마이크로 배치화 (0) | 2024.01.30 |
[MySQL] pt-osc를 통한 일반 테이블 파티셔닝으로 전환 (0) | 2024.01.30 |
Redis 기본 공부 (0) | 2024.01.28 |
Redis Cluster Test (0) | 2024.01.28 |