현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

옵티마이저의 한계와 역할 분담: 좋은 판단 조건 만들기

옵티마이저가 업무 의미와 잘못된 SQL 구조를 대신 해결하지 못하는 한계를 이해하고 통계·SQL·힌트의 책임 범위를 정합니다.

예상 읽기 16

핵심 요약

옵티마이저는 SQL이 요구한 결과 의미를 지키면서, 현재 제공된 통계·제약조건·설정과 실제로 사용 가능한 접근 경로 안에서 실행계획을 선택합니다. 화면이 몇 행만 필요로 하는지, 문서에만 있는 업무 규칙이 무엇인지, 미래의 동시 실행량이 얼마인지까지 스스로 추측해 SQL의 의미를 바꾸지는 않습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
좋은 실행계획을 만들기 위한 조건
= 필요한 결과와 처리 범위를 정확히 표현한 SQL
+ 현재 분포를 합리적으로 나타내는 통계
+ 검증 가능한 제약조건과 일관된 데이터 타입
+ 업무 패턴에 맞는 인덱스·파티션 등 물리 구조
+ 대표 Bind 값과 명확한 성능 목표
+ 실제 실행계획·실행 통계를 이용한 검증

따라서 SQL 튜닝은 옵티마이저와 경쟁하거나 계획 모양을 무조건 고정하는 작업이 아닙니다. 옵티마이저가 올바른 후보를 만들고 합리적으로 비교할 수 있는 조건을 제공한 뒤, 실제 실행 결과로 판단을 검증하는 작업입니다.

이 이론의 범위

이 이론은 SQL 옵티마이저 → SQL 옵티마이징 원리에서 옵티마이저의 판단 한계와 SQL 작성자·DBA·튜너의 책임 범위를 설명합니다. Histogram, Adaptive Cursor Sharing, 인덱스 설계, Call 최소화, Lock, SQL Plan Management의 상세 동작과 사용법은 후속 이론에서 다룹니다.


학습 목표

이 이론을 학습한 뒤에는 다음 내용을 설명할 수 있어야 합니다.

  • 옵티마이저가 활용할 수 있는 정보와 추측할 수 없는 업무 정보를 구분한다.
  • SQL이 업무 요구를 정확히 표현해야 하는 이유를 설명한다.
  • 존재하지 않는 인덱스나 파티션 경로를 일반 최적화 과정에서 사용할 수 없는 이유를 설명한다.
  • SQL 작성자, 데이터 모델러·DBA, 튜너의 역할을 구분한다.
  • SQL·통계·제약조건·인덱스·Bind·Hint를 검토하는 순서를 설명한다.
  • Hint가 항상 적용되는 명령이 아니며 실제 실행계획으로 확인해야 하는 이유를 설명한다.
  • 실행계획 안정성과 현재 최적성이 서로 다른 목표임을 설명한다.
  • 안전한 튜닝 절차와 회귀 검증 범위를 설명한다.

1. 옵티마이저가 판단에 사용할 수 있는 정보

옵티마이저는 Database와 SQL에 표현된 정보를 이용해 후보 실행계획을 만들고 Cost를 비교합니다.

옵티마이저가 활용할 수 있는 정보활용 예시와 주의점
SQL의 테이블·조건·조인·정렬·결과 제한가능한 Access Path, Join Order, Join Method와 처리 범위 판단
테이블·컬럼·인덱스 통계Selectivity, Cardinality, I/O·CPU Cost 추정
PK·UK·FK·NOT NULL 등 제약조건검증되고 신뢰할 수 있는 관계를 Cardinality 추정과 일부 Transformation에 활용
존재하며 사용 가능한 인덱스·파티션실제로 선택할 수 있는 물리적 Access Path 구성
Materialized View와 Query Rewrite 설정Rewrite가 활성화되고 적용 조건을 만족할 때 대체 후보로 검토
Literal과 Bind 정보Hard Parse 시점의 값과 통계를 이용한 선택도 추정에 활용 가능
Optimizer Goal과 관련 설정전체 처리량, 초기 응답시간, 기능 사용 범위 등에 영향
Oracle 버전과 기능사용할 수 있는 Transformation, 적응형 기능, 비용 모델에 영향

