본문 바로가기
스터디북

<11/12> Neighbors Know My Name

by 파이어볼러 2015. 11. 12.

SQL AREA를 먼저 살펴본다 cursor와 실행계획 참조 3s check recursive call


select 바인드 변수 2개 ascii code


hash value 만들 고 SQL AREA에서 검사를 먼저 한다 get miss할 경우


3S check


server recursive call 던짐 dictionary cache


실행계획


CBO


table 3일 경우 table order 3!=6 abc bca cba 6개로 펙토리얼 계산


조인 필요하고 인덱스도 있고 타는게 좋나? FULL scan? 3에 3승 계산 27개


join 9개 6* 27*9 1458 이중 best generator로 


_optimizer_max_permutations                                                     

2000


하드파싱의 안 좋은 면


옵티마이저가 실행계획 만듬 그 후


chunk를 쪼개서 공간을 만듬 래치 필요


hard parsing이 끝남 


다시 또 들어와서 같은 hash value가 있을 경우


syntax check를 할 필요가 없다 그러나 권한 및 의미 분석 검사는 해야 한다


2s recursive call은 한다


pin 사용한다


실행계획 재사용 soft parse


SQL AREA를 자세히 보면


hash value를 가지고 bucket을 열어서 해당 데이터를 찾아간다


select가 날아가면 hash value


get miss 방 배정 받고 커서 할당 받으면 version count는 무조건 하나 생김


schema가 다를 경우 version count 가 하나 더 늘고 cursor은 같이 사용


실행계획이 다를 수 있는건 index의 유무


리터럴 값을 20에서 30으로 바꿈 새로 방 얻고 새로 만들고 실행계획 만듬


cursor_sharing similar, force일 경우 시스템 바인드 변수로 변환해서 처리


======================================


execute


해당 인덱스의 정보를 받았다 DBA 값을 버퍼 캐시에서 먼저 찾아본다


미스가 발생하면 datafile에 가서 찾는다 프리버퍼를 할당 받기 위해


LRU 알고리즘을 사용한다 래치 cbc


인덱스 테이블은 클래스가 다르다 


row 를 pga로 보내고 execute 끝 fetch까지 끝


adaptive 실행계획의 선택도 병합


=======================================


update


lock byte tx slot 


redo에 change vectore


undo 이전값 저장


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


9-17 oracle-base 에서 안좋은 sql들 조회도 가능하다


RIO 가 가장 좋은 것은 SQL 튜닝


orcl@SYS> select /* example */ * from hr.employees natural join hr.departments;


orcl@SYS> select sql_id, sql_text from v$sql

  2  where sql_text like '%example%';


SQL_ID

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

SQL_TEXT

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

454rug2yva18w

select /* example */ * from hr.employees natural join hr.departments


7x3zumkyfr07r

select sql_id, sql_text from v$sql where sql_text like '%example%'



orcl@SYS> exec dbms_workload_repository.modify_snapshot_settings(topnsql => 'MAXIMUM');


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.05

orcl@SYS> exec dbms_workload_repository.create_snapshot();


PL/SQL procedure successfully completed.


Elapsed: 00:00:02.17

orcl@SYS> exec dbms_workload_repository.modify_snapshot_settings(topnsql => 'DEFAULT');


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.01

orcl@SYS> select sql_id, sql_text from dba_hist_sqltext where sql_id='454rug2yva18w';


SQL_ID        SQL_TEXT

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

454rug2yva18w select /* example */ * from hr.employees natural join hr.departments


Elapsed: 00:00:00.08

orcl@SYS> select plan_table_output from table

  2  (dbms_xplan.display_awr('454rug2yva18w'));


PLAN_TABLE_OUTPUT

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

SQL_ID 454rug2yva18w

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

select /* example */ * from hr.employees natural join hr.departments


Plan hash value: 2052257371


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

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

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

|   0 | SELECT STATEMENT   |             |       |       |     7 (100)|         |

|   1 |  HASH JOIN         |             |    11 |   990 |     7  (15)| 00:00:01 |

|   2 |   TABLE ACCESS FULL| DEPARTMENTS |    11 |   231 |     3   (0)| 00:00:01 |

|   3 |   TABLE ACCESS FULL| EMPLOYEES   |   107 |  7383 |     3   (0)| 00:00:01 |

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



15 rows selected.


Elapsed: 00:00:00.08

orcl@SYS> select plan_table_output from table

  2  (dbms_xplan.display_awr('7x3zumkyfr07r'));


PLAN_TABLE_OUTPUT

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

SQL_ID 7x3zumkyfr07r

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

select sql_id, sql_text from v$sql where sql_text like '%example%'


Plan hash value: 903671040


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

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

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

|   0 | SELECT STATEMENT |                   |       |       |     1 (100)|

|   1 |  FIXED TABLE FULL| X$KGLCURSOR_CHILD |     1 |   523 |     0   (0)|

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



13 rows selected.


Elapsed: 00:00:00.05


index range 범위를 생각하기 위해서는 출력하고자 하는 결과를 생각했어야 했다 범위를 줄이는데 실패했고 다만 정렬에 너무 집착했다 index_desc 힌트를 통한 강제 내림차순을 시키면 사용자가 원하는 내림차순 정렬과 속도를 잡을 수 있다.

'스터디북' 카테고리의 다른 글

[11/13] 실습 1  (0) 2015.11.13
<11/13> Bravo  (0) 2015.11.13
<11/11> 기대했단 말야  (0) 2015.11.11
<11/10> Pathétique  (0) 2015.11.10
<11/09> Fine China  (0) 2015.11.09