카테고리 없음

Outline - SQL 변경 불가 시 Tunning 방법

kto2005 2011. 6. 29. 23:57

 

1. SQL Tunning 한다, SQL 없다!

 

SQL Tunning 하지만 SQL Text 수정할 없는 환경 많이 생기고 있다.  Package 솔루션 ,

Java
Hibernate Framework 같은 이 그 예이. 위와 환경의 SQL Tunning 뢰를 우리가 할수 있는 방법

들을 .

 

 

1) Parameter 수정

Parameter 변경은 적이어서 위험 높다. 제로 용할 있는 파라 미터의 적이.

 

 

2) Physical Design

Partition 나누, Block Size 바꾸,   Phsyical Atribute 수정 방법이 .

 

 

3) 통계

Wolfgang Breitling 의해 화된 TCF(Tuning By Cardinality Feedback) 기법이 여 기에 . CBO 바른


있도 통계 정보를 보완주는 .

 

 

조작 에는 으며 Table/Column/Index/Histogram 든 통계 동으로 조작할 . ,  


으로 변경된 통계 정보는 자동 백 업(10g) 되지 않는 사실과 통계 정보 집시 작된 정보를 덮어

써버린 것을 유의 하여 하여야 .

 

 

Index 생성거나 Index Key 변경 넓은 범위서는 범주에 .

 

 

4) Stored Outline

Stored Outline 원래 Plan Stability 위해 제안된 개념지만, 실세에서 이 목적 용되는 경우는 .

Outline 꿔치 통해 Query Tuning 도구로 활용 되기도 .

 

 

5) SQL Profile

10g 에서 소개된 SQL Profile SQL Tuning Advisor 제공 하나. SQL Tuning Advisor SQL 분석


H
int 통해 Query  성능 선이 경 우에는 당하는 Profile 제공. Profile 사용 Query 실행


획을 조 작할 .

 

DBMS_SQLTUNE 지의 UNDOCUMENTED PROCEDURE 용하면 동으로 Profile 하고 작할 수도 .


점에서 Stored Outline 사용하는 것과 거의 이라고 .

 

 

6) Advanced Rewrite

10g 에서 소개된 Advanced Rewrite SQL Text 가로채서 다른 SQL Text 로 변환하는 기능을 미한.

DBMS_ADVANCED_REWRITE 패키 용한.

 

 

언뜻 보면 가장 강력 확실한 으로 인다.

 

 

하지, Bind 변수가 Query 등이 기본적으 지원 는다는 점은 적이 . Parse 과정서의


각해 OLTP 에는 맞지 않다 결론을 얻을 수 . DW 쿼리에서 적으로 고안된 .  지만


Parse 과정에서
오버드를 감수해서라도 Query 높여야할 다면 려해볼 방 법이다

  

이번 노트서는 Stored Outline, 10g SQL Profile, 11g SQL Baseline 소개 하겠.

 

2.      Stored Outline

 

Stored Outline 으로 Plan 고정 시킬 .

기존의 제되는 가지, Outline 생성하여 해당 SQL Text 대한 Plan Tunning SQL Plan


해결 유도 SQL Tunning 시도 있다.

 

 

2.1.   Outline User Outline

 

SQL> conn /as sysdba

SQL> grant create any outline to nero;

SQL> grant execute on dbms_outln to nero;
SQL> grant execute on dbms_outln_edit to nero;

2.2.   Outline Test

 

SQL> create table nero_detail as select scott.dept;
SQL> create table nero_master as select scott.emp;

 

 

Index

 SQL> alter table nero_detail add constraint nero_detail_pk primary key(empno);
SQL> alter table nero_master add constraint nero_master_pk primary key(deptno);

2.3.   Outline Table

 

SQL> exec dbms_stats.gather_table_stats(user,'nero_detail', cascade=>true, no_invalidate=>false);

