CARDINALITY

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Hint 명

CARDINALITY

[편집] Syntax

/*+ CARDINALITY(query_block_name n) */

[편집] 지원

9i~

[편집] 상세 설명

특정 Query Block의 Cardinality를 강제로 지정한다. Cardinality를 지정함으로써 Oracle이 지정된 Cardinality에 기반한 실행 계획을 수립하게끔 하는 목적으로 사용된다.

이 Hint의 장점은 CBO의 특성을 이용한다는 것이다. 일반적으로 INDEX, FULL과 같은 Hint들을 실행 계획 자체를 고정시켜 버리는 반면에 CARDINALITY Hint는 예측 로우 수만을 부여하고 나머지는 Optimizer에에 일임한다. 따라서 CBO의 동작 방식에 따라 좀 더 유연한 실행 계획 수립이 가능하다.

[편집] 사용 예제

[편집] 예제 1

아래 예를 보자.

UKJA@ukja10> select count(*) from t_px1;

  COUNT(*)
----------
    500000

Elapsed: 00:00:03.17

UKJA@ukja10> select count(*) from t_px1 where c2 like '%name%';

  COUNT(*)
----------
    500000

Elapsed: 00:00:03.35

t_px1 테이블의 로우 건수는 500,000건이며 c2 like '%name%' 조건을 만족하는 로우 건수도 동일한 500,000건이다.

UKJA@ukja10> explain plan for
  2  select * from t_px1 where c2 like '%name%';

Explained.

Elapsed: 00:00:00.01
UKJA@ukja10> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3915865122

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       | 25072 |   220K|   241   (3)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| T_PX1 | 25072 |   220K|   241   (3)| 00:00:03 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("C2" LIKE '%test%')

13 rows selected.

하지만 예측 로우 건수는 25,000건 정도로 실제 로우 건수의 5%에 불과하다. Oracle의 Optimizer는 LIKE '%' 검색에 대해 적절한 해석을 할 수 없기 때문에 항상 5%의 값으로 예측한다. 위의 예제의 경우 매우 부정확한 결과를 낳는다는 것을 알 수 있다.

UKJA@ukja10>  explain plan for
  2  select /*+ cardinality(t_px1 500000) */ *
  3  from t_px1 where c1 like '%test%';

Explained.

Elapsed: 00:00:00.00
UKJA@ukja10> @plan

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3915865122

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |   500K|  4394K|   243   (4)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| T_PX1 |   500K|  4394K|   243   (4)| 00:00:03 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_CHAR("C1") LIKE '%test%')

13 rows selected.

하지만, CARDINALITY Hint를 부여하면 예측 로우수를 우리가 원하는 값을 바꿀 수 있다. 이렇게 되면 Oracle은 정확한 로우 수에 기반해서 실행 계획을 수립할 수 있다.

[편집] 관련 정보

  1. OPT_ESTIMATE 힌트