반응형

대용량의 데이터에 대해서는 SELECT 절을 이용할 때 직접 로딩 또는 병렬 프로세싱으로 성능 향상을 기대할 수 있다.
직접 로딩(DIRECT LOADING) 을 구현할 때는 테이블을 NOLOGGING 모드로 변경한 후 수행하는 것이 성능에 유리하다.

ALTER TABLE 테이블 NOLOGGING;
INSERT /* + APPEND */ INTO 테이블(컬럼1, 컬럼2, 컬럼3)
SELECT 컬럼4, 컬럼5, 컬럼6
FROM 임시테이블;
ALTER TABLE 테이블 LOGGING;

이런 직접 로딩(DIRECT LOADING) 하는 프로세스를 여러 개 기동시켜 한번에 여러 개의 프로세스가 데이터를 저장하는 것을 병렬 프로세싱이라고 한다.


특수 데이터 삽입

NULL

NULL 값을 테이블에 저장하고자 한다면 NULL 값이 저장되어야할 컬럼에 NULL이라고 설정한다면 해당 컬럼에는 NULL 값이 삽입, 
혹은 '' 를 입력하면 NULL 로 입력된다.


SYSDATE

SYSDATE는 현재 일자 및 시간을 의미하는 함수로 오라클에서 제공한다.

SYSDATE는 일자 뿐 아니라 시간까지 저장되므로 
시간을 제외하고 일자만 저장하기 위해서는 TO_CHAR 함수를 이용해 원하는 DATE 타입으로 저장해야 한다.

SYSDATE를 입력하기 위해서는 해당 컬럼은 DATE 타입으로 설정되어 있어야 한다.


다중 삽입 (MULTI INSERT)

사원 테이블로부터 사원의 연봉 정보를 사원연봉이력 테이블에 , 사원의 부서 정보를 사원부서이력 테이블에 삽입하는 등에 사용된다.

INSERT INTO 사원연봉이력(등록일시, 사원번호, 연봉)
SELECT TO_CHAR(SYSDATE,'YYYYMMDD') AS 등록일시, 사원번호, 급여
FROM 사원;

INSERT INTO 사원부서이력(등록일시, 사원번호, 부서번호)
SELECT TO_CHAR(SYSDATE,'YYYYMMDD') AS 등록일시, 사원번호, 부서번호
FROM 사원;

위와 같이 2번의 삽입을 수행하면 데이터를 가진 사원 테이블을 2번 엑세스해야한다. 
하지만 다중 삽입 을 사용하면 1번의 엑세스로 여러 테이블에 데이터를 삽입할 수 있다.


1.

INSERT ALL
WHEN 부서번호 > 20 THEN
INTO 사원연봉이력 (등록일시, 사원번호, 연봉)
VALUES(등록일시, 사원번호, 급여)
WHEN 1=1 THEN
INTO 사원부서이력 (등록일시, 사원번호, 부서번호)
VALUES(등록일시, 사원번호, 부서번호)
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS 등록일시, 사원번호, 부서번호, 급여
FROM 사원;

사원연봉이력 테이블에는 사원 테이블의 부서번호가 20 보다 큰 사원에 대해서만 삽입을 수행
사원부서이력 테이블에는 사원 테이블의 모든 사원에 대해 데이터를 삽입 하는 예제이다.

즉 INSEART ALL 을 사용하면 작성되는 모든 테이블에 데이터를 삽입한다.


2.

INSERT FIRST
WHEN 부서번호 IN(10) THEN
INTO 사원연봉이력_10 (등록일시, 사원번호, 연봉)
VALUES(등록일시, 사원번호, 급여)
WHEN 1=1 THEN
INTO 사원연봉이력 (등록일시, 사원번호, 연봉)
VALUES(등록일시, 사원번호, 급여)
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS 등록일시, 사원번호, 부서번호, 급여
FROM 사원;

사원연봉이력_10 테이블에는 부서번호가 10인 사원 테이블의 모든 데이터가 삽입
사원연봉이력 테이블에는 부서번호가 10인 데이터는 제외하고 입력이 된다.

즉 INSERT FIRST를 사용하면 첫 번째 테이블에 데이터를 삽입하고 이후 테이블에는 처음에 조건을 만족했던 데이터는 삽입하지 않는다.


3. 시퀀스 사용


다중 삽입 시 각각의 VALUES에 시퀀스의 NEXTVAL을 호출해도 INSERT ALL 은 하나의 SQL로 인식되기 때문에 동일한 시퀀스 값이 삽입


* DBLINK

다중 삽입 작업을 수행할 떄 삽입하려는 데이터를 가진 테이블이 원격지 일 경우 정상 수행 되지만, 

원격 데이터베이스에 DDL 수행은 허용되지 않는다.

반응형

'⇥ DevOps Tech 🙋🏻‍♀️ > ✏️ ORACLE' 카테고리의 다른 글

[ORACLE] 삭제 (DELETE)  (0) 2020.08.31
[ORACLE] 갱신 (UPDATE)  (0) 2020.08.29
[ORACLE] 삽입 (INSERT) - 1  (0) 2020.08.26
[ORACLE] 행 제한  (0) 2020.08.25
[ORACLE] 조회 (Query)  (0) 2020.08.24