SQL> exec dbms_stats.gather_table_stats(user,'nero_master', cascade=>true, no_invalidate=>false);

 

 

2.4.   수정 SQL Plan

 

SQL> set autotrace traceonly explain

SQL> select e.ename from nero_detail e, nero_master d where e.deptno = d.deptno;

 

 

---------------------------------------------------------------------------------

| Id    | Operation                 | Name            | Rows   | Bytes | Cost  (%CPU)| Time         |

---------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |                    |       14 |      168 |         3     (0)| 00:00:01 |

|     1 |  NESTED LOOPS             |                    |       14 |     168 |         3     (0)| 00:00:01 |

|*   2 |     TABLE ACCESS  FULL|  nero_detail     |       14 |      126 |         3     (0)| 00:00:01 |

|*   3 |     INDEX UNIQUE SCAN|  nero_master_PK |         1 |         3 |         0     (0)|  00:00:01  |

---------------------------------------------------------------------------------

 

 

Nested Loop Join 풀리는 .

 

 

2.5.   수정 SQL Outline

 

SQL> set autotrace off

SQL> create or replace outline ORG_OTLN

on

select e.ename from nero_detail e, nero_master d where e.deptno = d.deptno;

2.6.   Tunning SQL Plan

 

SQL> set autotrace traceonly explain

SQL> select /*+ use_hash(d) */ e.ename from nero_detail e, nero_master d where e.deptno

= d.deptno;

 

 

---------------------------------------------------------------------------------

| Id    | Operation                 | Name            | Rows   | Bytes | Cost  (%CPU)| Time         |

---------------------------------------------------------------------------------
|
     0 | SELECT  STATEMENT      |                    |       14 |      168 |         5    (20)| 00:00:01 |

|*   1 |  HASH  JOIN              |                    |       14 |     168 |         5    (20)| 00:00:01 |

|     2 |     INDEX FULL  SCAN     | nero_master_PK |         4 |       12 |         1     (0)|  00:00:01  |

|*   3 |     TABLE ACCESS  FULL|  nero_detail     |       14 |      126 |         3     (0)| 00:00:01 |

---------------------------------------------------------------------------------

 

 

2.7.   Tunning SQL Outline

 

SQL> create or replace outline NEW_OTLN

on

select /*+ use_hash(d) */ e.ename from nero_detail e, nero_master d where e.deptno =

d.deptno;

 

 

2.8.   생성 Outline

 

SQL> select name, sql_text from user_outlines;

NAME                                  SQL_TEXT

--------- --------------------------------------------------------------------------------
ORG_OTLN   select  e.ename  from  nero_detail  e,  nero_master  d where  e.deptno  = d.deptno NEW_OTLN   select  /*+  use_hash(d)  */ e.ename  from  nero_detail  e,  nero_master  d where  e.dept

 

 

2.9.   Outline

 

-     Stored Outline 하기 outln user 변경

SQL> conn outln/outln

 

 

 

 

 

 

 

-     ORG_OTLN, NEW_OTLN 대한 실제 Outline 확인한.

SQL> select ol_name, hint#, hint_text from ol$hints;

OL_NAME        HINT#           HINT_TEXT

--------- ------ ----------------------------------------------------------- ORG_OTLN         1 USE_NL(@"SEL$1"  "D"@"SEL$1")

ORG_OTLN             2 LEADING(@"SEL$1" "E"@"SEL$1" "D"@"SEL$1")

ORG_OTLN             3 INDEX(@"SEL$1" "D"@"SEL$1" ("nero_master"."DEPTNO")) ORG_OTLN                         4 FULL(@"SEL$1" "E"@"SEL$1")

ORG_OTLN             5 OUTLINE_LEAF(@"SEL$1") ORG_OTLN      6 ALL_ROWS


 

ORG_OTLN             7 OPTIMIZER_FEATURES_ENABLE('10.2.0.1') ORG_OTLN         8 IGNORE_OPTIM_EMBEDDED_HINTS