이 정보가 존재한다고 해서 항상 정확한 계획이 나오는 것은 아닙니다. 통계가 오래되었거나 제약조건이 실제 업무 규칙과 다르거나, Bind 값별 분포 차이가 크면 추정이 실제와 달라질 수 있습니다.

1.1 Bind 정보의 범위

옵티마이저는 Hard Parse 시 Bind 값을 확인하여 선택도를 추정할 수 있으며, 실행 이력에 따라 하나의 Bind SQL에 여러 계획을 사용하는 기능도 존재합니다. 그러나 앞으로 입력될 모든 Bind 값과 업무별 중요도를 미리 알고 있는 것은 아닙니다.

따라서 대표값뿐 아니라 인기값·희소값·대량 반환값에서도 계획과 실제 작업량을 검증해야 합니다.


2. 옵티마이저가 스스로 정할 수 없는 것

2.1 SQL에 표현되지 않은 업무 의도

다음 SQL은 고객의 모든 주문을 최신순으로 요청합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT *
FROM orders
WHERE customer_id = :customer_id
ORDER BY order_date DESC;

화면에서 최신 20건만 사용하더라도 SQL에 결과 제한이 없다면 Database가 보장해야 하는 결과는 조건에 맞는 전체 행입니다. 적절한 인덱스가 있다면 명시적인 전체 Sort를 피할 수도 있지만, 옵티마이저가 SQL의 결과 의미를 임의로 20행으로 줄일 수는 없습니다.

업무 요구가 최신 20건이라면 필요한 컬럼, 결정적인 정렬 기준, 결과 제한을 SQL에 표현해야 합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT order_id,
       order_date,
       order_status,
       total_amount
FROM orders
WHERE customer_id = :customer_id
ORDER BY order_date DESC, order_id DESC
FETCH FIRST 20 ROWS ONLY;

order_id가 고유한 키라면 같은 order_date를 가진 행 사이에서도 결과 순서를 결정할 수 있습니다.

이 SQL은 옵티마이저에 다음 정보를 제공합니다.

  • 실제로 필요한 컬럼
  • 결과의 정렬 기준
  • 필요한 최대 행 수
  • 동률 행의 순서를 결정하는 키

2.2 Database에 선언되지 않은 관계

업무상 ORDERS.CUSTOMER_ID가 항상 CUSTOMERS.CUSTOMER_ID를 참조하더라도 FK가 정의되지 않았다면, 옵티마이저는 그 관계를 Database가 검증하는 제약조건 정보로 사용할 수 없습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
업무 문서에만 있는 규칙
  ≠ Database가 검증하고 최적화에 활용할 수 있는 Constraint

실제 업무 규칙과 일치하는 PK·UK·FK·NOT NULL은 데이터 무결성뿐 아니라 Cardinality 추정과 일부 Query Transformation에 도움을 줄 수 있습니다. 다만 제약조건이 비활성·미검증 상태라면 활용 가능 범위를 별도로 확인해야 합니다.

2.3 미래의 부하와 모든 실행 환경

옵티마이저는 최적화 시점의 통계와 설정을 기준으로 판단합니다. 다음 상황을 완벽히 예측할 수는 없습니다.

  • 다음 달에 특정 상태값이 급증하는 데이터 변화
  • 배치 시간의 동시 실행량
  • 다른 세션이 유발할 Lock·CPU·I/O 경합
  • Cache 상태에 따른 실제 응답시간 차이
  • 향후 객체와 설정 변경

적응형 실행계획은 실행 중 수집한 정보로 미리 준비된 대안 중 하나를 선택할 수 있지만, 업무 요구를 새로 정의하거나 모든 미래 경합을 해결하는 기능은 아닙니다.

2.4 존재하지 않는 실행 경로

조건에 맞는 인덱스가 없으면 일반적인 Hard Parse 과정에서 그 인덱스를 사용하는 계획을 만들 수 없습니다. 파티션이 없는 테이블에서 Partition Pruning을 사용할 수도 없습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
옵티마이저는 현재 사용 가능한 후보 중에서 선택한다.
필요한 물리 구조를 매 SQL 최적화 과정에서 새로 설계하는 것은 아니다.

