현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

복합 조건의 추정 보완: Dynamic Statistics·Column Group·Expression Statistics

Parse 시점 Sampling과 지속 저장되는 Column Group·Expression Statistics의 역할과 비용을 비교합니다.

예상 읽기 22

핵심 요약

기본 Table·Column Statistics만으로 Cardinality를 정확히 추정하기 어려운 대표 상황은 다음과 같습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
1. Statistics가 없거나 현재 Data를 충분히 설명하지 못함
2. 같은 Table의 여러 Column이 강하게 상관됨
3. WHERE 절에서 함수·산술식·CASE 표현식을 반복 사용
4. 일회성 Stage·Temporary 성격의 Object
5. 복잡한 AND·OR Predicate 또는 Parallel Query

Oracle의 주요 보완 수단입니다.

기능수집 시점저장 성격대표 대상
Dynamic StatisticsHard Parse·Optimization 중해당 Optimization의 보조 추정Missing·Stale·Insufficient Statistics, 복잡한 Predicate
Column Group StatisticsDBMS_STATS 수집Data Dictionary에 지속 저장같은 Table의 상관 Column, Equality·IN-list·GROUP BY
Expression StatisticsDBMS_STATS 수집Data Dictionary에 지속 저장함수·산술식·CASE 등 표현식 Predicate
HistogramDBMS_STATS 수집Column Statistics에 지속 저장단일 Column 값 편중
Function-Based IndexDDL·DML 시 유지실제 Access Structure표현식 Predicate의 Index Access

핵심 구분입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Dynamic Statistics
  → Parse 시점 Sample로 즉시 보완
  → Object Statistics 자체를 갱신하지 않음
  → Hard Parse 비용 발생 가능

Extended Statistics
  → 반복되는 구조적 관계를 지속 저장
  → 통계 수집 후 여러 SQL이 재사용
  → Access Path를 직접 만들지는 않음

이 이론의 범위

이 이론은 SQLP의 SQL 고급활용 및 튜닝 → 옵티마이저와 통계정보 → Dynamic·Extended Statistics 범위에서 Parse 시점 Sampling과 Column Group·Expression Statistics를 비교합니다.


학습 목표

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

  • Dynamic Statistics가 Parse 중 Recursive SQL로 Block Sample을 읽는 과정을 설명한다.
  • Dynamic Statistics가 Object Statistics를 대체하지 않고 보완하는 이유를 설명한다.
  • Level 0~11이 사용 조건과 Sample 크기를 어떻게 바꾸는지 설명한다.
  • Level 4가 같은 Table의 복잡한 AND·OR Predicate에 유용한 이유를 설명한다.
  • Column Group Statistics가 독립성 가정의 오류를 보완하는 원리를 설명한다.
  • Column Group의 Equality·IN-list·GROUP BY 적용 범위를 설명한다.
  • Expression Statistics와 Function-Based Index의 목적 차이를 설명한다.
  • Extension 정의 후 Table Statistics를 다시 수집해야 하는 이유를 설명한다.
  • SEED_COL_USAGE, REPORT_COL_USAGE, AUTO_STAT_EXTENSIONS의 역할을 설명한다.
  • Dynamic·Histogram·Column Group·Expression·FBI 중 적절한 기능을 선택한다.
  • 신규 Child Cursor에서 Starts·E-Rows·A-Rows·Buffers·Parse Time을 검증한다.

1. 기본 Statistics가 부족한 사례

다음 Query를 가정합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT customer_id,
       customer_name
FROM   customers
WHERE  country_code = 'KR'
AND    city_name    = 'SEOUL';

Statistics입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
NUM_ROWS              = 10,000,000
country_code NDV      =        100
city_name NDV         =     20,000
실제 (KR,SEOUL) Row   =  2,000,000

개별 Column을 독립으로 단순 계산하면 다음과 같습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Selectivity(country='KR') = 1/100
Selectivity(city='SEOUL') = 1/20,000

결합 Cardinality
≈ 10,000,000 × 1/100 × 1/20,000
≈ 5 Row

실제 2,000,000행과 크게 다릅니다.

원인입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
country_code와 city_name은 독립이 아님
SEOUL이라는 값이 KR이라는 정보를 거의 포함
개별 NDV만으로 실제 조합 빈도를 알 수 없음

