위 책을 읽으면서 머리속에 정리한 글
(이론 서적의 경우엔 제 개인적 주관이 다분이 포함해서 작성합니다.)
엑세스 최적화의 포괄적 정의
I/O, 물리적인 저장형태, H/W , 네트워크 환경
DBMS 환경설정, SQL 형태, 실행계획, 인덱스 유형, 결합된 컬럼의 순서
1. 부분처리 개념
테이블을 뒤져서 만족하는 조건을 보낼때 테이블 전체를 뒤지지 않고
일부만 뒤져 만족하는 결과값이 일정 수치에 다르면 멈춘 상태에서
결과를 사용자에게 보여주는것
<DBMS 성능, 버전에 의존적인 개념>
그렇다면 전체범위 처리 개념은?
전체를 뒤져 만족하는 결과를 임시 저장한뒤 역시 한번에 보낼수 있는
단위별로 사용자에게 보여주는 것. (내부 처리만 틀리네?)
실행계획에 SORT 라는 단어가 있다면 이는 전체범위 처리를 하고 있다.
(UNION, JOIN, AGGREGATE, ORDER BY, GROUP BY )
등이 SORT에 포함된다.
(VIEW 도 전체조인이다)
(MERGE JOIN은 반반 이다)
2. 부분처리 적용원칙
SUM, COUNT 의 경우 전체범위 처리 해야한다.
HAVING 절에 그룹함수 사용시에도 전체 범위 처리된다.
ORDER BY 도 전체범위 처리다.
근데 ORDER BY 는 부분처리 가능한 부분이 있다.
ORDER BY 의 컬럼이 선두 INDEX 라면 가능핟.
UNION 은전체범위처리이며 UNION ALL은 부분처리 된다.
다만 중복값 체크하지 않는다.
DISTINCT 전체범위 처리다.
SUM, MAX, MIN 은 무조건 전체범위 처리되야 가능한 함수다.
MINUS, INTERSECT 도 전체범위 처리로 가능하다.
옵티마이저 설정이 ALL_ROWS 라면 FIRST_ROWS 보다 빈번하게
전체범위 처리한다.
3. 부분범위 처리 수행속도 향상 원리
ORDER BY 의 전체범위 수행이유는 ORDER BY 자체에 있는게 아니고
정렬 작업을 위해서
결과에 해당되는 값을 일정 공간에 모으는 시간이 많이 걸리는것
조건에 INDEX 첫번째 값부터 주어준다면 ORDER BY 도 같이 된다.
DESC는 옵티마이저 설정을 통해서 가능하다
(옵션을 쿼리마다 바꿀순 없을테니 뭐 성능에 치명적이면 써야할듯)
4. 부분처리로의 유도
1) 엑세스 경로를 이용한 SORT의 대체
ORDER BY 대신 인덱스를 사용한 부분범위처리를 유도한다.
WHERE 절에 인덱스 컬럼의 범위 'LIKE, IN, >=, <=, <, >' 를
사용하면 ORDER BY와 같은 역할을 해준다.
2) 인덱스만 처리하는 부분범위 처리
사용자 의도와는 별도로 옵티마이저는 인덱스로만 조회된다고 판단되면
테이블을 엑세스하지 않고 인덱스만 보고 결과값 줘버린다.
중요한점은 결과물 자체가 인덱스에 100% 의존적이라면 가능하다.
3) MIN, MAX 처리
SELECT MAX(A+1) FROM TABLE 은 나쁜 사용방법이다.
시퀀스를 사용하는방법이 첫번째이나 목적상 잘 안쓸수 있다.
MAX 의 컬럼 값이 인덱스 되어 있다면 FIRSTROW(ROWNUM=1)
값을 가져오는 방법으로 MIN, MAX를 1건의 조회로 가져올 수 있다.
(MAX는 역순으로 조회하면 됨)
그렇다면 여러 컬럼이 PK인 경우 MAX를 구하는 COUNT도 PK에
속해 있어야 하며 다른 컬럼 PK가 우선있어야되고,
WHERE 절에 해당 컬럼을 조건으로 주고
마찬가지 방법으로 값을 구한다면 각 조건별로 MAX나 MIN 값이
정해지는 경우에도 끄집어 낼 수 있음
4) FILTER형 부분범위 처리
5) ROWNUM 을 이용한 부분범위 처리(굉장히 중요함)
6) 인라인뷰를 이용한 부분범위 처리
인라인뷰 select * from (select * from~~) 에서 범위를 줄이는
작업을 하고 밖에서 피할수 없는 전체범위 처리를 진행해야 한다.
7) 저장형 함수를 이용한 부분범위 처리
8) 쿼리의 이원화를 이용한 부분범위 처리
9) 웹 게시판에서의 부분범위 처리
따지자면 ROWNUM 을 이용한 부분범위 처리의 확장개념임
댓글 없음:
댓글 쓰기