본문 바로가기

SQL 튜닝24

[SQL 튜닝] 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | SELECT 문을 UNION 연산자로 합치는 쿼리문 EXPLAIN SELECT 'M' AS 성별, 사원번호 FROM 사원 WHERE 성별 = 'M' AND 성 = 'Baba' UNION SELECT 'F' AS 성별, 사원번호 FROM 사원 WHERE 성별 = 'F' AND 성 = 'Baba'; - SQL문 결과 : 총 226건의 결과 출력, 1.5ms 소요 - 마지막 key가 NULL인 세번째 행에서는 id가 1인 행과 2인행의 결과를 통합하여 중복을 제거하는 작업을 처리 - 메모리에 임시 테이블을 생성(Extra 항목의 Using temporary)하고 그 내부에서 각 결과의 UNION 연산 작업을 수행 -.. 2023. 7. 14.
[SQL 튜닝] 습관적으로 중복을 제거하는 나쁜 SQL 문 습관적으로 중복을 제거하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 부서 관리자의 사원번호와 이름, 성, 부서번호 데이터를 중복 제거하여 조회하는 쿼리 EXPLAIN SELECT DISTINCT 사원.사원번호, 사원.이름, 사원.성, 부서관리자.부서번호 FROM 사원 JOIN 부서관리자 ON (사원.사원번호 = 부서관리자.사원번호); - 부서 관리자 테이블 컬럼 수 : 24 - SQL문 결과 : 총 24건의 결과 출력, 0.4ms 소요 - 드라이빙 테이블인 부서관리자 테이블과 드리븐 테이블인 사원 테이블의 id 값 둘다 1로 동일하게 나타남 → 서로 조인 - 부서관리자 테이블의 type 항목 : index → 인덱스 풀 스캔 방식 수행 - 사원 테이블의 type 항목 : eq_ref → 사원.. 2023. 7. 13.
[SQL 튜닝] 열을 결합하여 사용하는 나쁜 SQL 문 열을 결합하여 사용하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 성별의 값과 1칸의 공백(space), 성의 값을 모두 결합한 결과가 'M Radwan'인 데이터를 조회하는 쿼리 EXPLAIN SELECT * FROM 사원 WHERE CONCAT(성별, ' ',성) ='M Radwan'; - 사원 테이블 컬럼 수 : 300024 (약 30만 건) - SQL문 결과 : 총 102건의 결과 출력, 103ms 소요 - 사원 테이블은 CONCAT(성별,' ',성) = 'M Radwan' 조건절로 데이터에 접근하지만, 테이블 풀 스캔 - type 항목 : ALL → 데이터를 처음부터 끝까지 스캔하므로 비효율적임 튜닝 수행 - 총 300,024건 중에 102건의 데이터를 조회하는 쿼리.. 2023. 7. 12.
[SQL 튜닝] 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 급여 테이블에서 현재 유효한 급여 정보만 조회하고자 사용여부 열의 값이 1인 데이터를 출력하는 쿼리 EXPLAIN SELECT COUNT(1) FROM 급여 WHERE 사용여부 = 1; - 급여 테이블 컬럼 수 : 2844047 (약 284만 건) - SQL문 결과 : 총 1건의 결과 출력, 373ms 소요 COUNT(1) = 42842 - key 항목 : I_사용여부 인덱스 사용 - type 항목 : index → 인덱스 풀스캔 방식으로 수행 - filtered 항목 : 10 → MYSQL 엔진으로 가져온 데이터 중 10% 추출해서 최종 데이터 출력 즉, rows 항목에 표시된 2,838,438건의 데이터를 스토리.. 2023. 7. 11.
[SQL 튜닝] 사용하지 않는 함수를 포함하는 나쁜 SQL 문 사용하지 않는 함수를 포함하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | 사원 테이블에서 성별 기준으로 몇 명의 사원이 있는지 출력하는 쿼리 EXPLAIN SELECT IFNULL(성별, 'NO DATA') AS 성별, COUNT(1) 건수 FROM 사원 GROUP BY IFNULL(성별, 'NO DATA'); - 사원 테이블 컬럼 수 : 300024 (약 30만건) - SQL문 결과 : 총 2건의 결과 출력, 115ms 소요 M(남) - 179973, F(여) - 120051 - 성별의 값이 NULL 이면 NO DATA 출력 (IFNULL 처리) - Key 항목 : I_성별_성 인덱스로 나타나므로 인덱스 풀 스캔 방식으로 수행 - Extra 항목 : Using temporary 이므로 임시.. 2023. 7. 10.
[SQL 튜닝] 기본 키를 변형하는 나쁜 SQL 문 실무적인 SQL 튜닝 절차  기본 키를 변형하는 나쁜 SQL 문 현황 분석 | 튜닝 전 실행 계획 | EXPLAIN SELECT * FROM 사원 WHERE SUBSTRING(사원번호,1,4) =1100 AND LENGTH(사원번호)=5; - 사원 테이블 컬럼 수 : 300024 (약 30만건) - SQL문 결과 : 총 10건의 결과 출력, 100ms 소요 - type 항목 : ALL → 테이블 풀 스캔 방식 - 인덱스를 사용하지 않고 테이블에 바로 접근함 - 필요한 범위에만 접근하는 대신 처음부터 끝까지 스캔하기 때문에 비효율적임 현황 분석 기본 키와 인덱스 현황 확인 기본 키(PRIMARY) : 사원번호 인덱스 : I_입사일자, I_성별_성(성별, 성) (3개) SHOW index FROM 사원; .. 2023. 7. 8.