이 오차는 다음으로 전파될 수 있습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Driving Row 심한 과소 추정
→ Nested Loops·Index Probe가 싸게 보임
→ 실제 Inner Probe·Table Access 대량 반복

2. Dynamic Statistics의 정확한 정의

Dynamic Statistics는 Optimization 중 Database가 Recursive SQL을 실행해 Table Block의 작은 Random Sample을 읽고 Predicate Selectivity와 Cardinality를 보완하는 기능입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Hard Parse
→ Object·Predicate·Plan Directive·Parallel 조건 확인
→ 필요 시 Block Sample
→ Sample에 Predicate 적용
→ Cardinality 보완
→ Cost 계산·Plan 선택

Oracle Database 12c 이전 문서의 명칭은 Dynamic Sampling이었습니다.

2.1 Object Statistics와의 차이

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Dynamic Statistics
  → 해당 Optimization을 위한 보조 Estimate
  → USER_TAB_STATISTICS의 NUM_ROWS 등을 갱신하지 않음
  → 주로 Hard Parse 비용으로 발생

DBMS_STATS Object Statistics
  → Data Dictionary에 지속 저장
  → 여러 SQL Optimization에서 재사용

Adaptive Statistics와 SQL Plan Directive가 활성화된 환경에서는 관련 정보가 내부 Repository를 통해 다른 Optimization에 활용될 수 있지만, 이를 일반 Object Statistics가 갱신된 것으로 해석하지 않습니다.

2.2 사용 여부 확인

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Note
-----
- dynamic statistics used for this statement (level=4)

Plan의 Note에서 Dynamic Statistics 사용과 Level을 확인할 수 있습니다.


3. Dynamic Statistics Level 0~11

OPTIMIZER_DYNAMIC_SAMPLING Parameter 또는 DYNAMIC_SAMPLING Hint로 Level을 설정합니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT /*+ DYNAMIC_SAMPLING(c 4) */
       c.customer_id,
       c.customer_name
FROM   customers c
WHERE  c.country_code=:country
AND    c.city_name=:city;

Oracle 26ai 기준의 핵심 흐름입니다.

Level대표 사용 조건Sample Block
0사용 안 함없음
1제한된 통계 없는 비Partition Table32
2하나 이상의 Table에 Statistics 없음, 기본 Level32
3통계 없음 또는 WHERE 표현식32
4Level 3 조건 + 같은 Table의 복잡한 AND·OR Predicate32
5Level 4 조건64
6Level 4 조건128
7Level 4 조건256
8Level 4 조건1,024
9Level 4 조건4,096
10Level 4 조건모든 Block
11Optimizer가 필요 여부·Sample을 Adaptive하게 결정자동

Level은 다음 두 축을 제어합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
1. 어떤 조건에서 Dynamic Statistics를 사용할지
2. 얼마나 많은 Block을 Sample할지

3.1 Level을 높일 때의 Trade-off

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Sample 확대
  → 추정 정확도 향상 가능
  → Recursive SQL·Parse CPU·I/O·Elapsed 증가
  → Concurrent Hard Parse 부하 증가 가능

Database 전체에 높은 Level을 일괄 적용하기보다 Session·Statement Scope에서 문제 SQL을 검증합니다.


4. Dynamic Statistics가 유용한 상황

  • Object Statistics가 없음
  • Statistics가 오래됐거나 Predicate를 충분히 설명하지 못함
  • WHERE 절에 표현식이 있음
  • 같은 Table의 복잡한 AND·OR Predicate
  • 일회성 Stage·Volatile Object
  • Parallel Execution
  • Adaptive Statistics 환경에서 관련 SQL Plan Directive가 있음
  • Extended Statistics를 미리 설계하기 어려운 Ad-hoc SQL

4.1 Volatile Table

하루 중 반복적으로 비워지고 다시 채워지는 Table은 지속 Statistics가 빠르게 현실과 달라질 수 있습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Object Statistics를 Null로 운영
→ Optimization 시 Dynamic Statistics로 현재 규모 보완

단, Hard Parse가 매우 빈번한 OLTP SQL에서는 Parse 비용을 함께 평가합니다.


5. Dynamic Statistics의 한계

5.1 Sample 오차

