TIL
  • Contents
  • Book
    • 도메인 주도 설계
      • 1. 동작하는 도메인 모델 만들기
    • 오브젝트
      • 데이터 중심 설계
      • 책임 중심 설계
      • 책임 할당을 위한 GRASP 패턴
      • 메시지와 인터페이스
      • 객체 분해
    • Effective Java
      • Item 7 - 다 쓴 객체 참조를 해제하라
      • Item 7 발표 내용
      • Item 13 - clone 재정의는 주의해서 진행하라
      • Item 13 발표 내용
      • Item 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
      • Item 16 발표 내용
      • Item 26 - 로 타입은 사용하지 말라
      • Item 28 - 배열보다는 리스트를 사용하라
      • Item 28 발표 내용
      • Item 29 - 이왕이면 제네릭 타입으로 만들라
      • Item 30 - 이왕이면 제네릭 메서드로 만들라
      • Item 31 - 한정적 와일드 카드를 사용해 API 유연성을 높이라
      • Item 35 - ordinal 메서드 대신 인스턴스 필드를 사용하라
      • Item 37 - ordinal 인덱싱 대신 EnumMap을 사용하라
      • Item 37 발표 내용
      • Item 43 - 람다보다는 메서드 참조를 사용하라
      • Item 43 발표 정리
      • Item 56 - 공개된 API 요소에는 항상 문서화 주석을 작성하라
      • Item 56 발표 정리
      • Item 62 - 다른 타입이 적절하다면 문자열 사용을 피하라
      • Item 62 발표 정리
      • Item 73 - 추상화 수준에 맞는 예외를 던지라
      • Item 83 - 지연 초기화는 신중히 사용하라
      • Item 83 발표 내용
      • Item 89 - 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라
      • Item 89 발표 내용
    • 개발자를 위한 SQL 튜닝
      • SQL 쿼리 실습을 위한 DB 서버 구축
      • 인덱스 튜닝
      • 인덱스 스캔 튜닝
      • 인덱스 스캔 튜닝 실습
      • 인덱스 패스트 풀 스캔
      • 테이블 풀 스캔 튜닝
      • 조인 튜닝
      • 중첩 루프 조인 튜닝
      • 중첩 루프 조인 튜닝 실습
      • 해시 조인 튜닝
      • 해시 조인 튜닝 실습
      • 세미 조인 튜닝
      • 세미 조인 튜닝 실습
      • 아우터 조인
      • 함수 튜닝
      • 부분 범위 처리 튜닝
      • 파티셔닝 튜닝
      • 파티션 인덱스 튜닝
      • 병렬 처리 튜닝
  • Java
    • Design Pattern
      • Intro
      • Types of Design Patterns
      • Creational
        • Builder Pattern
        • Singleton Pattern
        • Prototype Pattern
        • Factory Pattern
        • Abstract Factory Pattern
      • Structural
        • Adapter Pattern
        • Bridge Pattern
        • Composite Pattern
        • Decorator Pattern
        • Facade Pattern
        • Flyweight Pattern
        • Proxy Pattern
      • Behavioural
        • Chain of Responsibility Pattern
        • Command Pattern
        • Interpreter Pattern
        • Iterator Pattern
        • Mediator Pattern
        • Memento Pattern
        • Observer Pattern
        • State Pattern
        • Strategy Pattern
        • Template Method Pattern
        • Visitor Pattern
    • Java
      • Cracking the Coding Interview
      • TDD, Clean Code with Java 11기
        • 자동차 레이싱
        • 로또
        • 사다리 타기
        • 볼링 게임 점수판
    • 궁금증
      • 자바 8 버전의 인터페이스와 추상클래스
      • 자바의 제네릭은 어떻게 이전 버전과 호환되는 걸까?
      • 스프링 MVC 기본 구조
      • 마샬링과 직렬화
      • 인터뷰 질문 모음
      • Code Coverage
  • Database
    • Database
      • SQL 레벨업
      • DB 스터디
        • DBMS
          • MySQL
        • INDEX
        • Join(Nested Loop, Hash)
        • Join(Semi, Outer)
        • Partial Range Processing
        • Function
        • Partitioning
        • Parallel Processing
  • Network
  • Architecture
    • Issue
      • Git Push Error
      • SonarLint Warning - assertThatExceptionOfType()
  • Infra
  • Spring
    • Spring JPA
      • 1. 데이터 모델링 및 연관관계 설정
      • 2. 최적화 내용
      • 3. Spring-Data-Jpa
      • 4. Query DSL
    • Spring Security
      • Intro
    • Spring Batch
      • 배치용 디비 설치
      • 배치 데이터 분석하기
      • 배치 프로세스 구상하기 및 성능 차이 확인하기
  • Issue
  • Tistory
    • Tistory Blog
  • Design High Performing Architectures
  • Design Resilient Architectures
  • Design Secure Applications And Architectures
  • Design Cost-Optimized Architectures
Powered by GitBook
On this page
  • 인덱스 튜닝
  • 인덱스 스캔 튜닝
  • 인덱스와 테이블의 관계
  • 테이블 랜덤 액세스(Table Random Access)는 뭘까?

Was this helpful?

  1. Book
  2. 개발자를 위한 SQL 튜닝

인덱스 스캔 튜닝

쿼리 튜닝에 대한 개념 익히기

Previous인덱스 튜닝Next인덱스 스캔 튜닝 실습

Last updated 3 years ago

Was this helpful?

내용에서 참고한 내용입니다.

인덱스 튜닝

  • 인덱스 스캔의 효용성

  • 인덱스 풀 스캔과 인덱스 패스트 풀 스캔의 장단점

  • 인덱스 스캔보다 테이블 풀 스캔이 유리한 상황