NEW_OTLN             2 LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1") NEW_OTLN 3 FULL(@"SEL$1" "E"@"SEL$1")

NEW_OTLN             4 INDEX(@"SEL$1" "D"@"SEL$1" ("nero_master"."DEPTNO")) NEW_OTLN                         5 OUTLINE_LEAF(@"SEL$1")

NEW_OTLN             6 ALL_ROWS

NEW_OTLN             7 OPTIMIZER_FEATURES_ENABLE('10.2.0.1') NEW_OTLN         8 IGNORE_OPTIM_EMBEDDED_HINTS

NEW_OTLN             1 USE_HASH(@"SEL$1" "E"@"SEL$1")

 

 

SQL> select ol_name, sql_text, category, hintcount from outln.ol$;

OL_NAME                     SQL_TEXT                                                          CATEGORY      HINTCOUNT

---------- ------------------------------------------------- -------- ---------- NEW_OTLN   select  /*+ use_hash(d) */ e.ename  from  o                                                      DEFAULT           8

ORG_OTLN      select  e.ename  from nero_detail e, nero_master d     DEFAULT           8

 

 

 

 

-     힌트 트를 맞추기 위해 ORG_OTLN Hintcount NEW_OTLN Hintcount

변경

SQL> update outln.ol$ set hintcount = (select hintcount from outln.ol$ where ol_name='NEW_OTLN') where ol_name='ORG_OTLN';

 

 

1 row  updated

 

 

 

 

 

 

-     Nested Loop 실행 요약본은 이제 이상 필요 므로           ORG_OTLN 힌 트들은

SQL> delete from ol$hints where ol_name = 'ORG_OTLN';

 

 

8 rows deleted.

 

 

 

 

-     ORG_OTLN 힌트를 삭제 NEW_OTLN 힌트 ORG_OTLN 가 되도록 OL_NAME .

SQL> update ol$hints set ol_name = 'ORG_OTLN' where ol_name='NEW_OTLN';


 

8 rows updated.

 

 

 

 

-     ol$nodes 뷰의 ORG_OTLN 데이트

SQL> select * from ol$nodes where ol_name in('ORG_OTLN','NEW_OTLN');

OL_NAME      CATEGORY      NODE_ID   PARENT_ID   NODE_TYPE  NODE_TEXTLEN  NODE_TEXTOFF  NODE_NAME

---------  ---------  --------  ----------  ----------  ------------  ------------  ----------

 

ORG_OTLN   DEFAULT

1

0

3

65

1 SEL$1

NEW_OTLN   DEFAULT

1

0

3

84

1 SEL$1

 

 

 

 

SQL> delete from ol$nodes where ol_name ='ORG_OTLN';

1 row  deleted.

 

 

 

 

-     ORG_OTLN 힌트를 삭제 NEW_OTLN 힌트 ORG_OTLN 가 되도록 OL_NAME 버림

SQL> update ol$nodes set ol_name = 'ORG_OTLN' where ol_name ='NEW_OTLN';

1 row  updated

 

 

SQL> commit;

 

 

 

 

 

 

2.10. Tunning Plan 확인.

 

SQL> conn nero/nero

 

 

SQL> alter session set use_stored_outlines=true; SQL> set autotrace traceonly explain

 

SQL> select e.ename from nero_detail e, nero_master d where e.deptno = d.deptno;

 

 

-- 같은 SQL 장이 실행계 Hash Join   수행됨을 가능.

---------------------------------------------------------------------------------

| Id    | Operation                 | Name            | Rows   | Bytes | Cost  (%CPU)| Time         |

---------------------------------------------------------------------------------


 

|     0 | SELECT  STATEMENT      |                    |       14 |      168 |         5    (20)| 00:00:01 |

|*   1 |    HASH  JOIN               |                    |       14 |      168 |         5    (20)| 00:00:01 |

