☞How to Use Indexs |
● 인덱스 생성 시기 |
♣ When to Create Indexes |
▶ 질의어에서 select하는 row의 비율이 적을 경우, 인덱스를 사용하면 질의의 성능이 향상 |
· 질의에서 선택된 column의 값이 동일한 Rows들은 그 Table에 할당된 data block에 균일하게 분산되어있음. |
♣ How to Choose Columns to Index |
▶ 인덱스를 생성할 column을 선택하기 위한 지침 ■ NOTE · 서로 다른 값이 거의 없는 column에 대해서는 인덱스를 생성하지 않는다. |
♣ How to Choose Composite Indexes |
■결합인덱스(Composite index) ■결합인덱스의 장점 |
|
|
· 각 column의 분포도 보다 결합 인덱스에서 결합된 분포도가 더 좋을 경우 ▶ 결합 인덱스 구성시 column순서 배치를 위한 지침 |
♣ How to Write Statements That Use Indexes |
▶ 인덱스 생성 후, optimizer는 단순히 인덱스가 존재한다는 이유만으로 인덱스를 사용하는 access path를 사용하지 않음. |
♣ How to Write Statements That Avoid Using Indexes |
▶ 경우에 따라서 SQL문에 대해서 기존 인덱스를 사용하는 access path의 사용을 강제적으로 억제 가능, (특정 인덱스의 분포도가 너무 나빠서 오히려 full table scan이 더 효과적인 경우에 인덱스의 사용을 억제 가능.) |
· SQL문의 의미를 바꾸지 않고 SQL문을 수정 ■ 1. SELECT * FROM tab1 WHERE col1=’A’ ■해결방법 ■NOTE : |
☞How to Use Clusters |
♣ 테이블들을 클러스터링하기 위한 지침 |
■ 클러스터링이 유용한 경우 ■클러스터링이 유용하지 않은 경우 ▶ 응용의 필요에 따라 요구되는 동일한 클러스터링의 장단정을 잘 고려해야 한다. |
☞How to Use Hashing |
♣ Hash cluster를 사용하기 위한 지침 |
■ Hash cluster사용이 유용한 경우 ■ Hash cluster사용이 유용하지 않은 경우 ▶ 응용의 필요에 따라 Hash cluster의 장단정을 잘 고려해야 함. |
♣ How to Determine How Many Hash Value to Use |
▶ Hash cluster를 생성할 때 해쉬 값의 수를 정하기 위하여 CREATE CLUSTER문의 HASHKEYS 파라메타를 사용 |
☞How to Use Hints |
● 응용설계자는 특정 데이터에 대하여 optimizer가 알 수 없는 정보를 가질 수 있음. |
♣ Hints의 사용 |
● Hints의 사용범위 ▶ SQL문을 위한 Optimization approach |
▶ 간단한 SELECT, UPDATE, DELETE SQL문 |
·DELETE, SELECT, UPDATE : SQL문 block을 시작하는 DELETE, SELECT, UPDATE 키워드이다. Hint를 포함하는 comments는 이 키워드들이 나타난 후에 써야한다. |
▶ hint가 쓰인 comment가 DELETE, SELECT, UPDATE 키워드 뒤에 오지 않고, 다른 곳에 쓰여 있는 경우 · 오라클은 SQL*Forms Version 3 Trigger와 같은 PL/SQL Version1을 사용하는 환경에서는 모든 SQL 문에 있는 hint들을 무시. |
☞ |
▶ hint는 cost-based approach와 rule-based optimization approach 중에 하나를 선택 |
♣ ALL_ROWS |
▶ ALL_ROWS hint는 best throughput(minimum total resource consumption)을 목적으로 SQL문 block을 최적화하기 위해 cost-based approach를 선택 |
♣ FIRST_ROWS |
▶ FIRST_ROWS hint는 best response time을 목적으로 SQL문 block을 최적화하기 위해 cost-based approach를 선택.(minimum resource usage to return first row) ▶ optimizer는 best response time을 목적으로 아래 SQL문를 최적화하려면. ▶ SQL문에 ALL_ROWS나 FIRST_ROWS hint를 기술하고, data dictionary가 그 SQL문에 의해 접근되는 table에 대해 어떤 statistics도 포함하지 않는다면, optimizer는 내부적으로 execution plan을 선택하고, missing statistics를 추정할 default statistics 값을 사용. |
♣ CHOOSE |
▶ CHOOSE hint는 statistics가 존재하고, SQL문에 의해 접근된 테이블에 대해 rule-based approach나 cost-based approach중 어떤 것을 쓸 것인지 optimizer가 선택. |
♣ RULE |
▶ RULE hint는 한 SQL문 block에 대해 rule-based optimization을 선택. |
☞ |
▶ 각 hint들은 table에 대한 access method를 제안 |
♣ FULL |
▶ FULL hint는 테이블에 대해 full table scan을 선택 |
♣ ROWID |
▶ ROWID hint는 테이블에 대해 ROWID에 의한 table scan을 선택 |
♣ CLUSTER |
▶ CLUSTER hint는 테이블에 대해 cluster scan을 선택 ·SELECT –+ CLUSTER emp, ename, deptno |
♣ HASH |
▶ HASH hint는 테이블에 대해 HASH scan을 선택 |
♣ INDEX |
▶ INDEX hint는 테이블에 대해 index scan을 선택
· sex의 열은 index되어 있고, 이 칼럼은 ‘M’과 ‘F’의 값을 가짐. · SELECT /*+ INDEX(patients sex_index) Use SEX_INDEX, since there are few male patients */ |
♣ FULL hint와 INDEX hint의 비교 예제 |
▶ 1. EMP테이블의 총건수는 10,000건, DEPT테이블의 총건수는 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 hint는 테이블에 대한 index scan을 선택
|
♣ INDEX_DESC |
▶ INDEX_DESC hint는 테이블에 대해 index scan을 선택
FROM tank_readings
– step 4는 시간 T와 같거나 더 적은 모든 TIME 값들을 반환할 UN_TIME 인덱스의 range scan을 수행. ·step 2 와 1은 parent query를 실행. – step 2는 step 3에 의해 반환된 TIME 값에 맞는 UN_TIME index의 unique scan을 수행하고 관련된 ROWID를 반환.
· step3 은 T와 동일하거나 더 적은 TIME값을 찾기위해 UN_TIME 인덱스를 range scan하고 그와 관련된 ROWID를 반환. |
♣ AND_EQUAL |
▶ AND_EQUAL hint는 몇몇의 single-column index에대한 scan을 merge하는 access path를 사용하는 execution plan을 선택
▶ 최소 2개 이상 최대 5개 이하의 index를 기술해야 한다. |
♣ USE_CONCAT |
▶ USE_CONCAT hint는 OR 조건을 UNION ALL set operator를 사용하는 compound query로 변환 |
☞Hint for join Orders |
ORDERED hint는 join order를 제안 |
♣ ORDERED |
▶ ORDERED hint는 FROM절에 table이 나타나는 순서대로 테이블을 join시킨다. ·SELECT /*+ ORDERED */ tab1.col1, tab2.col2, tab3.col3 |
☞ |
● 이절에서의 hint는 테이블을 위한 join operation을 언급 |
♣ USE_NL |
▶ USE_NL hint는 테이블을 적는 부분에 테이블 기술된 table은 inner table로서 사용하여 nested loops로서 다른 테이블의 row source와 기술된 table을 join하게 한다.
▶ 예를 들어서, ACCOUNTS와 CUSTOMERS 테이블을 조인하는 SQL문이 있다고 생각해보자. 이들 테이블들은 cluster에 함께 저장되지 않았다고 가정한다. ·SELECT accounts.balance, customers.last_name, customers.first_name |
♣ USE_MERGE |
▶ USE_MERGE hint는 오라클이 sort-merge join으로 각 테이블을 조인하게끔 하는 방법이다. |
☞ |
♣ CACHE |
▶ CACHE hint는 full table scan이 수행됐을 때 hint에 있는 테이블에 대해 retrieve된 블록들은 버퍼 캐시에 있는 LRU list의 가장최근(most recently)에 사용되어진 것의 끝에 위치 |
♣ NOCACHE |
▶ NOCACHE hint는 full table scan이 수행됐을 때 hint에 있는 테이블에 대해 retrieve된 블록들은 버퍼 캐시에 있는 LRU list의 가장 오래전(least recently)에 사용되어진 것의 끝에 위치 |
☞ |
● SQL이 융통성이 있는 언어이기 때문에 하나 이상의 SQL문이 Application을 필요로 할 것이다. |
♣ 두 SQL문에 대한 execution plan 비교 |
● 첫 번째 SQL문과 그것에 대한 execution plan
▶ step3을 통해 오라클은 DEPTNO 칼럼에 인덱스가 있음에도 불구하고 EMP테이블을 full table scan함으로서 위 SQL문을 실행한다는 것을 알수 있다. ▶ 그러나, 아래의 SQL문은 인덱스에 접근함으로서 동일한 행을 SELECT한다.
▶ subquery의 WHERE절이 EMP테이블의 DEPTNO칼럼을 사용하므로 DEPTNO_INDEX를 사용할 수 있다. |
☞How to Tune Existing SQL Statements |
● 존재하는 application에서 SQL 문을 튜닝하는 것은 새로운 문장을 기록하는 것과는 다른 작업(task)이다. |
♣ Know the Application |
▶ application과 SQL 문장과 data에 익숙해져야 한다. |
♣ Use the SQl Trace Facility |
▶ 오라클은 성능을 측정하기 위하여 진단에 도움이 되는 tool을 몇가지 제공한다 |
♣ Tuning Individual SQL statements |
▶ 사용중인 사용자 응용을 수정하지 않고 SQL문의 변경된 문법을 탐색할 수 있음을 명심하라. |