일부 Oracle 환경에는 Automatic Indexing 기능이 있지만, 이는 별도의 관리·검증 기능입니다. 옵티마이저가 한 SQL을 최적화하면서 존재하지 않는 인덱스를 즉석에서 만들어 사용하는 것과는 구분해야 합니다.


3. 옵티마이저만으로 해결하기 어려운 대표 문제

문제옵티마이저만으로 해결하기 어려운 이유우선 검토할 대응
불필요한 SELECT *업무에 필요한 컬럼을 알 수 없음필요한 컬럼만 명시
결과 행 과다 조회Client가 실제로 사용할 범위를 알 수 없음조건·Top-N·Pagination을 SQL에 표현
누락된 Join 조건잘못된 업무 의미를 임의로 수정할 수 없음결과 정합성에 맞는 Join 조건 작성
존재하지 않는 인덱스사용할 Access Path 자체가 없음조회·DML 패턴을 함께 고려해 인덱스 검토
오래되거나 부정확한 통계현재 분포와 다른 정보로 Cardinality 추정데이터 변화에 맞는 통계 관리
편중된 Bind 값하나의 평균적 추정이 모든 값에 적합하지 않을 수 있음대표값·편중값별 계획과 실제 행 수 확인
Row-by-Row 호출애플리케이션의 반복 Call을 실행계획 하나로 제거하기 어려움집합 처리·Batch·Call 최소화 검토
Lock 대기다른 트랜잭션이 보유한 Lock을 Access Path 선택만으로 해소하기 어려움트랜잭션 범위와 동시성 설계 점검

Row-by-Row Call과 Lock의 세부 해결 방법은 각각 Database Call 최소화, Lock과 트랜잭션 동시성 제어 이론에서 다룹니다.


4. SQL 작성자의 역할

4.1 업무 결과와 처리 범위를 정확히 표현한다

SQL 작성자는 Database가 추측하지 않아도 되도록 업무 요구를 명확하게 표현해야 합니다.

  • 필요한 행을 선별하는 조건을 작성한다.
  • 필요한 컬럼만 선택한다.
  • Join 조건을 빠뜨리지 않는다.
  • 필요하지 않은 DISTINCT, ORDER BY, 중복 Subquery를 줄인다.
  • 일부 행만 필요하면 Top-N이나 Pagination을 명시한다.
  • 정렬 결과가 반복 실행마다 일관되어야 하면 고유한 Tie-breaker를 포함한다.
  • 행마다 같은 SQL을 호출하기보다 집합 처리 가능성을 검토한다.

좋은 SQL은 단순히 짧은 SQL이 아니라, 정확한 업무 결과를 만들면서 필요 이상의 작업을 요구하지 않는 SQL입니다.

4.2 일관된 SQL Text와 Bind 사용을 설계한다

반복 실행되는 SQL은 불필요한 Hard Parse를 줄이고 Cursor를 공유할 수 있도록 설계합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
-- Literal 값마다 SQL Text가 달라지는 형태
SELECT order_id
FROM orders
WHERE customer_id = 1001;

SELECT order_id
FROM orders
WHERE customer_id = 1002;

-- 같은 SQL Text를 재사용하는 형태
SELECT order_id
FROM orders
WHERE customer_id = :customer_id;

Bind 사용은 SQL 공유와 Parse 비용 측면에서 중요합니다. 그러나 데이터 편중이 심하면 모든 Bind 값에 같은 계획이 최선은 아닐 수 있으므로 대표값별 검증이 필요합니다.

4.3 실행계획에서 질문할 수 있어야 한다

SQL 작성자는 최소한 다음 사항을 확인할 수 있어야 합니다.

  • 어떤 Row Source부터 읽는가?
  • Table Full Scan과 Index Access 중 무엇을 선택했는가?
  • Join Order와 Join Method는 무엇인가?
  • 조건이 가능한 한 이른 단계에서 행을 줄이는가?
  • 예상 Rows와 실제 행 수가 크게 다른 Operation은 어디인가?
  • 특정 Operation이 예상보다 많이 반복되는가?

