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 |