|     2 |     INDEX FULL  SCAN     | nero_master_PK |         4 |       12 |         1     (0)|  00:00:01  |

|*   3 |     TABLE ACCESS  FULL|  nero_detail     |       14 |      126 |         3     (0)| 00:00:01 |

---------------------------------------------------------------------------------

 

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

 

1 - access("E"."DEPTNO"="D"."DEPTNO")

3 - filter("E"."DEPTNO"  IS  NOT  NULL)

 

 

Note

-----

- outline "ORG_OTLN"  used for  this statement

 

 

2.11. Outline Tunning

 

1) 바꿀 PLAN USE_CONCAT 힌트를 하는 OR-Expansion 경우에는

concatenation 2 번째 블럭은 OL$HINTS 에서 HINT 어를 할수 .

2)   10.2.0.3 전에서는 Outline 생성 LCO invalidation 하는, Cursor Purge 기능(patch5614566 - aix,linux 10203 에도 backporting  )을 사용하지 못한.

3) cursor_sharing = force(similar) 용하는 사용할 .

4) Outline SQL Text 비교하는 방식라서 SQL Text 완벽 일해야 .

 

 

 

3.      SQL Profile ( 10g )

 

Stored Outline Full, Index Direct Hint 성되, SQL Profile OPT_ESTIMATE Cardinality 어하 Hint 성되어 .

 

 

3.1.   SQL Profile User

 

SQL> grant ALTER ANY SQL PROFILE to sqlprf;

 

 

3.2.   SQL Profile Test

 

SQL> create table lms_mst as select * from scott.dept; SQL> create table lms_dtl as select * from scott.emp;


 

 

Index

 

 

SQL> alter table lms_dtl add constraint nero_detail_pk primary key(empno); SQL> alter table lms_mst add constraint nero_master_pk primary key(deptno);

 

 

3.3.   수정 SQL Plan

 

SQL> explain plan for

select /*+ use_nl(e d) */ e.ename from lms_dtl e, lms_mst d where e.deptno = d.deptno;

 

 

SQL> select * from table(dbms_xplan.display);

------------------------------------------------------------------------------

| Id    | Operation                 | Name       | Rows    | Bytes | Cost  (%CPU)| Time          |

------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |               |       14 |      168 |         8     (0)| 00:00:01 |

|     1 |    NESTED LOOPS               |               |       14 |      168 |         8     (0)| 00:00:01 |

|     2 |     TABLE ACCESS  FULL|  LMS_MST |       4 |       12 |         3     (0)| 00:00:01 |

|*   3 |     TABLE ACCESS  FULL|  LMS_DTL |       4 |       36 |         1     (0)| 00:00:01 |

------------------------------------------------------------------------------

 

 

3.4.   Tunning SQL Full Hint Naming

 

Advanced Option 용하여 Full Hint Naming . SQL Profile 수동 조작 하려면 Full Hint Naming Convention 사용 해야 .

 

 

SQ> explain plan for

select /*+ use_hash(d) */ e.ename from lms_dtl e, lms_mst d where e.deptno = d.deptno; SQL> select * from table(dbms_xplan.display(null, null, advanced));

 

------------------------------------------------------------------------------

| Id    | Operation                 | Name       | Rows    | Bytes | Cost  (%CPU)| Time          |

------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |               |       14 |      168 |         7    (15)| 00:00:01 |

|*   1 |    HASH  JOIN               |               |       14 |      168 |         7    (15)| 00:00:01 |

|     2 |     TABLE ACCESS  FULL|  LMS_MST |       4 |       12 |         3     (0)| 00:00:01 |

|     3 |     TABLE ACCESS  FULL|  LMS_DTL |     14 |      126 |         3     (0)| 00:00:01 |

------------------------------------------------------------------------------


 

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------- Query  Block  Name / Object  Alias (identified by operation  id):

-------------------------------------------------------------

 

 

1 - SEL$1

2 - SEL$1 / D@SEL$1