실행계획을 상세히 읽는 방법은 후속 예상 실행계획SQL 트레이스 이론에서 다룹니다.


5. 데이터 모델러와 DBA의 역할

5.1 정확한 메타데이터 제공

  • PK·UK·FK·NOT NULL을 실제 업무 규칙과 일치하도록 정의한다.
  • Join 컬럼의 데이터 타입과 길이를 일관되게 설계한다.
  • 애플리케이션 Bind 타입을 컬럼 타입과 맞춰 불필요한 암묵적 형 변환을 방지한다.
  • Query Rewrite나 Partition Pruning이 필요한 경우 관련 객체와 설정을 검증한다.

5.2 적절한 물리 구조 제공

  • 핵심 조회 조건과 Join 패턴에 맞는 인덱스를 설계한다.
  • 대용량 테이블의 파티셔닝 필요성을 검토한다.
  • 반복되는 집계가 있다면 Materialized View 등 대체 구조를 검토한다.
  • 인덱스와 파티션 추가가 DML, 저장 공간, 배치 시간, 유지보수에 미치는 비용도 함께 평가한다.

5.3 통계정보 관리

  • 데이터 변화량과 배치 주기를 고려해 통계를 수집한다.
  • 파티션 통계와 글로벌 통계의 일관성을 관리한다.
  • 편중이 중요한 컬럼은 Histogram 필요성을 검토한다.
  • 상관관계가 강한 컬럼은 Extended Statistics 필요성을 검토한다.

통계 관리의 목표는 통계를 많이 만드는 것이 아니라, 옵티마이저가 실제 데이터 분포를 합리적으로 추정하도록 필요한 정보를 제공하는 것입니다.


6. 튜너의 역할과 안전한 튜닝 절차

튜너는 실행계획을 특정 모양으로 만드는 사람이 아니라, 성능 문제의 원인을 측정하고 변경의 효과와 부작용을 검증하는 사람입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
1. 업무 요구, 정상 결과, 성능 목표를 확정한다.
2. 실제 SQL Text, Child Cursor, Bind 값, 실행 빈도, 반환 행 수를 확인한다.
3. 실제 Cursor의 실행계획과 실행 통계를 기준선으로 수집한다.
4. 불필요한 작업이나 Cardinality 추정 오류가 시작되는 지점을 찾는다.
5. SQL·통계·제약조건·인덱스·데이터 모델 중 근본 원인을 우선 수정한다.
6. Hint는 가설 검증 또는 제한적 제어가 필요할 때 사용하고 실제 적용 여부를 확인한다.
7. 대표값·인기값·희소값·대량 반환값에서 결과와 성능을 다시 측정한다.
8. DML, 동시성, 저장 공간, 배치, 다른 SQL에 미치는 영향을 회귀 검증한다.

6.1 결과 정합성 검증

성능이 좋아져도 결과가 달라지면 올바른 튜닝이 아닙니다. 다음 항목을 함께 확인합니다.

  • NULL 처리
  • 중복 행
  • Outer Join에서 보존되어야 하는 행
  • 정렬 순서와 동률 행 처리
  • Top-N 경계값
  • 날짜·문자·숫자 형 변환
  • DML 대상 행과 트랜잭션 결과

7. Hint의 역할과 한계

Hint는 SQL 주석 안에 작성하여 Optimizer Mode, Query Transformation, Access Path, Join Order, Join Method 등에 영향을 주는 지시입니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT /*+ INDEX(o orders_customer_ix) */
       o.order_id,
       o.order_date
FROM orders o
WHERE o.customer_id = :customer_id;

Hint는 다음 상황에서 유용할 수 있습니다.

  • 원인 분석 중 대안 계획의 실제 작업량을 비교할 때
  • 통계나 구조를 즉시 변경하기 어려운 긴급 상황에서 제한적으로 제어할 때
  • 업무 특성을 비용 모델이 충분히 반영하지 못하는 원인을 검증할 때

