SQL 힌트의 사용 방법 |
● DBA는
특정
데이터에
대하여 optimizer가
알
수
없는
정보를
가질
수
있음. |
∮ 힌트의 사용 |
● 힌트의
사용범위 |
|
·DELETE, SELECT, UPDATE : SQL문 block을
시작하는 DELETE, SELECT, UPDATE 키워드입니다. 힌트를
포함하는 comments는
이
키워드들이
나타난
후에
써야합니다. |
|
옵티마이저를
위한
힌트와
사용
목표
― 힌트는 cost-based approach와 rule-based optimization approach 중에
하나를
선택
OPTIMIZER_GOAL와 OPIMIZER_MODE 초기
파라메타의
값과는
상관없이
기술된 approach를
사용.
― cost-based approach를
선택한
경우에는 best throughput와 best reponse time사이에
하나를
선택
― SQL문이 optimization approach 와 goal을
기술한
한개의
힌트를
가진다면, optimizer는 statistics의
존재여부와 ALTER SESSSION명령에
있는
∮ ALL_ROWS |
― ALL_ROWS
힌트는 best throughput(minimum total resource consumption)을
목적으로 SQL문 block을
최적화하기
위해 cost-based approach를
선택
|
∮ FIRST_ROWS |
― FIRST_ROWS
힌트는 best response time을
목적으로 SQL문 block을
최적화하기
위해 cost-based approach를
선택.(minimum resource usage to return first row)
|
∮ CHOOSE |
― CHOOSE
힌트는 statistics가
존재하고, SQL문에
의해
접근된 table에
대해 rule-based approach나 cost-based approach중
어떤
것을
쓸
것인지 optimizer가
선택.
|
∮ RULE |
― RULE 힌트는
한 SQL문 block에
대해 rule-based optimization을
선택.
|
실행 순서 방법을 위한 SQL 힌트 |
― 각
힌트들은 table에
대한 access method를
제안 |
∮ FULL |
― FULL
힌트는 table에
대해 full table scan을
선택
|
∮ ROWID |
― ROWID
힌트는 table에
대해 ROWID에
의한 table scan을
선택 |
∮ CLUSTER |
― CLUSTER
힌트는 table에
대해 cluster scan을
선택 |
∮ HASH |
― HASH
힌트는 table에
대해 HASH scan을
선택 |
∮ INDEX |
― INDEX
힌트는 table에
대해 index scan을
선택
|
∮ FULL 힌트와 INDEX 힌트의 비교 예제 |
― 1. EMPtable의
총건수는 10,000건, DEPTtable의
총건수는 2400건.
― 예제 1 analyze table emp estimate statistics; alter session set sql_trace = true; select empno, ename, sal select /*+ full(emp) */ empno, ename, sal select /*+ index(emp job_index) */ empno, ename, sal
· OPTIMIZER_GOAL 은 FIRST_ROWS로
― 예제 2 analyze table emp estimate statistics; alter session set sql_trace = true; select empno, ename, sal select /*+ full(emp) */ empno, ename, sal select /*+ index(emp job_index) */ empno, ename, sal |
∮ INDEX_ASC |
― INDEX_ASC
힌트는 table에
대한 index scan을
선택
|
∮ INDEX_DESC |
― INDEX_DESC
힌트는 table에
대해 index scan을
선택
FROM tank_readings
- step 4는
시간 T와
같거나
더
적은
모든 TIME 값들을
반환할 UN_TIME index의 range scan을
수행.
·step 2 와 1은 parent query를 실행. - step 2는 step 3에
의해
반환된 TIME 값에
맞는 UN_TIME index의 unique scan을
수행하고
관련된 ROWID를
반환.
· step 3은 T와
동일하거나
더
적은 TIME값을
찾기위해 UN_TIME index를 range scan하고
그와
관련된 ROWID를
반환.
최초의
시간을 scaning함으로서
시작하게
됨. step1은
최초의
시간에대한
온도를
반환하게
됩니다. |
∮ AND_EQUAL |
― AND_EQUAL
힌트는
몇몇의 single-column index에대한 scan을 merge하는 access path를
사용하는 execution plan을
선택
― 최소 2개 이상 최대 5개 이하의 index를 기술해야 합니다. |
∮ USE_CONCAT |
― USE_CONCAT 힌트는 OR 조건을 UNION ALL set operator를
사용하는 compound query로
변환 |
조인 순서를 위한 SQL 힌트 |
ORDERED 힌트는 join order를 제안 |
∮ ORDERED |
― ORDERED 힌트는 FROM절에 table이
나타나는
순서대로 table을 join시킨다. |
Table 조인 방법 SQL 힌트 |
● SQL문에서
나타나는
조인된 table을
정확하게
기술해야만
합니다. |
∮ USE_NL |
― USE_NL 힌트는 table을
적는
부분에 table 기술된 table은 inner table로서
사용하여 nested loops로서
다른 table의 row source와
기술된 table을 join하게
합니다.
― 예를
들어서, ACCOUNTS와 CUSTOMERS table을
조인하는 SQL문이
있다고
생각해보자. 이들 table들은 cluster에
함께
저장되지
않았다고
가정합니다.
|
∮ USE_MERGE |
― USE_MERGE 힌트는
오라클이 sort-merge join으로
각 table을
조인하게끔
하는
방법입니다. |
병렬 쿼리 실행을 위한 SQL 힌트 |
∮ CACHE |
― CACHE 힌트는 full table scan이
수행됐을
때
힌트에
있는 table에
대해 retrieve된
블록들은
버퍼
캐시에
있는 LRU list의
가장최근(most recently)에
사용되어진
것의
끝에
위치
|
∮ NOCACHE |
― NOCACHE 힌트는 full table scan이
수행됐을
때
힌트에
있는 table에
대해 retrieve된
블록들은
버퍼
캐시에
있는 LRU list의
가장
오래전(least recently)에
사용되어진
것의
끝에
위치
|
구문 연계를 고려하는 SQL 힌트 |
● SQL이
융통성이
있는
언어이기
때문에
하나
이상의 SQL문이 Application을
필요로
할
것입니다. |
∮ 두 SQL문에 대한 execution plan 비교 |
● 첫 번째 SQL문과 그것에 대한 execution plan
― step3을
통해
오라클은 DEPTNO 칼럼에 index가
있음에도
불구하고 EMPtable을 full table scan함으로서
위 SQL문을
실행합니다는
것을
알수
있습니다.
― subquery의 WHERE절이 EMPtable의 DEPTNO칼럼을
사용하므로 DEPTNO_INDEX를
사용할
수
있습니다. |
기존 SQL문을 튜닝하는 방법 |
● 존재하는 application에서 SQL 문을
튜닝하는
것은
새로운
문장을
기록하는
것과는
다른
작업(task)입니다. |
∮ Know the Application |
― application과 SQL 문장과 data에
익숙해져야
합니다.
|
∮ Use the SQl Trace Facility |
― 오라클은
성능을
측정하기
위하여
진단에
도움이
되는 tool을
몇가지
제공합니다
|
∮ Tuning Individual SQL statements |
― 사용중인
사용자
응용을
수정하지
않고 SQL문의
변경된
문법을
탐색할
수
있음을
명심하라. |
'DB - ORACLE > DB Tunning(TABLE,SQL,...)' 카테고리의 다른 글
SQL 튜닝의 기본 지식 (0) | 2015.09.23 |
---|---|
SQL 튜닝 사례 (0) | 2015.09.08 |
오라클 DB의 결합 인덱스 사용 방법 (0) | 2015.09.08 |
SQL 성능을 위한 기초적인 SQL 작성 25가지 규칙 (0) | 2015.09.07 |
RDBMS ( Relational DataBase Management System ) (0) | 2015.09.07 |