3 - SEL$1 / E@SEL$1

 

 

Outline Data

-------------

/*+ PLAN_TABLE_OUTPUT

------------------------------------------------------------- BEGIN_OUTLINE_DATA

USE_HASH(@"SEL$1"  "E"@"SEL$1") LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1") FULL(@"SEL$1" "E"@"SEL$1")

FULL(@"SEL$1" "D"@"SEL$1") OUTLINE_LEAF(@"SEL$1") ALL_ROWS

OPTIMIZER_FEATURES_ENABLE('10.2.0.4') IGNORE_OPTIM_EMBEDDED_HINTS END_OUTLINE_DATA

*/

 

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------

 

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

 

1 - access("E"."DEPTNO"="D"."DEPTNO")


 

-----------------------------------------------------------

 

 

1 - (#keys=1) "E"."ENAME"[VARCHAR2,10]

2 - "D"."DEPTNO"[NUMBER,22]

 

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------

3 - "E"."ENAME"[VARCHAR2,10],  "E"."DEPTNO"[NUMBER,22]

 

 

3.5.   SQL Profile

 

SQL Profile 성할 Hint 록을 공해야 하며,      Full Hint Naming

Convention .

 

 

Tunning   Full Hint Name 을, 정할 없는 SQL import 한다.

 

 

SQL> begin dbms_sqltune.import_sql_profile( name=>'nero_prof',

sql_text=>

'select /*+ use_nl(e d) */ e.ename from lms_dtl e, lms_mst d where e.deptno =

d.deptno',

profile=>sqlprof_attr('USE_HASH(@"SEL$1" "E"@"SEL$1")',

'LEADING(@"SEL$1" "D"@"SEL$1" "E"@"SEL$1")',

'FULL(@"SEL$1" "E"@"SEL$1")',

'FULL(@"SEL$1" "D"@"SEL$1")')

);

end;

 

/

PL/SQL procedure successfully  completed.

 

 

3.6.   Tunning Plan 확인.

 

SQL> explain plan for

select /*+ use_nl(e d) */ e.ename from lms_dtl e, lms_mst d where e.deptno = d.deptno; SQL> select * from table(dbms_xplan.display);

 

-----------------------------------------------------------------------------


 

| Id    | Operation                 | Name       | Rows    | Bytes | Cost  (%CPU)| Time          |

------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |               |       14 |      168 |         7    (15)| 00:00:01 |

|*   1 |    HASH  JOIN               |               |       14 |      168 |         7    (15)| 00:00:01 |

|     2 |     TABLE ACCESS  FULL|  LMS_MST |       4 |       12 |         3     (0)| 00:00:01 |

|     3 |     TABLE ACCESS  FULL|  LMS_DTL |     14 |      126 |         3     (0)| 00:00:01 |

------------------------------------------------------------------------------

 

 

 

 

PLAN_TABLE_OUTPUT

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

---------------------------------------------------

1 - access("E"."DEPTNO"="D"."DEPTNO") Note

-----

-  SQL profile "nero_prof" used for this statement

 

4.      SQL Plan Baseline ( 11g )

 

-     SQL Magement Base

SQL Plan Management 관리 Library

 

 

-     Statement Log

반복되는 SQL plan history , 마다 활용

 

 

-     Automatic SQL Tuning Task

Load 량이 많은 SQL  동등하거 계획만

 

 

-     SMB (Segment Management Base)

SQL Profile, Plan History, Plan Baselines, Plan History, Statement Log

 

 

4.1.   SQL Plan Baseline Test

 

SQL> create table bls_mst as select * from scott.dept; SQL> create table bls_dtl as select * from scott.emp;


 

Index

 

 

SQL> alter table bls_dtl add constraint nero_detail_pk primary key(empno); SQL> alter table bls_mst add constraint nero_master_pk primary key(deptno);

 

 

통계정보 생성

 

 

SQL> exec dbms_stats.gather_table_stats(user, 'bls_mst', no_invalidate=>false); SQL> exec dbms_stats.gather_table_stats(user, 'bls_dtl', no_invalidate=>false);

 

 

4.2.   Tunning SQL Plan Baseline Capture

 

SQL> alter session set optimizer_capture_sql_plan_baselines = true;

SQL> select /*+ use_nl(e d) */ e.ename from bls_dtl e, bls_mst d where e.deptno =

d.deptno;

 

 

ENAME

---------- SMITH

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

 

 

14 rows selected.

 

 

 

SQL> select /*+ use_nl(e d) */ e.ename from bls_dtl e, bls_mst d where e.deptno = d.deptno;

 

 

ENAME


 

---------- SMITH

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

 

 

14 rows selected.

 

 

SQL> alter session set optimizer_capture_sql_plan_baselines = false;

4.3.   Tunning SQL Plan Baseline

 

SQL> col sql_handle new_value v_sql_handle

SQL> select sql_handle from dba_sql_plan_baselines

2    where sql_text like 'select /*+ use_nl(e d) */ e.ename%';

 

 

SQL_HANDLE

------------------------------ SYS_SQL_ae6d7e4ca2ffd67c

 

 

SQL> select * from dba_sql_plan_baselines where sql_handle

='SYS_SQL_ae6d7e4ca2ffd67c';

 

 

1.2569E+19 SYS_SQL_ae6d7e4ca2ffd67c              select /*+ use_nl(e d) */ e.ename from bls_dtl e, bls_mst d where e.deptno = d.d SYS_SQL_PLAN_a2ffd67c3c380fcf SQLBSLN   AUTO-CAPTURE                                                    SQLBSLN

 

 

11.1.0.6.0                                                                                              09/03/03

20:47:11.000000                                                                                         09/03/03


 

20:47:11.000000

09/03/03  20:47:36.000000

YES  YES  NO YES                        3  SQL*Plus

 

 

-+  Column Value  하였.

 

 

4.4.   Tunning SQL Plan

 

SQL> select /*+ use_hash(d) */ e.ename from bls_dtl e, bls_mst d where e.deptno =

d.deptno;

 

 

ENAME

---------- SMITH

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

 

 

14 rows selected.

 

 

SQL> select sql_id, plan_hash_value from v$sql

where sql_text like 'select /*+ use_hash(d) */ e.ename%';

 

 

SQL_ID              PLAN_HASH_VALUE

------------- ---------------

0qwm4r9r8dyyn           1553352241

 

 

SQL> var nero_var number;


 

 

 

SQL> exec :nero_var := dbms_spm.load_plans_from_cursor_cache(-

sql_id=>'0qwm4r9r8dyyn', - plan_hash_value=>1553352241, - sql_handle=>'SYS_SQL_ae6d7e4ca2ffd67c');

 

 

PL/SQL procedure successfully  completed.

 

 

4.5.   생성 Baseline .

 

Tunning 되지 못한 SQL Text 개의 Baseline 생성 것을 한다.

 

 

SQL> select sql_handle, sql_text from dba_sql_plan_baselines where sql_text like 'select /*+ use_nl(e d) */ e.ename%';

 

 

SQL_HANDLE

------------------------------ SQL_TEXT

-------------------------------------------------------------------------------- SYS_SQL_ae6d7e4ca2ffd67c

select /*+ use_nl(e d) */ e.ename from  bls_dtl e,  bls_mst d where  e.deptno  = d.d

 

 

SYS_SQL_ae6d7e4ca2ffd67c

select /*+ use_nl(e d) */ e.ename from  bls_dtl e,  bls_mst d where  e.deptno  = d.d

 

 

4.6.   등록 Plan History 확인.

 

SQL> select * from table(dbms_xplan.display_sql_plan_baseline(' SYS_SQL_ae6d7e4ca2ffd67c’));

 

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

 

-------------------------------------------------------------------------------- SQL  handle:  SYS_SQL_ae6d7e4ca2ffd67c

SQL  text: select /*+  use_nl(e  d)  */ e.ename from bls_dtl  e,  bls_mst d where e.deptno = d.deptno

--------------------------------------------------------------------------------


 

--------------------------------------------------------------------------------

Plan name: SYS_SQL_PLAN_a2ffd67c3c380fcf

Enabled:  YES         Fixed: NO            Accepted:  YES         Origin: AUTO-CAPTURE

-------------------------------------------------------------------------------- Plan hash value: 386123697

 

-------------------------------------------------------------------------------------

| Id    | Operation                 | Name                   | Rows    | Bytes  | Cost (%CPU)|  Time         |

-------------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |                           |       14 |     168 |         3     (0)|  00:00:01  |

|     1 |    NESTED LOOPS               |                           |       14 |     168 |         3     (0)|  00:00:01  |

|     2 |     TABLE ACCESS  FULL|  BLS_DTL           |       14 |     126 |         3     (0)|  00:00:01  |

|*   3 |     INDEX UNIQUE SCAN|  NERO_MASTER_PK |          1 |         3 |         0     (0)|  00:00:01  |

-------------------------------------------------------------------------------------

 

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

 

3 - access("E"."DEPTNO"="D"."DEPTNO")

 

 

-------------------------------------------------------------------------------- Plan name: SYS_SQL_PLAN_a2ffd67c694097be

Enabled:  YES         Fixed: NO            Accepted:  YES         Origin: MANUAL-LOAD

-------------------------------------------------------------------------------- Plan hash value: 1553352241

 

-------------------------------------------------------------------------------------

| Id    | Operation                 | Name                   | Rows    | Bytes  | Cost (%CPU)|  Time         |

-------------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |                           |       14 |     168 |         5    (20)|  00:00:01  |

|*   1 |    HASH  JOIN               |                           |       14 |     168 |         5    (20)|  00:00:01  |

|     2 |     INDEX FULL  SCAN     | NERO_MASTER_PK |          4 |       12 |         1     (0)|  00:00:01  |

|     3 |     TABLE ACCESS  FULL|  BLS_DTL           |       14 |     126 |         3     (0)|  00:00:01  |

-------------------------------------------------------------------------------------

 

 

Predicate Information (identified by operation id):


 

---------------------------------------------------

 

 

1 - access("E"."DEPTNO"="D"."DEPTNO")

 

 

4.7.   Tunning Plan

 

SQL> alter session set optimizer_use_sql_plan_baselines = true; SQL> explain plan for

2   select /*+ use_nl(e d) */ e.ename from bls_dtl e, bls_mst d where e.deptno = d.deptno; SQL> select * from table(dbms_xplan.display);

 

Plan hash value: 386123697

 

 

-------------------------------------------------------------------------------------

| Id    | Operation                 | Name                   | Rows    | Bytes  | Cost (%CPU)|  Time         |

-------------------------------------------------------------------------------------

|     0 | SELECT  STATEMENT      |                           |       14 |     168 |         3     (0)|  00:00:01  |

|     1 |    NESTED LOOPS               |                           |       14 |     168 |         3     (0)|  00:00:01  |

|     2 |     TABLE ACCESS  FULL|  BLS_DTL           |       14 |     126 |         3     (0)|  00:00:01  |

|*   3 |     INDEX UNIQUE SCAN|  NERO_MASTER_PK |          1 |         3 |         0     (0)|  00:00:01  |

-------------------------------------------------------------------------------------

 

 

Predicate Information (identified by operation id):

---------------------------------------------------

3 - access("E"."DEPTNO"="D"."DEPTNO") Note

-----

-  SQL plan baseline "SYS_SQL_PLAN_a2ffd67c3c380fcf" used for this  statement

 

 

조정된 Query Cost 높으, 조정 전의 Query Plan 된다.