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