권순용의 실전 SQL Tuning 2강

권순용의 실전 SQL Tuning 2강

00:28 2016-12-28 수

2강

DML (Data Manipulation Language)
SQL 에 포함되며 데이터베이스에 존재하는 데이터를 변경하는 언어이다.
DML은 INSERT, UPDATE, DELETE 만 존재하게 된다.

DCL (Data Control Language)

DCL 또한 SQL의 하나이며 권한을 부여하고 제거하는 역할을 수행하는 언어이다.
REVOKE와 GRANT 명령어만이 존재한다.

DDL (Data Definition Language)

데이터베이스에 존재하는 오브젝트에 대해 변경을 수행하는 SQL이며 ALTER 또는 CREATE 등을 이용하게 된다.

QUERY
테이블에 저장되어 있는 데이터를 추출하는 SQL 문이며 SELECT를 이용하게 된다.

TO_NUMBER(카드번호) = 1234 의 사용

– 해당 SQL 은 함수 기반 인덱스(Function Base Index)를 제외하면 인덱스를 이용할 수 없게 됨.

WHERE 절의 인덱스 컬럼은 절대 가공이 되어서는 안됨.
의도적으로 가공하여 인덱스를 이용하지 않게 할 수도 있음.

<INSERT>

대용량의 INSERT
– 직접(Direct) 로딩과 Nologging 으로 작업을 수행해야만 원하는 성능을 보장받을 수 있음.

Insert의 성능 저하 요인
– 인덱스가 많을수록 Insert가 느리다.
– DML 작업은 로그 기록이 발생. 로그 기록은 디스크 작업이므로 I/O증가됨.
– 내부적인 작업으로 인해 성능저하 (HWM Bump Up이라고 부름)
– UNDO 기록 : 롤백을 지원하기 위해 UNDO 저장. (UPDATE와 DELETE와 비교해서 적은 양이긴 함)
– INSERT 작업 자체 : 디스크 작업이므로 I/O증가됨.

1. INSERT INFO 테이블명 (컬럼명1, 2, …, n)
VALUES (값1, 2, …, n)

2. INSERT INFO 테이블명 (컬럼명 1, 2, …, n)
SELECT 컬럼명1, 2, …, n
FROM 테이블명
WHERE 조건절
기타;

(Nologging 와 직ㅇ접 로딩(Direct Loading) 은 2번, 인서트-셀렉트 SQL 만 가능)
(1번 INSERT-VALUES는 컨벤셔널 로딩만 된다. 다이렉트 로딩 불가.)

<UPDATE>

UPDATE는 최적화 방법이 따로 없으므로
INSERT 를 이용하여 최적화를 수행하는 경우가 있음.

UPDATE의 성능저하 요인
– 로그 기록 : 디스크 작업이므로 I/O발생
– 인덱스 변경 : 인덱스 작업이 느림
– UNDO 기록 : 롤백 지원을 위한 UNDO 저장. 디스크 작업 = I/O 발생
– Update 작업 자체 : 디스크 작업이므로 I/O발생

UPDATE 테이블명 SET 컬럼=값 WHERE 조건;

<DELETE>

UPDATE는 최적화 방법이 따로 없으므로
INSERT 를 이용하여 최적화를 수행하는 경우가 있음. (아니, DELETE를 어떻게 INSERT로 치환하지?)

DELETE의 성능저하 요인

– 로그 기록 : 디스크 작업이므로 I/O발생. UPDATE나 INSERT에 비해 많이 느림 (모든 컬럼에 대한 값 저장되기 때문)
– 인덱스 변경 : 인덱스 작업이 느림
– UNDO 기록 : 롤백 지원을 위한 UNDO 저장. 디스크 작업 = I/O 발생
– Update 작업 자체 : 디스크 작업이므로 I/O발생

*딜리트는 비포 이미지를 저장하는 작업의 양이 커서 매우 느리다.

DELETE FROM 테이블명 WHERE 조건;

Q. QUERY와 DML 중 어느 SQL이 시스템에 더 많은 성능저하를 발생시킬까?

같은 양의 데이터를 엑세스한다면 일반적으로 DML이다.
DML은 QUERY에 더하여 저장, 변경, 삭제 수행의 작업이 추가된다.
이와 같은 작업은 디스크 I/O를 발생시키므로 성능 저하를 더 발생시킨다.

<DDL (변경)>

컬럼 ADD
컬럼 DROP
컬럼 MODIFY

테이블 TRUNCATE
테이블 DROP

<DCL (데이터 제어어)>
GRANT(권한 할당), REVOKE(권한 제거)

성능과는 관계 없으나, 장애와 관련이 있다.
(권한이 없으면 장애 발생)

시스템 권한 : 데이터베이스에 대한 권한 + 테이블 생성 권한.
오브젝트 권한 : 테이블 내 데이터에 대한 권한. (삽입, 갱신, 삭제 권한)
오브젝트 : 객체. ex) 테이블, 인덱스, 함수, 프로시저.

INSERT를 직접 로딩하기 (직접 로딩Direct Loading 수행)

(1) ALTER TABLE TEST NOLOGGING;
(2) INSERT /*+APPEND*/ INTO TEST
  SELECT ~ ;
(3) ALTER TABLE TEST LOGGING;

—–

(2)의 어펜드 힌트가 직접 로딩을 유도하는 힌트다.
(1)로 로깅을 없애고,
대용량 인서트 작업을 마친 후 (3)으로 다시 로깅이 쓰여지도록 복구하면 된다.

여기서, APPEND 힌트 대신 PARALLEL 힌트를 써도 된다.
페러렐 힌트는 여러 개의 프로세스를 기동시키고, 여러 개의 프로세스가 각각 직접 로딩을 수행한다.

PARALLEL Processing 을 사용하려면
PARALLEL DML을 Enable 시켜야 한다.

(1) ALTER SESSON ENABLE PARALLEL DML;
(2) ALTER TABLE TEST NOLOGGING;
(3) INSERT /*+PARALLEL(A,4)*/ INTO TEST A
     SELECT …;
(4) ALTER TABLE TEST LOGGING;

결국 대용량 INSERT가 빠르려면 SELECT가 빨라야 한다.
SELECT가 빠르려면 인덱스를 생성하거나, PARALLEL 힌트를 사용하면 된다.
주의할 점은 PARALLEL 은 자원을 한번에 많이 사용할 가능성이 있다.

Q. 인덱스 컬럼에 함수가 적용되면 일반적으로 인덱스를 이용할 수는 없다.
이럴 때 어떤 인덱스를 이용해야 하는가?

A. Function base 인덱스

Q. VALUES 절을 이용하여 데이터를 삽입하는 경우 해당 컬럼에 ”를 삽입하면
어떤 데이터가 삽입되는가?

A. null 값

01:53 2016-12-28 수