Index Cost Parameter ( Index 를 사용하다 보면 Cost 를 조정할 일이 있다. )
SQL> create table t1(c1 char(10), c2 char(10));
SQL> create table t2(c1 char(10), c2 char(10));
SQL> insert into t1
2 select level, 'x'
3 from dual
4 connect by level <= 10000
5 ;
10000 rows created.
SQL> insert into t2
2 select level, 'x'
3 from dual
4 connect by level <= 10000
5 ;
10000 rows created.
SQL> alter session set "_optimizer_cost_model"=io;
SQL> alter session set optimizer_index_cost_adj = 100;
SQL> alter session set optimizer_index_caching = 0;
SQL> explain plan for
2 select /*+ use_nl(t1 t2) */ *
3 from t1, t2
4 where t1.c1 = t2.c1
5 ;
optimizer_index_caching = 0;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 20006 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 2 |
| 2 | NESTED LOOPS | | 10000 | 429K| 20006 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
000 % | 0 | SELECT STATEMENT | | 10000 | 429K| 20006 |
025 % | 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
050 % | 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
075 % | 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
100 % | 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
SQL> explain plan for
2 select /*+ index(t1) */ *
3 from t1 where c1 > ' '
4 ;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 10000 | 214K| 1938 |
|* 2 | INDEX RANGE SCAN | T1_N1 | 10000 | | 32 |
---------------------------------------------------------------------
000 | 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
025 | 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
050 | 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
075 | 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
100 | 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
SQL>alter session set "_optimizer_cost_model" = CPU;
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 20031 (1)| 00:01:41 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 2 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 10000 | 429K| 20031 (1)| 00:01:41 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 12 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 10022 (1)| 00:00:51 |
| 0 | SELECT STATEMENT | | 10000 | 429K| 10022 (1)| 00:00:51 |
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 214K| 1940 (1)| 00:00:10 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 10000 | 214K| 1940 (1)| 00:00:10 |
|* 2 | INDEX RANGE SCAN | T1_N1 | 10000 | | 32 (0)| 00:00:01 |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 214K| 1940 (1)| 00:00:10 |
| 0 | SELECT STATEMENT | | 10000 | 214K| 1940 (1)| 00:00:10 |
SQL> alter session set "_optimizer_cost_model" = io;
SQL> alter session set optimizer_index_caching = 0;
SQL> alter session set optimizer_index_cost_adj = 100;
SQL> explain plan for
2 select /*+ use_nl(t1 t2) */ *
3 from t1, t2
4 where t1.c1 = t2.c1
5 ;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 20006 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 2 |
| 2 | NESTED LOOPS | | 10000 | 429K| 20006 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
075 | 0 | SELECT STATEMENT | | 10000 | 429K| 15006 |
050 | 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
025 | 0 | SELECT STATEMENT | | 10000 | 429K| 5006 |
015 | 0 | SELECT STATEMENT | | 10000 | 429K| 3006 |
001 | 0 | SELECT STATEMENT | | 10000 | 429K| 206 |
SQL> explain plan for
2 select /*+ index(t1) */ *
3 from t1 where c1 > ' '
4 ;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 214K| 1938 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 10000 | 214K| 1938 |
|* 2 | INDEX RANGE SCAN | T1_N1 | 10000 | | 32 |
---------------------------------------------------------------------
075 | 0 | SELECT STATEMENT | | 10000 | 214K| 1454 |
050 | 0 | SELECT STATEMENT | | 10000 | 214K| 969 |
025 | 0 | SELECT STATEMENT | | 10000 | 214K| 485 |
015 | 0 | SELECT STATEMENT | | 10000 | 214K| 291 |
001 | 0 | SELECT STATEMENT | | 10000 | 214K| 20 |
{NOTE}
This issue is fixed in 10.2.0.5 (Server Patch Set)
11.1.0.6 (Base Release)
- 정상적인 경우.
alter session set optimizer_index_cost_adj = 100;
alter session set optimizer_index_caching = 0;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 20006 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 2 |
| 2 | NESTED LOOPS | | 10000 | 429K| 20006 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
alter session set optimizer_index_cost_adj = 100;
alter session set optimizer_index_caching = 100;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 10006 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 1 |
| 2 | NESTED LOOPS | | 10000 | 429K| 10006 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | |
---------------------------------------------------------------------
alter session set optimizer_index_cost_adj = 75;
alter session set optimizer_index_caching = 100;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 7506 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 1 |
| 2 | NESTED LOOPS | | 10000 | 429K| 7506 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
alter session set optimizer_index_cost_adj = 50;
alter session set optimizer_index_caching = 100;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 5006 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 1 |
| 2 | NESTED LOOPS | | 10000 | 429K| 5006 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
alter session set optimizer_index_cost_adj = 25;
alter session set optimizer_index_caching = 100;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 2506 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 1 |
| 2 | NESTED LOOPS | | 10000 | 429K| 2506 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
alter session set optimizer_index_cost_adj = 5;
alter session set optimizer_index_caching = 100;
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 429K| 506 |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 22 | 1 |
| 2 | NESTED LOOPS | | 10000 | 429K| 506 |
| 3 | TABLE ACCESS FULL | T1 | 10000 | 214K| 6 |
|* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 |
---------------------------------------------------------------------
- 강좌 URL : http://www.gurubee.net/lecture/3911
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.