Sample은 전체 Data가 아닙니다.

  • 희귀값이 Sample에 없을 수 있음
  • Hot Partition·Hot Block의 분포를 놓칠 수 있음
  • Sample마다 Estimate가 달라질 수 있음
  • 복잡한 Join 전체 관계를 완전히 표현하지 못할 수 있음

5.2 Parse 비용

  • Recursive SQL
  • Sample Block I/O
  • CPU·Latch·Library Cache 작업
  • Concurrent Hard Parse 부하
  • PL/SQL Function Sampling 시 함수 실행 비용 가능

5.3 반복 구조의 비효율

매일 반복되는 핵심 SQL에서 동일한 Column 상관관계를 계속 Sample하는 것보다 Column Group Statistics가 더 안정적일 수 있습니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
일회성·Unknown
  → Dynamic Statistics

반복·구조적 관계
  → Persistent Extended Statistics

6. Column Group Statistics

Column Group은 같은 Table의 여러 Column을 하나의 통계 단위처럼 취급합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
개별 Statistics
  country_code NDV
  city_name NDV

Column Group
  (country_code, city_name)의 실제 조합 NDV·분포

Oracle 공식 적용 범위의 핵심입니다.

  • Equality Predicate
  • IN-list Predicate
  • GROUP BY Cardinality
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE country_code='KR'
AND   city_name='SEOUL'
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE (country_code, city_name)
      IN (('KR','SEOUL'), ('US','NEW YORK'))
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
GROUP BY country_code, city_name

Range Predicate와 모든 Join Correlation을 Column Group이 자동 해결한다고 단정하지 않습니다. 실제 Predicate 형태와 E-Rows를 확인합니다.

6.1 생성과 수집

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
DECLARE
  l_name VARCHAR2(128);
BEGIN
  l_name := DBMS_STATS.CREATE_EXTENDED_STATS(
    ownname   => USER,
    tabname   => 'CUSTOMERS',
    extension => '(COUNTRY_CODE,CITY_NAME)'
  );

  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => USER,
    tabname => 'CUSTOMERS'
  );
END;
/

핵심 순서입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
CREATE_EXTENDED_STATS
  → Extension 정의 생성
  → System-generated Name 반환

GATHER_TABLE_STATS
  → Data를 읽어 NDV·Histogram 등 실제 Extension Statistics 채움

Extension 정의만 만든 직후에는 실제 Statistics가 아직 채워지지 않을 수 있습니다.

6.2 METHOD_OPT로 한 번에 생성·수집

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname   => USER,
    tabname   => 'CUSTOMERS',
    method_opt =>
      'FOR ALL COLUMNS SIZE AUTO ' ||
      'FOR COLUMNS SIZE SKEWONLY (COUNTRY_CODE,CITY_NAME)'
  );
END;
/

7. Column Usage 기반 후보 탐색

대표 Workload에서 함께 사용되는 Column을 찾을 수 있습니다.

7.1 SEED_COL_USAGE

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_STATS.SEED_COL_USAGE(
    sqlset_name => NULL,
    owner_name  => NULL,
    time_limit  => 300
  );
END;
/

지정 시간 동안 Workload Column Usage를 기록합니다.

7.2 REPORT_COL_USAGE

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT DBMS_STATS.REPORT_COL_USAGE(
         ownname => USER,
         tabname => 'CUSTOMERS'
       )
FROM dual;

보고 가능한 Usage 예입니다.

  • Equality
  • Range
  • LIKE
  • NULL
  • Equality·Non-Equality Join
  • Filter Column Group
  • GROUP BY Column Group

7.3 AUTO_STAT_EXTENSIONS

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
AUTO_STAT_EXTENSIONS = OFF
  → 기본값
  → Extension을 수동 생성하거나 METHOD_OPT에 명시

AUTO_STAT_EXTENSIONS = ON
  → Workload·SQL Plan Directive 기반 자동 Column Group 생성 가능

자동 생성에만 의존하지 않고 실제 Extension과 E-Rows를 확인합니다.


8. Expression Statistics

Base Column Statistics는 표현식 결과 분포를 직접 설명하지 못할 수 있습니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE TRUNC(order_date)=DATE '2026-07-29'
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE LOWER(customer_name)=:name
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE quantity * unit_price > :amount

Expression Statistics는 표현식 결과의 NDV·Histogram·Density를 수집해 Cardinality를 보완합니다.

8.1 CREATE_EXTENDED_STATS 방식

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
DECLARE
  l_name VARCHAR2(128);
