본문 바로가기

전체보기123

[SQL 튜닝] 불필요한 조인을 수행하는 나쁜 SQL 문 불필요한 조인을 수행하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | FROM 절에서 사원 테이블과 사원출입기록 테이블로 작성한 인라인 뷰를 사원번호 열로 내부 조인하는 쿼리 즉, A출입문으로 출입한 사원이 총 몇 명인지 구하는 쿼리 EXPLAIN SELECT COUNT(DISTINCT 사원.사원번호) as 데이터건수 FROM 사원, (SELECT 사원번호 FROM 사원출입기록 기록 WHERE 출입문 = 'A') 기록 WHERE 사원.사원번호 = 기록.사원번호; - SQL문 결과 : 총 1건의 결과 출력(데이터 건수 150000), 359 ms 소요 - id 둘다 1 → 조인 수행 - 드라이빙 테이블인 사원출입기록 테이블은 I_출입문 인덱스 활용하여 A 출입문에 관한 기록이 있는 사원번호를 구함.. 2023. 7. 22.
[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.