





Group By절 뒤에 Order By절을 명시하지 않는다면 대부분 Hash Group By 방식으로 처리됨

Order By절을 명시해야 한다.Order By절을 명시할 경우, 논리적인 정렬 순서에 따라 연결 리스트 방식으로 그룹 집합이 배치되기 때문에 정렬 순서가 보장된다.





Distinct는 조건에 해당하는 데이터를 모두 읽어 중복을 제거한다.Distinct 연산자로 중복 제거 시 부분 처리가 불가하고, 모든 데이터를 읽는 과정에서 많은 I/O가 발생한다.Exists 서브쿼리는 데이터 존재 여부만 확인하기 때문에 조건절을 만족하는 데이터를 모두 읽지 않는다.Order By 또는 Group By절이 있어도 소트 연산을 생략할 수 있다.Top N 쿼리 특성을 결합하면 OLTP에서 대량 데이터를 조회할 때 매우 빠른 응답속도를 낼 수 있다.전체 결과집합 중 상위 N개 레코드만 선택하는 쿼리
Top N 쿼리를 통해 3-Tier 아키텍처에서도 부분범위 처리를 활용할 수 있다.
ex) 

이렇게 Sort Order By 오퍼레이션 대신 Count(STOPKEY)를 통해 지정한 건수 만큼 결과 레코드를 얻으면 바로 멈추는 알고리즘을 Top N Stopkey 알고리즘이라고 한다.
Top N Stopkey 알고리즘을 통해 페이징 처리가 가능하다.

이렇게 인덱스 사용이 가능하도록 조건절을 구사하고, 조인을 NL 조인 위주로 처리하고, Order By절이 있어도 소트 연산을 생략할 수 있도록 인덱스를 구성하면 소트 연산 없이 페이징 처리가 가능하다.
Order By 아래 쪽 ROWNUM 조건절은 Top N Stopkey 알고리즘의 핵심이므로 이를 제거하면 소트 생략은 가능하지만, Stopkey가 작동하지 않아 전체범위를 처리하게 된다.
최소값(MIN), 최대값(MAX)를 구하는 SQL의 실행계획을 보면 Sort Aggregate 오퍼레이션이 나타난다.
이때 인덱스를 이용하면 전체 데이터를 읽지 않고도 최소값, 최대값을 찾을 수 있다.
인덱스 맨 왼쪽에서 읽는 첫번째 값이 최소값, 맨 오른쪽에서 읽는 첫번째 값이 최대값이다. (First Row StopKey 알고리즘)


이를 위해서는 조건절 컬럼과 MIN/MAX 함수 인자 컬럼이 모두 인덱스에 포함돼 있어야 한다. 즉, 테이블 엑세스가 발생하지 않아야 한다.
Top N 쿼리를 통해서도 최소값, 최대값을 구할 수 있다. 아래와 같이 ROWNUM <= 1 조건을 이용하면 된다.

Top N 쿼리에 작동하는 'Top N Stopkey 알고리즘'은 모든 컬럼이 인덱스에 포함돼 있지 않아도 잘 동작한다.

모든 컬럼이 인덱스에 포함되지 않는 경우, Top N 쿼리는 인라인 뷰를 사용하므로 쿼리가 약간 더 복잡하지만, 성능 측면에서는 MIN/MAX 쿼리보다 낫다.
First Row Stopkey 또는 Top N Stopkey 알고리즘이 작동할 수 있게 인덱스를 설계해야 한다.
First Row StopKey 알고리즘이 작동하고 있다.그룹핑 연산에도 인덱스를 활용할 수 있다.

Group By절에 선두컬럼인 인덱스를 이용하면 Sort Group By Nosort라고 표시된다.
동작 메커니즘(Array size = 3)

1. 인덱스에서 A 구간을 스캔하면서 테이블을 액세스하다 B를 만나는 순간, 그때까지 집계한 값을 운반 단위에 저장한다.
2. 계속해서 B구간을 스캔하다가 C를 만나는 순간, 그때까지 집계한 값을 운반 단위에 저장한다.
3. 계속해서 C구간을 스캔하다가 D를 만나는 순간, 그때까지 집계한 값을 운반 단위에 저장한다. Array size가 3이므로 지금까지 읽은 A,B,C에 대한 집계 결과를 클라이언트에게 전송하고 다음 Fetch Call일 올 때까지 기다린다.
4. 클라이언트로부터 다음 Fetch Call이 오면 1~3 과정을 반복한다. 물론 두번째 Fetch Call에서는 D구간부터 읽기 시작한다
이처럼 인덱스를 이용하 Nosort 방식으로 Group By를 처리하면 부분범위 처리가 가능해진다.
소트 연산이 불가피하다면 메모리 내에서 처리를 완료할 수 있도록 노력해야 한다.
테이블을 Full Scan하더라도 가공, 출력에 따라 소트하는 데이터량이 다르다.
인덱스 소트 연산을 생략할 수 없더라도 Top N쿼리를 사용하여 Sort Area 사용량과 소트 연산 횟수를 줄일 수 있다.
(SORT ORDER BY STOPKEY)

왜냐하면 전체 레코드를 다 정렬하지 않고 N개의 레코드만 정렬 상태를 유지해도 결과를 구할 수 있기 때문이다.

윈도우 함수 중 RANK나 ROW_NUMBER 함수는 TOP N 소트 알고리즘을 사용하기 때문에 MAX 함수보다 소트 부하가 적다.