반응형

친절한SQL튜닝

    SELECT-LIST 컬럼 가공시 정렬연산 수행 확인 및 개선방법

    인덱스가 Id, ch_date, ch_order 순으로 생성되어 있을 경우 MIN 값을 구해도 별도의 정렬연산을 수행하지 않는다. 수직적 탐색을 통해서 가장 왼쪽지점에서 보는 최소 값이 바로 구하고자 하는 값이기 때문이다. 1SELECT MIN(ch_date) FROM scott.SORT_TEST WHERE ID = ‘C’;csMAX의 경우도 마찬가지이다. MIN과 다른 점은 왼쪽에서 찾는게 아니라 가장 오른쪽에 있는 데이터를 찾는다는 점이다.1SELECT MAX(ch_date) FROM scott.SORT_TEST WHERE ID = ‘C’;cs 그래서 두 개의 실행계획을 살펴보면 인덱스 리프 블록의 왼쪽(MIN) 또는 오른쪽 (MAX)에서 레코드 하나(FIRST ROW)만 읽고 멈춘다.1SELECT ..

    인덱스를 이용한 sort 연산 생략

    인덱스 Range Scan이 가능하려면 가공하려는 컬럼의 데이터가 정렬되어 있어야 가능하다. 인덱스는 그렇기 때문에 정렬이 되어있다. 그래서 인덱스를 사용하는 이유가 있다. 테이블 생성1234create table sort_test (id char,ch_date date,ch_order varchar(10));cs 제약조건 추가1ALTER TABLE SCOTT.SORT_TEST ADD CONSTRAINT ODER_PRIMARY PRIMARY KEY (ID,CH_DATE,CH_ORDER);cs 데이터 실행계획PK를 기준으로 알아서 정렬이 되어있다. ( ID -> CH_DATE -> CH_ORDER 순서대로) 만약 별도로 order by를 sql에 지정한다고 해도 옵티마이저는 sort order by를 진행..

    시퀀셜 액세스와 랜덤 액세스

    데이터베이스에서 데이터를 블록단위로 읽는다. 1 ~ 3 byte와 같이 작은 데이터를 읽을때도 하나의 블록을 읽어들인다. 그리고 테이블뿐만 아니라 인덱스도 블록단위로 읽어들인다. 데이터베이스의 총 블록 사이즈를 알고 싶으면 다음 쿼리를 통해 확인해 볼 수있다.1select value from v$parameter where name = 'db_block_size';cs 그럼 테이블과 인덱스를 블록단위로 읽는 방식에 대해서 알아보자. 테이블 또는 인덱스를 읽는 방식 시퀀셜 액세스 (Sequential Access)논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽어들이는 방식이다. 인덱스 리프블록은 앞뒤를 가리키는 주소값으로 서로 연결되어 있는데 이를 이용하여 순차적으로 스캔하는 방식이다.테이블..

반응형