본문 바로가기

SQL 튜닝24

[SQL 튜닝] 메인 테이블에 계속 의존하는 나쁜 SQL 문 메인 테이블에 계속 의존하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원번호가 450,000보다 크고, 최대 연봉이 100,000보다 큰 데이터를 찾아 출력하는 쿼리 사원번호가 450,000번을 초과하면서 그동안 받은 연봉 중 한 번이라도 100,000를 초과한 적이 있는 사원 정보 출력 EXPLAIN SELECT 사원.사원번호, 사원.이름, 사원.성 FROM 사원 WHERE 사원번호 > 450000 AND (SELECT MAX(연봉) FROM 급여 WHERE 사원번호 = 사원.사원번호) > 100000; - SQL문 결과 : 총 3,155건의 결과 출력, 193 ms 소요 - 먼저 FROM 절의 메인 테이블인 사원 테이블에 접근 - id가 1인 사원 테이블이 기본 키 (key: PRIMA.. 2023. 7. 20.
[SQL 튜닝] 작은 테이블이 먼저 조인에 참여하는 나쁜 SQL 문 작은 테이블이 먼저 조인에 참여하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 부서사원_매핑 테이블과 부서 테이블을 조인하여 부서 시작일자가 '2002-03-01' 이후인 사원의 데이터 조회하는 쿼리 EXPLAIN SELECT 매핑.사원번호, 부서.부서번호 FROM 부서사원_매핑 매핑, 부서 WHERE 매핑.부서번호 = 부서.부서번호 AND 매핑.시작일자 >= '2002-03-01'; - SQL문 결과 : 총 1,341건의 결과 출력, 327 ms 소요 - 드라이빙 테이블인 부서 테이블과 드리븐 테이블인 부서사원_매핑 테이블은 중첩 루프 조인을 수행 - 작은 크기의 부서 테이블에서 부서.부서번호 열만 SELECT 절과 WHERE 절에 필요 → UI_부서명 인덱스 활용해 인덱스 풀 스캔 - 부.. 2023. 7. 19.
[SQL 튜닝] 범위 조건으로 인덱스를 사용하는 나쁜 SQL 문 범위 조건으로 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 입사일자가 1994년 1월 1일부터 2000년 12월 31일까지인 사원들의 이름과 성을 출력하는 쿼리 EXPLAIN SELECT 이름, 성 FROM 사원 WHERE 입사일자 BETWEEN STR_TO_DATE('1994-01-01', '%Y-%m-%d') AND STR_TO_DATE('2000-12-31', '%Y-%m-%d'); - SQL문 결과 : 총 48,875건의 결과 출력, 116 ms 소요 튜닝 수행 SELECT COUNT(1) FROM 사원; - 사원 테이블 : 총 데이터 300,024건 (튜닝 전 SQL 문의 결과 건수 48,875 건 - 약 17%) - 인덱스를 사용하는 것이 효율적일지, 아니면 인덱스 .. 2023. 7. 18.
[SQL 튜닝] 동등 조건으로 인덱스를 사용하는 나쁜 SQL 문 동등 조건으로 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | B 출입문으로 출입한 이력이 있는 정보를 모두 조회하는 쿼리 EXPLAIN SELECT * FROM 사원출입기록 WHERE 출입문 = 'B'; - 사원출입기록 테이블 : 660000 (약 66만) - SQL문 결과 : 총 300000건의 결과 출력(30만), 0.35 sec 소요 - I_출입문 인덱스를 사용하여 데이터 접근 → 출입문 B에 대한 명확한 상수화 조건으로 인해 ref 항목이 const로 출력 튜닝 수행 SELECT 출입문, COUNT(1) FROM 사원출입기록 GROUP BY 출입문; - 출입문 B는 총 66만 건의 전체 데이터 중 30만 건 - 인덱스에 접근한 뒤 테이블에 랜덤 액세스하는 방식 → 전체 데.. 2023. 7. 17.
[SQL 튜닝] 엉뚱한 인덱스를 사용하는 나쁜 SQL 문 엉뚱한 인덱스를 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 입사일자 열의 값이 '1989'로 시작하면서 사원번호가 100000를 초과하는 데이터를 조회하는 쿼리 EXPLAIN SELECT 사원번호 FROM 사원 WHERE 입사일자 LIKE '1989%' AND 사원번호 > 100000; - 사원 테이블 : 300024 (약 30만) - SQL문 결과 : 총 20001건의 결과 출력, 10.4ms 소요 - key 항목 : PRIMARY → 범위 스캔(type 항목 : range) 수행- 스토리지 엔진으로부터 기본 키를 구성하는 사원번호를 조건으로 데이터를 가져온 뒤, MYSQL 엔진에서 남은 필터 조건(입사일자 LIKE '1989%) 으로 추출하여 filtered 항목에.. 2023. 7. 16.
[SQL 튜닝] 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 성과 성별 순서로 그루핑하여 몇 건의 데이터가 있는지 구하는 쿼리 EXPLAIN SELECT 성, 성별, COUNT(1) as 카운트 FROM 사원 GROUP BY 성, 성별; - 사원 테이블 : 300024 (약 30만) - SQL문 결과 : 총 3274건의 결과 출력, 536ms 소요 - I_성별_성 인덱스 활용 - extra : Using temporary 생성하여 성과 성별을 그루핑해 카운트 연산 수행 - I_성별_성 인덱스의 구성 열이 GROUP BY 절에 포함 → 테이블 접근 없이 인덱스만 사용하는 커버링 인덱스 (extra : Using index) 튜닝 수행 사원 테이블의 I_성별_성 인덱스를 활용하는데도.. 2023. 7. 15.