달력

122024  이전 다음

  • 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

[QUERY] index rebuild 예

DB 2006. 7. 16. 02:09

Oracle 9i 부터는 대부분의 인덱스 타입에 대해 다른 사용자의 작업에 영향을 주지 않으며 index를 재구성하는 방법인 online index rebuild를 지원 합니다.

인덱스 rebuild 절차는 다음과 같습니다.

1.        rebuild 하려는 index의 대상 table에 발생하는 변경 대상을 index가 생성되는 tablespace에 “temporary index organized journal table”을 만들어 기록
2.        다른 사용자의 select는 rebuild 하기 전의 인덱스를 사용
3.        다른 사용자가 rebuil 되기 전의 인덱스에 변경을 가하면 journal table에 기록
4.        rebuild 작업이 완료되면 journal table에 있던 변경 내용과 merge
5.        merge 작업은 20 rows 마다 commit 됨

인덱스 rebuild 방법에 대해 예를 통해 보도록 하죠…

SQL> conn scott/tiger
연결되었습니다.

SQL> create table test_emp (
  2  emp_id varchar2(10) not null,
  3  emp_name varchar2(10) not null,
  4  salary number
  5  );

테이블이 생성되었습니다.

SQL> );
SP2-0042: 알 수 없는 명령어 ")" - 나머지 줄 무시.
SQL> insert into test_emp values ('A0000001','1길동',5000);

1 개의 행이 만들어졌습니다.

SQL> insert into test_emp values ('A0000003','3길동',3000);

1 개의 행이 만들어졌습니다.

SQL> insert into test_emp values ('A0000002','2길동',2000);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select * from test_emp;

EMP_ID     EMP_NAME       SALARY
---------- ---------- ----------
A0000001   1길동            5000
A0000003   3길동            3000
A0000002   2길동            2000

SQL> create index idx_emp_id_reverse on emp(emp_id) reverse;
create index idx_emp_id_reverse on emp(emp_id) reverse
                                       *
1행에 오류:
ORA-00904: 열명이 부적합합니다


SQL> create index idx_emp_id_reverse on test_emp(emp_id) reverse;

인덱스가 생성되었습니다.

SQL> alter index idx_emp_id_reverse rebuild online;

인덱스가 변경되었습니다.

SQL> alter index idx_emp_id_reverse rebuild compute statistics online;

인덱스가 변경되었습니다.

SQL> -- oracle8i에서는 general index라고 할지라도 compute statistics와 online을
같이 사용하면 오류가 발생

SQL> create index idx_ename_sal_fnc
  2  on test_emp (emp_name desc, (salary / 10)*100);
on test_emp (emp_name desc, (salary / 10)*100)
                                          *
2행에 오류:
ORA-01031: 권한이 불충분합니다

--------------------------------------------------------------
위의 함수 기반 인덱스를 만들기 위해서는 QUERY REWRITE 권한이 있어야 합니다.

함수 기반 인덱스란,,,,함수(function)이나 수식(expression)으로 계산된 결과에 대해 인덱스를 생성하여 사용할 수 있는 기능을 제공 합니다. 질의 수행 시 해당 함수, 수식을 처리하여 결과를 가져 오는 것이 아니라 인덱스 형태로 존재하는 미리 계산되어 있는 결과를 가지고 처리하므로 성능 향상을 기할 수 있습니다.
--------------------------------------------------------------

SQL> conn / as sysdba
연결되었습니다.

SQL> GRANT QUERY REWRITE TO SCOTT;

권한이 부여되었습니다.

SQL> conn scott/tiger
연결되었습니다.

SQL> create index idx_ename_sal_fnc
  2  on test_emp (emp_name desc, (salary / 10));

인덱스가 생성되었습니다.



함수 기반 인덱스에 대해 온라인 리빌드가 가능 합니다.

SQL> alter index idx_ename_sal_fnc rebuild online;

인덱스가 변경되었습니다.
-- Key Compressed Index 생성, 온라인 rebuild test

SQL> create index idx_salary_compress on test_emp(salary) compress 1;

인덱스가 생성되었습니다.

SQL> alter index idx_salary_compress rebuild online;

인덱스가 변경되었습니다.


이번에는 비트맵 인덱스를 만들고 온라인 rebuil 해 봅니다. 이 경우엔 온라인 rebuild 되지 않습니다.

SQL> create bitmap index idx_emp_name on test_emp(emp_name);

인덱스가 생성되었습니다.

SQL> alter index idx_emp_name rebuild online;
alter index idx_emp_name rebuild online
*
1행에 오류:
ORA-08108: 인덱스 온라인으로 된 유형을 구축하거나 재구축하지 말아야 합니다

'DB' 카테고리의 다른 글

SQL로 들어가서 XML로 나온다  (0) 2006.07.16
[QUERY] COUNT(*)를 빠르게  (0) 2006.07.16
[QUERY] 실행중인(ACTIVE) SQL문 확인  (0) 2006.07.16
[QUERY] Role  (0) 2006.07.16
Oracle의 메모리 구조 – SGA(요약  (0) 2006.07.16
Posted by 알 수 없는 사용자
|