일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 프론트컨트롤러
- 배치
- 디스패처서블릿
- HWPF
- 스프링
- java
- 함수
- 재귀멤버
- 아이
- 홈스쿨링
- transferTo
- SQLSTATE=42705
- XACT_STATE
- ERROR_MESSAGE
- 교육법
- 요약
- dm_exec_requests
- spring
- git
- SQL
- 요청매핑
- 자바
- renameTo
- TRANCOUNT
- 튜닝
- MSSQL
- XWPF
- getChannel()
- 앵커멤버
- 진경혜
- Today
- Total
필기노트
SQL 튜닝 - 조인 본문
1. NESTED LOOP JOIN
드라이빙 테이블로 선정된 테이블부터 WHERE절에 정의된 검색 조건을 만족하는 데이터들을 걸러낸 후, 이 값들을 가지고 조인 대상 테이블을 반복적으로 검색하면서 조인 조건을 만족하는 최종 결과값을 얻어 내는 방식을 말한다.
NESTED LOOP JOIN 방식으로 조인을 할 경우, 드라이빙 테이블의 조건을 만족하는 결과 데이터가 많다면 그만큼 반복해서 INNER TABLE에 접근해야 하므로 성능은 자연히 나빠질 것이다. 따라서 NESTED LOOP JOIN 방식을 채택할 때는 드라이빙 테이블의 선택이 매우 중요하며, 조인 순서에 대해서도 고려하는 것이 좋다.
또한 INNER TABLE의 조인 조건으로 사용될 컬럼에 인덱스가 존재하는지 여부도 성능을 좌우하는 중요한 요소이다. INNER TABLE의 조인 조건으로 사용되는 컬럼에 인덱스가 없을 경우, 드라이빙 테이블을 통해 도출된 결과 데이터가 아무리 적다고 해도, 도출된 각각의 데이터와 일치하는 행을 찾아내기 위해 INNER TABLE에 대한 FULL TABLE SCAN을 여러 차례 수행해야 하기 때문이다.
2. 서브쿼리
SELECT절에서 사용할 서브쿼리는 접근해야 할 대상 데이터가 적어서 다른 테이블과 조인하는 데 드는 비용이 적은 경우에만 쓰는 것이 좋다. SELECT절의 서브쿼리의 겨로가 건수만큼 반복해서 실행되어야 하기 때문에 1회 수행 시 드는 비용이 높으면, SQL의 전체 성능에 좋지 않은 영향을 끼칠 것이기 때문이다.
3. 집계용 테이블 생성
그룹핑 함수 SUM을 사용하고 조인해야 할 데이터가 많다면 응답시간을 보장 받을 수 없다. 이때 그룹핑 함수 SUM을 사용하여 연산한 결과를 저장할 별도의 테이블을 만들어 집계용 테이블로 활용하는 것이다. 그렇게 할 경우 쿼리를 수행하는 데 있어 UNIQUE INDEX SCAN 수준의 응답 속도를 보장받을 수 있다.
4. NOT IN, NOT EXISTS
비교되는 컬럼에 NULL 값이 존재하지 않는다면, NOT IN이나 NOT EXISTS의 결과가 동일하겠지만 NULL을 허용하는 컬럼을 비교하는 경우는 결과가 달라질 수 있으므로 반드시 구분해서 사용해야 한다.
출처 : 실전 사례로 살펴보는 SQL 튜닝 비법
'Database' 카테고리의 다른 글
MSSQL 프로시져, 함수 조회 및 내용 검색하는 방법 (0) | 2022.11.25 |
---|---|
MSSQL 순번 매기기 (0) | 2022.11.24 |
SQL 튜닝 - 사례별 튜닝 기법 (0) | 2022.09.25 |
SQL 튜닝 - 인덱스 (0) | 2022.09.19 |
MSSQL 합계 구하기(ROLLUP) (0) | 2022.07.12 |