h3.(1) IOT(lndex-Organized Table)
create table index_org_t ( a number primary key, b varchar(10) )
organization index ;
일반적인 힙 구조 테이블로의 데이터 삽입은 Random 방식으로 이루어 진다
( Freelist 로 부터 할당 받은 블록에 정해진 순서 없이 값을 입력한다 )
IOT는 인텍스 구조 테이블이므로 정렬 상태를 유지하며 데이터 를 입력된다.
IOT의 장점
IOT의 단점
h3.(2) IOT, 언제 사용할 것인가?
select substr( 일자,1,6) 월도
, sum(판매금액) 총판매금액, avg( 판매금액) 평균판매금액
from 영업실적
where 사번 = 'S1234'
and 일자 between '20090101' and '20091231'
group by substr( 일자, 1, 6)
create tab1e 영업실적 ( 사번 varchar2 (5) , 일자 varchar2(8) , ....
, constraint 영업실적_PK primary key 사번,일자) ) orgaanization index;
h3.(3) Partitioned IOT
- 예시
CREATE TABLE APP_STATS
(STAT_ID NUMBER(10,0),
ACTION_DATE DATE,
VAL FLOAT(126) ,
STATUS VARCHAR2(1),
MARKER VARCHAR2(1),
primary key(stat_id,action_date)
)
organization index
partition by range(action_date)
(
PARTITION part1 VALUES LESS THAN (to_date('13-sep-2004','dd-mon-yyyy')),
PARTITION part2 VALUES LESS THAN (to_date('20-sep-2004','dd-mon-yyyy')),
PARTITION part3 VALUES LESS THAN (to_date('27-sep-2004','dd-mon-yyyy')),
PARTITION part4 VALUES LESS THAN (to_date('04-oct-2004','dd-mon-yyyy'))
)
h3.(4) Overflow 영역
Overflow 영역을 읽을 때도 건건이 Random 액세스가 발생한다
Overflow 세그먼트에 저장된 컬럼 중 일부를 자주 액세스해야 하는 상황이 발생한다면 IOT 액세스 효율은 급격히 저하된다.
Overflow 영역에도 버퍼 Pinning 효과가 나타나기 때문에 연속적으로 같은 Overflow 블록을 입을 때는 Random 블록 I/O를 최소화할 수 있다.
h3.(5) Secondary 인덱스
h5.오라클 Logical Rowid
h5.PCT_DIRECT_ACCESS
h5.비휘발성 IOT에 대한 Secondary 인텍스 튜닝 방안
-- Right- Growing 10T이더라도 pct_direct_access 값이 100이 아닐수 있다
-- 통계정보 수집후 아래 프로시져 호출
exec dbms_stats.set_index_stats (user,'t1_x1' , guessq => 100) ;
h5.휘발성 IOT에 대한 Secondary 인텍스 튜닝 방안
1.주기적으로 physical guess를 정확한 값으로 갱신 - secondary 인텍스 크기가 작을 때
alter index iot_second_idx REBUILD;
alter index iot_second_idx UPDATE BLOCK REFERENCES;
2.physical guess가 사용되지 못하도록 pct_direct_access 값을 100 미만으로 떨어뜨리는 것
h3.(6) 인텍스 클러스터 테이블
h3.(7) 해시 클러스터 테이블
SQL> create c1uster username cluster# ( username varchar2(30) )
2 hashkeys 100 size 50;;
SQL> create tab1e user cluster
2 c1uster username cluster# ( username )
3 as
4 se1ect * from all users;
SQL> create table user_regular as select * from all_users;
SQL> create unique index user_regular_idx on user_regular( username );
SQL> alter table user_reular modify user_id null;
SQL> alter table user_cluster modify user_id null;
SQL> alter session set sql_trace = true;
SQL> declare
2 l_user_id user_regular.user_id%type;
3 begin
4 for c in (select owner from objs_regular where owner <> 'PUBLIC' )
5 loop
6 select user_id into l_user_id from user_regular where username = c.owner;
7 select user_id into l_user_id from user_cluster where username = c.owner;
8 end loop;
9 end;
10 /
-- 일반 테이블
SELECT USER_ID FROM USER_REGULAR WHERE USERNAME = :B1
call count cpu elapsed disk query current rows
------- ----- ----- ------- ------ ------- --------- -------
Parse 1 0.00 0.00 0 0 0 0
Execute 30101 0.75 0.64 0 0 0 0
Fetch 30101 0.81 0.81 0 60202 0 30101
------- ----- ----- ------- ------ ------- --------- -------
total 60203 1.56 1.45 0 60202 0 30101
Rows Row Source Operation
------- --------------------------------------
30101 TABLE ACCESS BY INDEX ROWID USER_REGULAR (cr=60202 pr=O pw=O time=924994 .. . )
30101 INDEX UNIQUE SCAN USER_REGULAR_IDX (cr=30101 pr=O pw=O time=383440 us)
-- CLUSTER 테이블
SELECT USER_ID FROM USER_CLUSTER WHERE USERNAME = :B1
call count cpu elapsed disk query current rows
------- ----- ----- ------- ------ ------- --------- -------
Parse 1 0.00 0.00 0 0 0 0
Execute 30101 0.75 0.64 0 0 0 0
Fetch 30101 0.81 0.81 0 30104 0 30101
------- ----- ----- ------- ------ ------- --------- -------
total 60203 1.56 1.45 0 30104 0 30101
Rows Row Source Operation
------- --------------------------------------
30101 TABLE ACCESS HASH USER_CLUSTER (cr=3010 pr=0 time=410828 us)
h3.(8) IOT와 클러스터 테이블을 동시에 적용한 튜닝 사례
고객마스터 PK 고객 ID
고객별품목별구매내역 PK 관리지점 + 구매일자 + 품목 + 고객 ID+ 구매지점
고객별품목별구매내역 X01 고객 ID + 구매일자
\
고객마스터 PK : 고객 ID
고객마스터 X01 : 관리지점 ( 클러스터 키 인텍스)
고객별품목별구매내역 PK : 관리지점 + 구매일자 + 품목 + 고객 ID + 구매지점 (IOT)
고객별품목별구매내역 X01 고객 ID+ 구매일자