h1.소트 수행 원리

h2.A.Sort area

-- 할당 방식

  • Sort 수행하면서 공간이 부족 할 때 마다 Chunk단위(DB Block Size) 로 할당



-- 참조 파라메터

  • workarea_size_policy: 세션마다 사용하는 소팅 영역 크기, Default: Auto
  • sort_area_retained_size: 데이터 정렬 끝낸 후 유지할 소트 영역 크기(결과집함 Fetch, 다음 수행 단계로 결과집합 전달하기 전까지 유지)
    이 크기 초과 시 Disk(TEMP TBS) 저장 후 Fetch 시 다시 읽음
    Default: 0 (결과집합 전체를 유지)



-- Sort Area 종류

  • PGA - 서버 프로세스가 할당받는 공간
    프로세스 종속적인 고유 데이터 저장 공간
    타 프로세스와 공유하지 않아 Latch 없어 SGA 보다 빠름
  • UGA - 각 세션이 할당받는 공간
    전용 서버 방식일 경우 PGA 내부 존재(공유일 경우 SGA)
    마지막 Row Fetch 시 할당공간 반환 됨
  • CGA(Call global area)
    한번의 DB Call 시에 사용되는 공간, 끝나면 바로 PGA 반환(다음 Call 에도 계속 참조되는 데이터는 UGA 로)
    Parse, Execute, Fetch call 시에 매번 할당됨(Recursive call 일 경우도 동일)


-- Sort area 할당 위치

  • Insert, Update, Delete - UGA
    Execute call 이 끝나면 모든 데이터 처리 완료하고 커서가 닫히기 때문에 Call 을 넘어서 저장 할 필요 없음

  • SELECT
    중간 졍렬: CGA(처음 Fetch call에서만 사용하므로)
    최종 정렬: UGA(계속 이어지는 Fetch call 에서 사용해야 하므로 UGA 할당)
    sort_area_retained_size 제약 있으면 CGA에서 정렬 후 이 사이즈만큼의 공간을 UGA 로...
    이후 Fetch call 에서 Array 단위만큼 조금씩 전송






h2.B.과정

h3.소트 수행 분류

-- 메모리(PGA) 처리 가능 여부 따른 분류

  • Memory Sort(Interal Sort)
  • Disk Sort(External Sort)

-- 소트 수행 상 분류

양이 많을 때는 중간 소팅 결과값을 TEMP TBS 에 저장 후 중간 결과값을 머지 해서 최종 결과 생성
Sort run - 임시 저장한 중간 결과 값

  • Optimal Sort: Memory Sort

  • Onepass: Disk Sort

소트 영역이 TEMP TBS 에 저장한 각각의 Sort Run 에서 하나의 Chunk 씩 읽을 수 있으면 추가 Disk I/O 없이 단발성 Disk Sort 만으로 가능함


  • Multipass: Disk Sort

각각의 Sort Run 에서 Chunk 하나씩 빼서 읽는 것도 안되면 Disk 에서 읽은 데이터를 다시 Disk 에 정렬하는 작업을 반복






h2.C.소트 수행 측정

-- Trace

  • Statistics 트레이스 통계에서 sort(memory), sort(disk) 항목 참조하면 됨
  • Physical read >= Consistance gets + db block gets: Trace 의 Disk 블록 수가 Memory 블록 수를 초과할 수 없으나, Sort I/O 까지 Disk I/O 로 계산 됨
  • Buffer 에 데이터가 다 올라와 있어도 Sort로 인한 Disk I/O 발생 가능
  • Sort I/O 는 Disrect path 이므로 일반적으로 가벼움

-- 소팅 참조 가능한 뷰

  • v$sysstat (sesstat, mystat)
  • v$sort_segment
  • v$sort_usage
  • v$temp_extent_pool






h2.C.소트 튜닝은

  • 모델측면 검토
  • 소팅 발생 안하게 SQL
  • 인덱스 이용한 소팅 대체
  • 소트 Area 사이즈 튜닝