7.1 Hint가 항상 적용되는 것은 아니다

Hint는 다음과 같은 이유로 적용되지 않거나 기대와 다른 결과를 만들 수 있습니다.

  • Hint 문법이나 객체 별칭이 잘못됨
  • 서로 충돌하는 Hint를 함께 사용함
  • Transformation 이후 Hint 대상 Query Block이나 객체가 달라짐
  • 지정한 경로를 사용할 수 없는 구조적 조건이 존재함
  • 다른 Hint나 Optimizer 기능과 상호작용함

따라서 Hint를 작성했다는 사실만으로 적용되었다고 판단해서는 안 됩니다. 실제 Cursor의 실행계획과 Outline·Hint Report 등 확인 가능한 정보로 적용 결과를 검증해야 합니다.

Oracle은 데이터와 환경 변화로 Hint가 오래되거나 부정적인 결과를 낼 수 있으므로, 테스트에는 활용하되 장기적인 계획 관리에는 SQL Plan Management 등 다른 수단도 검토하도록 안내합니다.


8. 실행계획 안정성과 최적성

8.1 실행계획 안정성

실행계획 안정성은 SQL이 운영 중 예측 가능한 범위의 검증된 계획을 사용하여 갑작스러운 성능 퇴행 위험을 줄이는 특성입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
안정성
  → 무조건 하나의 계획을 영구 고정한다는 뜻은 아님
  → 알려지고 검증된 계획을 예측 가능하게 사용하는 것이 핵심

SQL Plan Management는 알려진 계획을 관리하고 새로운 계획을 검증하여 사용할 수 있게 하는 대표적인 기능입니다. 하나의 Fixed Plan을 강제하는 것과 여러 Accepted Plan을 관리하는 것은 구분해야 합니다.

8.2 실행계획 최적성

실행계획 최적성은 현재 데이터량, 분포, Bind 값과 업무 목표에서 실제 작업량과 응답 특성이 가장 적절한 상태입니다.

두 목표는 항상 같지 않습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
과거에 안정적이던 계획
  → 데이터 증가와 분포 변화 후 비효율적일 수 있음

새로운 후보 계획
  → 현재 데이터에는 더 효율적일 수 있으나
     충분한 검증 없이 사용하면 회귀 위험이 있을 수 있음

따라서 계획을 단순히 고정하거나 무조건 새 계획을 허용하기보다, 현재 성능과 변경 위험을 함께 평가해야 합니다.


9. 모든 성능 문제를 옵티마이저 문제로 보면 안 된다

범위대표 확인 대상
SQL·옵티마이저SQL 구조, Cardinality 추정, Access Path, Join, Sort
데이터 모델·물리 구조테이블, 인덱스, 파티션, 제약조건, 데이터 타입
애플리케이션Call 수, Batch 처리, Connection·Statement 재사용, 불필요한 데이터 전송
동시성트랜잭션 범위, Lock, Commit 전략
인스턴스·시스템메모리, I/O, CPU와 공유 자원 경합

이 표는 각 영역의 상세 튜닝 방법을 설명하기 위한 것이 아니라, 실제 병목이 옵티마이저의 계획 선택 밖에 있을 수 있음을 구분하기 위한 경계입니다.


10. 자주 혼동하는 판단과 정확한 기준

혼동하기 쉬운 판단정확한 기준
옵티마이저가 화면에서 필요한 행 수를 알아서 판단한다SQL과 애플리케이션이 필요한 결과 범위를 명시한다
적절한 인덱스가 없으면 옵티마이저가 즉석에서 만든다일반 최적화에서는 현재 존재하고 사용 가능한 경로만 후보가 된다
Automatic Indexing과 일반 옵티마이저는 같은 기능이다Automatic Indexing은 후보 생성·검증을 수행하는 별도 관리 기능이다
최신 통계만 있으면 항상 좋은 계획이 나온다SQL 구조, 제약조건, 물리 구조, Bind 분포와 Optimizer Goal도 영향을 준다
Bind를 사용하면 모든 값에 같은 계획이 항상 최적이다값별 분포가 다르면 대표값별 실제 작업량을 검증해야 한다
Hint를 작성하면 반드시 적용된다적용 가능성·충돌·대상 Query Block을 확인하고 실제 계획으로 검증한다
Hint로 특정 계획이 나오면 튜닝이 끝난다근본 원인과 데이터 변화에 따른 유지보수 위험까지 평가한다
안정성은 하나의 계획을 영구 고정하는 것이다검증된 계획을 예측 가능하게 관리하는 것이며 여러 Accepted Plan도 가능하다
Cost가 가장 낮은 계획은 실제로 항상 가장 빠르다Cost는 추정값이므로 실제 행 수와 실행 통계로 검증한다
SQL 성능 문제는 모두 SQL 작성자의 책임이다SQL, 통계, 데이터 모델, 애플리케이션, 동시성, 시스템 문제를 구분한다

