SQL/SQL 튜닝

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

domsam 2025. 3. 25. 18:09
반응형

1. AUTO COMMIT

MySQL은 디폴트로 AUTO COMMIT이 활성화 되어 있기 때문에 INSERT, UPDATE, DELETE 작업 후에는 되돌릴 수가 없습니다. 그래서 작업 전에 백업을 하거나 AUTO COMMIT을 비활성화하여 결과를 보고 적용하거나 원 상태로 되돌리기 할 수 있습니다. 

-- AUTO COMMIT 확인 (1: 활성화, 0: 비활성화)
SELECT @@autocommit;

-- AUTO COMMIT 활성화
SET autocommit = 1;

-- AUTO COMMIT 비활성화
SET autocommit = 0;

-- 결과 적용
COMMIT;

-- 되돌리기
ROLLBACK;

 

2. 예제 맞도록 employee 데이터베이스 세팅

아래 예제는 "업무에 바로 쓰는 SQL 튜닝 - 양바른 지음, 한빛미디어" 책에 소개되는 예제입니다. 책에서 제공해주는 tuning 데이터베이스는 employees 데이터베이스를 개량하였습니다. tunning 데이터베이스는 테이블명, 컬럼명이 한글로 되어 있어 쿼리문을 작성할 때 한/영을 자주 변경해야 되어 불편합니다. 그래서 employees 데이터 베이스를 tuning 데이터베이스와 같도록 변경하여 사용하도록 하겠습니다. tuning 데이터베이스에 존재하는 값도 필요하기 때문에 tuning 데이터베이스를 설치해야 합니다.

 

2.1 departments

tuning 데이터베이스의 `부서` 테이블에는 `비고` 컬럼이 존재합니다. departments 테이블에 `note` 컬럼을 추가하고 레코드 별로 같은 값을 가질 수 있게 처리합니다.

-- 부서 테이블에 note 컬럼 추가
ALTER TABLE departments
  ADD COLUMN note VARCHAR(40) NULL;


-- 각 컬럼의 값을 tunning 데이터베이스 `부서` 테이블의 `비고` 컬럼과 같게 변경
UPDATE departments A
  JOIN tuning.`부서` B
    ON A.dept_no = B.`부서번호`
   SET A.note = B.`비고`;

 

2.2 salaries

tuning 데이터베이스의 `급여` 테이블에는 `사용여부` 컬럼이 존재합니다. salaries 테이블에 `yn_use` 컬럼을 추가하고 레코드 별로 같은 값을 가질 수 있게 처리합니다. 그리고 인덱스도 추가합니다.

ALTER TABLE salaries
  ADD COLUMN yn_use VARCHAR(1) NOT NULL DEFAULT '0';

ALTER TABLE salaries
  ADD INDEX idx_ynuse(yn_use);

UPDATE salaries
   SET yn_use = '1'
 WHERE to_date = '9999-01-01';

 

2.3 employees_commute

tuning 데이터베이스에는 `사원출입기록` 테이블이 존재하지만 employees 데이터베이스에는 존재하지 않습니다. `사원출입기록` 테이블과 매핑되는 `employees_commute` 테이블을 생성하고 데이터를 삽입한다.

CREATE TABLE employees_commute (
    commute_id INT(10) NOT NULL AUTO_INCREMENT,
    emp_no INT(10) NOT NULL,
    commute_time TIMtuningESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    commute_type CHAR(1) NOT NULL COLLATE 'utf8mb3_general_ci',
    door CHAR(1) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
    location CHAR(1) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
    PRIMARY KEY (commute_id, emp_no) USING BTREE,
    INDEX idx_location (location) USING BTREE,
    INDEX idx_commute_time (commute_time) USING BTREE,
    INDEX idx_door (door) USING BTREE
);


INSERT INTO employees_commute
(commute_id, emp_no, commute_time, commute_type, door, location)
SELECT A.순번, A.사원번호, A.입출입시간
     , A.입출입구분, A.출입문, A.지역
  FROM tuning.`사원출입기록` A;

 

2.4 employees

tuning 데이터베이스의 `사원` 테이블에는 PK, `입사일자`, '성별, 성` 인덱스가 존재한다. employees 테이블에는 PK, `hire_date`, `gender, birth_date`, `first_name` 인덱스가 있다. employees 테이블의 인덱스를 삭제하거나 변경하여 tuning 데이터베이스의 `사원` 테이블과 같은 인덱스를 가질 수 있도록 수정한다.

-- 기존 gender, birth_date 인덱스 삭제
ALTER TABLE employees
 DROP INDEX ix_gender_birthdate;
 
-- 기존 first_name 인덱스 삭제
ALTER TABLE employees
 DROP INDEX ix_firstname

-- gender, last_name 인덱스 생성
ALTER TABLE employees
  ADD INDEX idx_gender_lastname(gender, last_name);
  
-- first_name 콜레이트 변경
  ALTER TABLE employees
 CHANGE COLUMN first_name first_name VARCHAR(14) NOT NULL
COLLATE 'UTF8MB4_bin';