Print
카테고리: [ Oracle Database ]
조회수: 84691

 

TABLE 의  컬럼 위치에 따른 select 성능 차이가 있는지 궁금하여 알아보던 중

좋은 글을 발견하여 테스트 해본 결과 입니다.

 

 

--1. TEST 환경 구성

 

1)  250 개 COLUMN 테이블 생성

CREATE TABLE COLUMN_TEST

(C1 NUMBER, C2 NUMBER, C3 NUMBER ....  C250 NUMBER);

 

2) COLUMN_TEST 테이블에 데이터 1만건 넣기

 

INSERT INTO COLUMN_TEST

SELECT 

ROWNUM C1, ROWNUM C2, ROWNUM C3 ....  ROWNUM C250

FROM DUAL

CONNECT BY ROWNUM <= 10000;

 

3) 소요시간 측정을 위한 테이블 생성 

 

CREATE TABLE COLUMN_TEST_TIME

(COL VARCHAR2(100),

START_TIME DATE,

END_TIME DATE

);
 
5) COLUMN 비교 가독성 위해 각 컬럼 넘버링
 
INSERT INTO COLUMN_TEST_TIME(COL)

SELECT 'C' || TO_CHAR(ROWNUM)

FROM DUAL

CONNECT BY LEVEL <=250;
 
 
 
6) 각 컬럼 별 1000번 씩 SELECT 수행하여 누적 소요시간 측정
 
 
DECLARE

 CNT NUMBER;

BEGIN

 FOR C1 IN (SELECT ROWID AS RID, COL FROM COLUMN_TEST_TIME)

 LOOP

    UPDATE COLUMN_TEST_TIME SET STIME = SYSDATE WHERE ROWID = C1.RID;

    FOR I IN 1..1000

    LOOP

        EXECUTE IMMEDIATE 'SELECT COUNT('||C1.COL||') FROM COLUMN_TEST' INTO CNT; --C1~250 까지 COUNT

    END LOOP;

    UPDATE COLUMN_TEST_TIME SET ETIME = SYSDATE WHERE ROWID = C1.RID;   

    COMMIT;

 END LOOP;  

END;
 
 
7) 소요시간 추출
 
 
SELECT COL 

      ,EXTRACT (SECOND FROM NUMTODSINTERVAL(ETIME - STIME, 'DAY')) AS ELAP_SEC

FROM COLUMN_TEST_TIME;
 
 
 
반복회수를 좀 더 많이 잡아서 테스트 해보면 결과값이 더 정확하게 나오겠지만
대체적으로 앞의 컬럼을 SELECT 하는 것 보다 뒤에 있는 컬럼을 SELECT 할 때
더 오래걸리는 것으로 확인 되었습니다.
 
 

--2. COLUMN 위치에 따라 속도 차이가 발생하는 이유

 
 
ORACLE의 ROW 구조를 살펴보면
ROW HEADER + COLUMN LENGTH, COLUMN DATA  로 이루어져 있는데
ROW HEADER엔 해당 컬럼이 어디에 위치해 있는지에 대한 OFFSET 정보가 없음
 
=> 해당 컬럼에 도착할 때 까지 그 전의 COLUMN들을 모두 읽어야함
 
 
 

-- 참고

http://blog.orapub.com/20160928/does-oracle-table-column-order-affect-performance.html
http://cafe.naver.com/dbian/282