인덱스 스캔 튜닝

  • 오라클은 디스크 소트와 테이블 풀 스캔을 회피하기 위해서 인덱스를 이용한다.

  • 디스크 소트

    • 정렬 작업을 메모리 내에서 완료하지 못할 정도로 용량이 커서 디스크 공간까지 활용한 정렬 연산을 의미한다.

  • 테이블 풀 스캔

    • 테이블 스페이스에 저장된 테이블을 처음부터 끝까지 전체 검색하는 것을 뜻한다.

B-Tree 인덱스

  • 데이터가 정렬된 상태로 저장되어서 부하가 큰 소드 연산(Sort Operation)을 회피하는데 유용하게 이용된다.

  • 오라클은 인덱스를 생성하는 데 있어서 다양한 옵션을 제공한다.

    • 한 개(1) 또는 여러 개(N)의 컬럼으로 구성된 인덱스를 생성할 수 있는데, 한 개의 컬럼으로만 구성된 인덱스를 '단일 컬럼 인덱스'라 한다.

    • 2개 이상의 컬럼으로 구성된 인덱스를 '복합 컬럼 인덱스'라 한다.

    • 인덱스 마다 정렬되는 순서를 오름차순(ASC) 또는 내림차순(DESC)로 설정할 수 있다.

  • B-Tree 인덱스는 성별과 같이 선택도가 높은 컬럼보다는 주민등록번호나 이름 같이 선택도가 낮은 컬럼에 생성하는 것이 유리하다.

  • 인덱스로 활용할 수 없는 상황

    • 인덱스가 생성된 컬럼을 NVL, TRIM과 같은 내장 함수로 감싸는 경우 인덱스 사용이 불가능하다.

B-Tree 인덱스의 구성도

  • 인덱스 수직 탐색

    • 루트에서 리프까지 수직으로만 탐색하는 기법

  • 인덱스 수평 탐색

    • 인덱스의 리프 블록을 인덱스의 논리적 순서에 따라 수평으로 탐색하는 기법

인덱스와 테이블의 관계

  • 인덱스와 테이블은 각각의 객체이다.

    • 인덱스와 테이블은 논리적/물리적 완전하게 분리되어 있다.

  • 리프 블록에는 ROWID(테이블의 최우선 순위 인덱스)를 저장하고 있다.

  • 인덱스 스캔이 성공하면 해당 ROWID를 이용하여 테이블액세스를 하게 되는데, 이러한 연산을 테이블 랜덤 액세스(Table Random Access)라 한다.

  • 테이블 랜덤 액세스가 많아지면 시스템에 많은 부하를 주게 된다.

    • 테이블 랜덤 액세스를 줄이는 것이 인덱스 스캔 튜닝의 핵심 이슈가 된다.

정리

  • 인덱스와 테이블은 서로 논리적/물리적으로 분리되어 존재하는 객체이고, 인덱스 스캔 후 테이블 랜덤 액세스라는 비용이 발생한다.

테이블 랜덤 액세스(Table Random Access)는 뭘까?

  • 인덱스 스캔 시 인덱스의 리프 블록에는 해당 테이블의 행을 가리키는 ROWID가 존재한다.

  • 인덱스 스캔이 완료되면 해당 ROWID를 이용하여 테이블 액세스를 하게 되는데, 이러한 과정을 테이블 랜덤 액세스라 한다.

  • 대량의 데이터를 인덱스 스캔 후, 테이블 랜덤 액세스 하는 횟수가 많아지면 시스템에 큰 부하를 주게된다.

  • 테이블 랜덤 액세스의 횟수로 인덱스 스캔의 효율을 평가하기도한다.

  • 특정 인덱스를 스캔하여 100건이 나왔고, 테이블 랜덤 액세스 후의 결과도 100건 이라면, 인덱스 스캔의 비효율은 없다고 평가한다.

  • 인덱스를 스캔하여 100건이 나왔는데 테이블 랜덤 액세스후의 결과는 1건인 경우, 인덱스 스캔의 비효율이 크므로 다른 인덱스를 사용하거나 인덱스 순서 조정 및 인덱스 컬럼을 추가 해야 한다.

  • ROWID가 아무리 최우선 순위 인덱스라고 하더라도 각각의 행을 랜덤하게 가져오게 되므로 비용이 매우 크게 발생한다.

테이블 랜덤 액세스를 줄이기 위한 인덱스 스캔 튜닝

  • 적절한 인덱스를 생성하고 해당 인덱스를 사용함으로써 테이블 풀 스캔을 회피하거나 소트 연산을 생략하는 것을 뜻한다.

  • 적절한 인덱스를 이용하여 인덱스 스캔을 한다면 대용량 테이블에서 원하는 데이터를 빠르게 검색할 수 있다.

인덱스 스캔 튜닝 관련 힌트

  • INDEX

    • 사용자가 지정한 테이블과 인덱스를 선택하여 인덱스 스캔을 유도하는 힌트

    • 인덱스 스캔을 유도할 테이블과 인덱스를 입력

SELECT /*+ INDEX(테이블 인덱스) */
  • 선택도가 높은 컬럼에 대해서 오라클 옵티마이저는 인덱스 스캔보다는 테이블 풀 스캔이 유리하다고 판단한다.

    • 하지만 INDEX 힌트를 사용하여 인덱스 스캔을 유도할 수 있다.

SELECT /*+ INDEX(테이블명 컬럼명) */
  • FULL

    • 선택도가 낮은 컬럼을 오라클의 옵티마이저가 인덱스 스캔이 유리하다고 판단하지만 FULL 힌트를 사용하여 테이블 풀 스캔을 유도 할 수 있다.

SELECT /*+ FULL(테이블) */
개발자를 위한 오라클 SQL 튜닝