11. 핵심 정리

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
옵티마이저
  → SQL 의미를 지키면서 주어진 정보와 사용 가능한 경로 안에서 계획을 선택한다.

SQL 작성자
  → 필요한 결과, 처리 범위, 정렬, 결과 제한을 정확히 표현한다.

DBA·데이터 모델러
  → 검증 가능한 제약조건, 일관된 타입, 통계와 물리 구조를 제공한다.

튜너
  → 실제 SQL·Bind·실행계획·실행 통계로 원인을 찾고 변경 효과를 검증한다.

Hint
  → 계획에 영향을 줄 수 있지만 적용 여부와 장기 위험을 반드시 검증한다.

계획 안정성
  → 검증된 계획을 예측 가능하게 관리하는 특성이다.

계획 최적성
  → 현재 데이터와 업무 목표에서 실제 작업량이 적절한 특성이다.

좋은 튜닝은 옵티마이저가 올바른 후보를 만들 수 있도록 입력 조건을 개선하고, 예상과 실제의 차이를 근거로 해결책을 검증하는 과정입니다.


스스로 확인하기

개념 확인 문제

문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.

01옵티마이저가 활용할 수 있는 정보와 SQL에 표현되지 않으면 알기 어려운 업무 정보를 각각 세 가지 작성하시오.
정답 및 해설

알 수 있는 정보와 숨은 업무 정보

  • 옵티마이저는 SQL의 조건·조인·정렬·결과 제한, 객체 통계, 검증 가능한 제약조건, 사용 가능한 인덱스·파티션, Literal·Bind 정보, Optimizer 설정 등을 활용할 수 있습니다.
  • 화면에서 실제 필요한 행 수, 문서에만 있는 업무 관계, 미래 동시 실행량, 다른 세션의 경합, 향후 데이터 분포 변화는 SQL과 메타데이터에 표현되지 않으면 알기 어렵습니다.
02최신 20건만 필요한 화면에서 SQL에 결과 제한을 명시해야 하는 이유와 결정적인 정렬 기준이 필요한 이유를 설명하시오.
정답 및 해설

Top-N과 결정적인 정렬

  • SQL에 결과 제한이 없으면 Database는 조건을 만족하는 전체 결과를 보장해야 하므로, 화면이 일부 행만 사용해도 불필요한 처리와 전송이 발생할 수 있습니다.
  • FETCH FIRST 20 ROWS ONLY로 필요한 범위를 표현하고, 정렬값이 같은 행 사이에서도 순서가 일관되도록 고유한 Tie-breaker를 포함합니다.
03업무 문서에만 존재하고 Database Constraint로 선언되지 않은 관계가 옵티마이저에 주는 한계를 설명하시오.
정답 및 해설

선언되지 않은 관계의 한계

  • 업무 문서의 관계는 Database가 검증하는 메타데이터가 아니므로 Cardinality 추정이나 일부 Join Transformation에 사용할 수 없습니다.
  • 실제 업무 규칙과 일치하는 PK·UK·FK·NOT NULL을 신뢰 가능한 상태로 정의해야 합니다.
04일반 최적화 과정에서 존재하지 않는 인덱스를 사용할 수 없는 이유와 Automatic Indexing의 차이를 설명하시오.
정답 및 해설