BEGIN
  l_name := DBMS_STATS.CREATE_EXTENDED_STATS(
    ownname   => USER,
    tabname   => 'ORDERS',
    extension => '(TRUNC(ORDER_DATE))'
  );

  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => USER,
    tabname => 'ORDERS'
  );
END;
/

8.2 METHOD_OPT 방식

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname   => USER,
    tabname   => 'ORDERS',
    method_opt =>
      'FOR ALL COLUMNS SIZE AUTO ' ||
      'FOR COLUMNS (TRUNC(ORDER_DATE)) SIZE SKEWONLY'
  );
END;
/

8.3 제한

  • 같은 Table의 Expression이어야 함
  • Deterministic한 반복 Expression이 적합
  • Virtual Column에는 Extended Statistics를 생성할 수 없음
  • 실제 SQL 표현식이 Statistics 정의와 일치해야 함

9. Expression Statistics와 Function-Based Index

기준Expression StatisticsFunction-Based Index
주요 목적Cardinality Estimate 개선Index Access Path 제공
저장 내용NDV·Histogram 등 요약 통계Expression Key+ROWID
DML 비용주로 Statistics 수집 시Table DML마다 Index 유지
Table Access 감소직접 보장하지 않음선택도·Projection에 따라 가능
공간Dictionary StatisticsIndex Segment
공통점Expression 분포 Statistics를 가질 수 있음Index Statistics와 Expression Access 활용
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Expression Statistics
  → Optimizer가 결과 규모를 더 정확히 예상

Function-Based Index
  → Optimizer가 실제 Expression Key를 Index Scan 가능

둘은 경쟁 기능이 아니라 함께 사용할 수 있는 서로 다른 수단입니다.


10. Histogram과 Extended Statistics 구분

문제적합한 Statistics
status='ERROR' 값 편중STATUS Histogram
country='KR' AND city='SEOUL' 상관Column Group
TRUNC(order_date)=... 표현식Expression Statistics
Statistics 없는 Stage TableDynamic Statistics
표현식 Index Access 필요Function-Based Index
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
단일 Column Skew
  ≠ Column Group 문제

Column 상관
  ≠ Histogram 하나로 완전 해결

표현식 추정
  ≠ Access Path 생성

11. Dictionary 확인

11.1 Extension 정의

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT extension_name,
       extension,
       creator,
       droppable
FROM   user_stat_extensions
WHERE  table_name='CUSTOMERS';

11.2 Extension Statistics

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT e.extension,
       c.column_name,
       c.num_distinct,
       c.density,
       c.histogram,
       c.num_buckets,
       c.last_analyzed
FROM   user_stat_extensions e
JOIN   user_tab_col_statistics c
  ON   c.table_name=e.table_name
 AND   c.column_name=e.extension_name
WHERE  e.table_name='CUSTOMERS';

Extension은 System-generated Column Name으로 Column Statistics View에 나타납니다.


12. Extended Statistics 제거와 Lifecycle

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
BEGIN
  DBMS_STATS.DROP_EXTENDED_STATS(
    ownname   => USER,
    tabname   => 'CUSTOMERS',
    extension => '(COUNTRY_CODE,CITY_NAME)'
  );
END;
/

제거 전 확인합니다.

  • 어떤 SQL·GROUP BY가 사용 중인가
  • 제거 후 E-Rows·Join Order·Plan 변화
  • AUTO_STAT_EXTENSIONS가 다시 생성할 가능성
  • Statistics 수집 시간·Dictionary 증가량
  • Pending Statistics로 사전 검증 가능한가
  • Statistics History로 복구 가능한가

13. 기능 선택 기준

상황우선 후보이유
Statistics 없는 일회성 TableDynamic StatisticsParse 중 즉시 현재 Data Sample
Volatile ObjectDynamic Statistics 또는 수집 정책지속 Statistics가 빠르게 Stale
반복되는 Equality·IN-list 상관Column Group조합 NDV·분포 지속 저장
반복 GROUP BY 조합 수 오차Column GroupGroup 조합 NDV 개선
반복 함수 PredicateExpression Statistics표현식 결과 분포 지속 저장
함수 Predicate의 Index AccessFBI + StatisticsEstimate와 Access Structure
단일 Column 값 편중Histogram값별 Selectivity
Ad-hoc 복잡 PredicateDynamic Statistics사전 Extension 설계가 어려움

