본문 바로가기
SQL심화-Training

4장 악성 SQL 튜닝으로 초보자 탈출하기 - (2)

by domsam 2025. 3. 25.
반응형

아래 접은글로 되어있는 내용을 보기 전에 각 예제의 내용을 확인하고 본인이 생각하는 쿼리문을 먼저 작성해 보세요.

 

4.2.1 기본 키를 변형하는 BAD SQL

사원번호(emp_no)가 1,100 이상이면서 사원번호가 5자리인 사원(employees)의 모든 정보를 출력하는 쿼리를 만들어 주세요. (찾은 행: 10)

더보기

튜닝 전 SQL문 - 10 rows in set (0.23 sec) 

 

WHERE 절에서 index 컬럼을 가공하게 되면 index를 활용할 수 없습니다. 그래서 가공하지 않고 원본값 그대로 사용하여야 인덱스를 활용할 수 있다.

SELECT *
  FROM employees
 WHERE SUBSTRING(emp_no, 1, 4) = 1100
   AND LENGTH(emp_no) = 5;

 

튜닝 후 SQL문 

SELECT *
  FROM employees
 WHERE emp_no BETWEEN 11000 AND 11009;
 
 
SELECT *
  FROM employees
 WHERE emp_no >= 11000 AND emp_no <= 11009

 

4.2.2 사용하지 않는 함수를 포함하는 BAD SQL

성별 기준으로 몇 명의 사원이 있는지 조회하자. 이때 성별의 값이 null인 경우는 NO DATA로 표시 해달라.

더보기

튜닝 전 SQL문

 

gender 컬럼은 NOT NULL이기 때문에 애초에 null값이 있을 수 없었음. 쓸데없는 작업이 추가되면서 임시 테이블을 사용하게 되었음. Extra 컬럼에 Using temporary가 표시됨

SELECT IFNULL(gender, 'NO DATA') AS group_gender
     , COUNT(1) AS cnt
FROM employees
GROUP BY group_gender;

 

튜닝 후 SQL문

SELECT gender
     , COUNT(1) AS cnt
  FROM employees
 GROUP BY gender;

 

 






-- 4.2.3
-- 묵시적 형변환, (문자열 - 숫자형)
EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE yn_use = 1;

EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE yn_use = '1';

EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE CAST(yn_use AS SIGNED) = 1;

SELECT yn_use
     , CAST(yn_use AS SIGNED)
     , CONVERT(yn_use, SIGNED)
FROM salaries;


-- 4.2.4 
EXPLAIN 
SELECT *
FROM employees 
WHERE CONCAT(gender, ' ', last_name) = 'M radwan';

SELECT gender, last_name, CONCAT(gender, ' ', last_name)
FROM employees;

EXPLAIN 
SELECT *
FROM employees 
WHERE gender = 'M'
AND last_name = 'radwan';

-- 4.2.5 
SELECT e.emp_no, e.first_name, e.last_name, de.dept_no
FROM employees e
INNER JOIN dept_emp de
ON e.emp_no = de.emp_no;

-- dept_emp에서 부서가 2개 이상인 emp_no를 찾아주세요. (31,579)
SELECT emp_no, COUNT(emp_no)
FROM dept_emp
GROUP BY emp_no
HAVING COUNT(emp_no) > 1;
반응형