존재하지 않는 인덱스와 Automatic Indexing

  • 일반 Hard Parse에서 옵티마이저는 현재 존재하고 사용 가능한 Access Path를 조합합니다. 없는 인덱스를 즉석에서 생성해 계획에 사용할 수 없습니다.
  • Automatic Indexing은 워크로드를 분석해 후보 인덱스를 생성·검증하는 별도의 관리 기능이며 일반적인 한 SQL 최적화 과정과 구분됩니다.
05SQL 작성자, DBA·데이터 모델러, 튜너의 역할을 각각 설명하시오.
정답 및 해설

역할 구분

  • SQL 작성자는 업무 결과와 처리 범위를 SQL에 정확하게 표현합니다.
  • DBA·데이터 모델러는 제약조건, 일관된 데이터 타입, 통계, 인덱스와 파티션 같은 기반을 제공합니다.
  • 튜너는 실제 SQL·Bind·실행계획·실행 통계를 수집해 원인을 찾고 변경 효과와 부작용을 검증합니다.
06Bind를 사용하더라도 대표값·인기값·희소값에서 계획을 검증해야 하는 이유를 설명하시오.
정답 및 해설

Bind 값별 검증

  • Bind는 Cursor 공유와 Parse 비용 감소에 유리하지만, 데이터 편중이 크면 값별 Selectivity와 Cardinality가 크게 다를 수 있습니다.
  • 희소값에 유리한 인덱스 계획이 인기값에는 대량의 ROWID 접근을 일으킬 수 있으므로 대표값·인기값·희소값을 나누어 검증합니다.
07Hint가 적용되지 않을 수 있는 원인을 세 가지 이상 작성하고 적용 여부를 어떻게 확인해야 하는지 설명하시오.
정답 및 해설

Hint 적용과 검증

  • 문법·별칭 오류, 상충하는 Hint, Transformation으로 인한 대상 변경, 사용할 수 없는 Access Path, 다른 Hint·Optimizer 기능과의 상호작용 때문에 적용되지 않을 수 있습니다.
  • 실제 Cursor의 실행계획, Outline 또는 Hint Report 등 확인 가능한 정보로 적용 여부와 실제 작업량을 검증합니다.
08실행계획 안정성과 최적성의 차이를 설명하고 하나의 계획을 영구 고정하는 것이 항상 안전하지 않은 이유를 설명하시오.
정답 및 해설

안정성과 최적성

  • 안정성은 알려지고 검증된 계획을 예측 가능하게 사용하는 특성입니다.
  • 최적성은 현재 데이터와 업무 목표에서 실제 작업량과 응답 특성이 가장 적절한 상태입니다.
  • 데이터량과 분포가 바뀌면 과거의 고정 계획이 비효율적일 수 있으므로, 변경 위험과 새로운 계획의 성능을 함께 검증해야 합니다.
09안전한 튜닝 절차를 업무 요구 확인부터 회귀 검증까지 순서대로 설명하시오.
정답 및 해설

안전한 튜닝 절차

  • 업무 요구·정상 결과·성능 목표 확정 → 실제 SQL·Cursor·Bind·빈도·반환량 확인 → 실제 계획과 실행 통계 기준선 수집 → 불필요한 작업 또는 추정 오류 확인 → SQL·통계·제약·인덱스·모델의 근본 원인 개선 → 필요한 경우 제한적 Hint 적용 및 확인 → 대표값별 재측정 → 결과 정합성·DML·동시성·다른 SQL 영향 회귀 검증 순서입니다.
10성능 문제를 SQL·옵티마이저, 데이터 모델, 애플리케이션, 동시성, 시스템 영역으로 구분해야 하는 이유를 설명하시오.
정답 및 해설

문제 영역 구분 - 느린 원인이 부적절한 실행계획일 수도 있지만 과도한 Call, Lock 대기, 잘못된 트랜잭션 범위, I/O·CPU 경합, 데이터 모델 문제일 수도 있습니다. - 영역을 구분해야 원인과 무관한 Hint나 인덱스를 추가하는 오류를 피하고 적절한 담당 범위와 해결 방법을 선택할 수 있습니다.