14. 실행계획과 Runtime 검증

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT /*+ GATHER_PLAN_STATISTICS */
       customer_id,
       customer_name
FROM   customers
WHERE  country_code=:country
AND    city_name=:city;
SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT *
FROM TABLE(
  DBMS_XPLAN.DISPLAY_CURSOR(
    :sql_id,
    :child_no,
    'ALLSTATS LAST +PREDICATE +NOTE'
  )
);

14.1 변경 전

  • SQL_ID·Child Number
  • Starts·E-Rows·A-Rows
  • Access·Filter Predicate
  • Plan Hash Value
  • Buffers·Reads·CPU·Elapsed
  • Parse Time·Hard Parse 횟수
  • Dynamic Statistics Note

14.2 변경 후

Statistics 변경 후 기존 Cursor만 보지 않고 새 Hard Parse된 Child Cursor를 확인합니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Extended Statistics 생성·수집
→ Cursor Invalidations 또는 새 Hard Parse
→ 새 E-Rows·Plan 사용

확인합니다.

  • E-Rows가 A-Rows와 가까워졌는가
  • Access Path·Join Order·Join Method가 개선됐는가
  • Buffers·Reads·Elapsed가 감소했는가
  • Hard Parse·Statistics 수집 비용은 허용되는가
  • 다른 SQL에 Plan Regression이 없는가

14.3 Starts 비교

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Starts=1
  → E-Rows와 A-Rows 직접 비교

Starts>1
  → Expected Total ≈ E-Rows×Starts
  → Actual per Start ≈ A-Rows/Starts

Nested Loops·Correlated Subquery에서 비교 단위를 맞춥니다.

14.4 Buffers 주의

상위 Row Source Statistics가 하위 작업을 포함할 수 있으므로 모든 Plan Line의 Buffers를 단순 합산하지 않습니다.


15. 성공 판단의 기준

Extended Statistics의 목적은 E-Rows를 숫자상 완벽히 일치시키는 것만이 아닙니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
충분한 Estimate 개선
→ 올바른 Plan 선택 경계 통과
→ 실제 Resource·Elapsed 개선

가능한 결과입니다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
E-Rows는 여전히 20% 오차
하지만
NL Join → 적절한 Hash Join
Buffers 80% 감소
Elapsed 70% 감소

→ 실질적 성공

반대로 E-Rows가 개선돼도 Plan이 원래부터 최적이었다면 Runtime 차이는 작을 수 있습니다.


16. 자주 혼동하는 판단

혼동정확한 기준
Dynamic Statistics는 Object Statistics를 대체한다Parse 중 기존 통계를 보완한다
Dynamic Statistics는 실행할 때마다 수행된다주로 Hard Parse·Optimization 시점이다
Level이 높을수록 항상 좋다Sample 정확도와 Parse 비용 Trade-off다
Level 10은 항상 운영 정답이다모든 Block Sampling은 Parse 비용이 매우 클 수 있다
Column Group은 Column별 Histogram이다Column 조합 자체의 NDV·분포다
Column Group은 모든 Range·Join 문제를 해결한다Equality·IN-list·GROUP BY 중심이며 실제 Predicate를 검증한다
Extension 정의만 만들면 완료다Table Statistics를 수집해야 값이 채워진다
Expression Statistics는 FBI를 자동 생성한다Estimate와 Access Structure는 별도다
E-Rows가 좋아지면 완료다Plan·Runtime·Parse·다른 SQL 회귀를 본다
기존 Cursor로 변경 효과를 확인한다새 Child Cursor·Hard Parse를 확인한다

스스로 확인하기

개념 확인 문제

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

01Dynamic Statistics와 Object Statistics의 저장·사용 시점 차이를 설명하시오.
정답 및 해설

Dynamic·Object Statistics

  • Dynamic Statistics는 Hard Parse·Optimization 중 Recursive SQL로 Block Sample을 읽어 해당 Estimate를 보완합니다.
  • Object Statistics는 DBMS_STATS가 Data Dictionary에 지속 저장해 여러 SQL에서 재사용합니다.
  • Dynamic Statistics는 일반 Object NUM_ROWS 등을 갱신하지 않습니다.
02Dynamic Statistics Level 2·4·10·11의 핵심 차이를 설명하시오.
정답 및 해설

