달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'프로그래밍'에 해당되는 글 394

  1. 2010.04.01 '10.03.02 story
2010. 4. 1. 13:30

'10.03.02 story DataBase이야기2010. 4. 1. 13:30

인덱스

update emp

set ename = 'BOB'

where ename = 'KING'

 

ename컬럼에 인덱스가 있다.

KING을 BOB으로 바꾸는데

잎 노드에 KING을 넣고

BOB이 있는 잎 노드에는 접근 하지 않는다

다만, 어떤사람이 BOB이 있는 잎 노드에 삽입이 일어나면 BOB은 이때 삭제된다.

 

인덱스가 있는 컬럼에 DML작업을 하면

lf_rows 수는 증가한다. del_lf_rows수도 증가

아직 del_lf_rows컬럼의 로우들을 지우지 않았다는 말이다. del_lf_rows는 목적 없는 '슬롯'이 남겨져 있으며, 인덱스 내의 물리적 공간을 점유하고 있다.

삭제된 것들의 공간을 재사용 하려는 의도를 보이자, 오라클은 전체 블록을 정리할 기횔ㄹ 가지고 del_lf_rows의 수는 줄어드게 된다.

 

dba_objects

owner, object_name 컬럼에서

owner을 기준으로 압축했을 때는 낮은 집중도

하나의 owner 값에 수천개의 object_name이 있으므로,

반면에, object_name을 기준으로 압축했을 때는 높은 집중도 하나의 object_name에 몇가지의 owner만 있으므로

 

높은 집중도를 가진 인덱스에서

owner를 기준으로 검색했을 때

skip scanning index 방법을 사용한다.

이유는, object_name에 owner값은 몇개 없으므로 비용이 작게 든다.

하지만, 낮은 집중도를 가진 인덱스에서는

object_name을 기준으로 검색했을 때

full scan table 방법을 사용한다.

이유는, owner에 object_name값은 수천개이므로, 인덱스 풀 스캔으로 찾아서 테이블을 조회하는 비용이 full scan table 방법보다 비싸기 때문이다.

 

인덱스를 생성한데에는 많은 비용이 발생한다.

만들어지는 동안 테이블 잠금이 필요하기 때문에 다른 DML 실행을 막는 문제점이 있다.

 

다행스럽게도 제약조건을 제어하여 제거되지 않는 비 - 유일 인덱스를 리용하도록 할 수 있다.

 

사용하는 기법은 연기가능 제약조건

(deferrable constraint)

create table inventory(

partno number(4) constraint partno_pk

primary key defferable intially immediate,

partdesc varchar2(35) constraint partdesc_uq

unique deferrable initially immediate);

 

역 키 인덱스(reverse key index)

순차적으로 증가만하는 시퀀스 같은 일련번호들이 있다. 100명의 사용자가 동시에 한 leaf블록에 접근한다면 이는 엄청난 부하가 아닐 수 없다. 이를 해결 하기 위해 reverse key index를 이용하는데 이를 이용하면 블록의 수가 많아지고 낭비하는 공간도 늘어나기 떄문에 저울질을 해보고 결정해야 한다. 또한 이를 이용하면

범위스캔도 불가능하게 된다.

 

create index emp_empno_reverse_idx

on emp(empno);

 

함수 기반 인덱스

select name, salary, dept

from emp

where upper(name) = 'BOB';

 

name에 대한 인덱스는 있는데 함수가 적용되어 있으므로 인덱스를 이용할 수 없다.

 

위의 함수를 이용했을 때 인덱스를 사용하기 위해서는 함수 기반 인덱스를 생성해야 한다.

 

create index emp_upper_name_idx

on emp(upper(name));

 

함수기반인덱스를 작성할 때는 반드시 함수가 정적이어야 한다. 상황에 따라 바뀌는 값이 아니라 입력값에 따라 출력값이 결정되어야한다.

 

'DataBase이야기' 카테고리의 다른 글

'03.03.05 story  (0) 2010.04.01
'10.03.03 story  (0) 2010.04.01
'10.02.06 story  (0) 2010.04.01
'10.02.05 story  (0) 2010.04.01
'10.02.04 story  (0) 2010.04.01
:
Posted by НooпeУ


Code Start Code End