Level 비교

  • Level 2는 Statistics가 없는 Table이 있을 때 32 Block Sample을 사용하는 기본 Level입니다.
  • Level 4는 표현식과 같은 Table의 복잡한 AND·OR Predicate까지 사용 조건을 확장합니다.
  • Level 10은 Level 4 조건에서 모든 Block을 Sample합니다.
  • Level 11은 Optimizer가 필요 여부와 Sample 크기를 Adaptive하게 결정합니다.
03높은 Level이 Cardinality를 개선해도 운영에 불리할 수 있는 이유를 설명하시오.
정답 및 해설

높은 Level의 비용

  • Recursive SQL·Sample Block I/O·CPU가 증가합니다.
  • Hard Parse Elapsed와 Concurrent Parse 부하가 커질 수 있습니다.
  • Sample 확대가 실제 Plan을 바꾸지 않으면 Parse 비용만 증가할 수 있습니다.
04국가·도시 상관 Predicate를 Column Group으로 보완하는 원리를 설명하시오.
정답 및 해설

Column Group 원리

  • 개별 NDV를 독립 곱하는 대신 (country_code,city_name) 조합의 실제 NDV·분포를 사용합니다.
  • SEOUL과 KR처럼 종속된 값을 지나치게 축소하는 오류를 줄입니다.
05Column Group이 주로 지원하는 Predicate·연산 형태를 설명하시오.
정답 및 해설

주요 적용 범위

  • 같은 Table의 Equality Predicate
  • IN-list Predicate
  • GROUP BY Cardinality
  • 모든 Range·Join 문제를 자동 해결한다고 단정하지 않고 실제 E-Rows를 확인합니다.
06SEEDCOLUSAGE·REPORTCOLUSAGE·AUTOSTATEXTENSIONS의 역할을 설명하시오.
정답 및 해설

Usage·자동 Extension

  • SEED_COL_USAGE는 대표 Workload의 Column Usage를 지정 시간 수집합니다.
  • REPORT_COL_USAGE는 Filter·Join·GROUP BY 등에 사용된 Column·Column Group 후보를 보고합니다.
  • AUTO_STAT_EXTENSIONS는 SQL Plan Directive·Usage 기반 자동 Extension 생성을 제어하며 기본값은 OFF입니다.
07Extension 정의 후 GATHERTABLESTATS가 필요한 이유를 설명하시오.
정답 및 해설

재수집 필요 이유

  • CREATE_EXTENDED_STATS는 Extension 정의와 이름을 만듭니다.
  • 실제 NDV·Density·Histogram 값은 GATHER_TABLE_STATS가 Data를 읽어 채웁니다.
08Expression Statistics와 Function-Based Index의 목적·DML·공간 차이를 설명하시오.
정답 및 해설

Expression Stats·FBI

  • Expression Statistics는 표현식 결과 Cardinality를 개선하고 Dictionary 통계만 저장합니다.
  • FBI는 Expression Key와 ROWID를 Index Segment에 저장해 Access Path를 제공하며 DML마다 유지 비용이 발생합니다.
  • 두 기능은 필요에 따라 함께 사용할 수 있습니다.
09Dynamic·Histogram·Column Group·Expression 중 문제 원인별 선택 기준을 설명하시오.
정답 및 해설

원인별 선택

  • 통계 없는 일회성 Object·Ad-hoc 복잡 Predicate: Dynamic Statistics
  • 단일 Column 값 편중: Histogram
  • 반복되는 상관 Column: Column Group
  • 반복 함수·산술식: Expression Statistics
  • 표현식 Access가 필요하면 FBI도 검토합니다.
10적용 전후를 새 Child Cursor·Starts·E/A·Buffers·Parse Time으로 검증하는 절차를 설명하시오.
정답 및 해설

검증 절차 - 변경 전 SQL_ID·Child·Starts·E/A·Plan·Buffers·Parse Time을 저장합니다. - Extension을 생성·수집하거나 Dynamic Level을 제한적으로 적용합니다. - 새 Hard Parse된 Child Cursor와 Dynamic Statistics Note를 확인합니다. - Total 또는 Per-Start 단위를 맞춰 E/A를 비교합니다. - Runtime 이득·Parse 비용과 다른 SQL Plan Regression을 반복 검증합니다.