네이버 joypheonix님 블로그에서 퍼옴
---------------------인덱스 확인----------------------------------
SELECT index_name, table_owner, table_name, column_name
FROM dba_ind_columns
WHERE index_owner = 'EDU_USER' and table_name='TCM_WAREHOUSING'
ORDER BY index_name, column_position;
--TCM_WAREHOUSING_PK EDU_USER TCM_WAREHOUSING WHYEARMON
--TCM_WAREHOUSING_PK EDU_USER TCM_WAREHOUSING SEQ
SELECT ic.index_name, ic.column_name,
ic.column_position, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ix.table_name = 'TCM_WAREHOUSING'
--TCM_WAREHOUSING_PK WHYEARMON 1 UNIQUE
--TCM_WAREHOUSING_PK SEQ 2 UNIQUE
1. 기본적으로 primary key나 unique생성시에는 자동적으로
index가 생성된다.
2. index 생성하기
create table it(
no number,
bigo varchar2(30) constraint it_bigo_uk unique
using index(create index i_it_bigo on it(bigo)
tablespace indx));
3. CREATE INDEX idx_emp ON tb_emp (empno);
-->tb_emp 테이블에 empno 컬럼을 이용하여 idx_emp를 생성한다.
3_1. CREATE INDEX idx_emp ON tb_emp (empno desc);
-->tb_emp 테이블에 empno 컬럼을 이용하여 역순으로 정렬하는 idx_emp를 생성한다.
4. 삭제: DROP INDEX 인덱스명
5.
--index의 사용유무 확인하기
1. @C:\oracle\ora92\rdbms\admin\utlxplan.sql
2. @C:\oracle\ora92\sqlplus\admin\plustrce.sql
3. create public synonym plan_table for sys.plan_table;
4. ora602에게 권한을 부여
grant plustrace to ora602;
5. grant select, insert, update, delete on plan_table to ora602;
6. ora602에 접속
7. set autotrace on
8. select 컬럼 실행
9. 사용이 끝난 후엔 set autotrace off
--------------------------------------------------------------------------------
-- 16장 인덱스
--------------------------------------------------------------------------------
-- SQL 명령문의 처리 속도를 향상시키기 위해서 컬럼에 대해 생성하는 오라클객체
--------------------------------------------------------------------------------
-- 인덱스를 사용해야 하는 경우 --
-- 1.테이블에 행의 수가 많을때 --
-- 2.조건절인 WHERE 문에 해당 컬럼이 많이 사용될 때 --
-- 3.검색 결과가 데이터의 2% ~ 4% 정도 일 때 --
-- 4.JOIN에 자주 사용되는 컬럼 --
-- 5.NULL을 포함하는 컬럼이 많은 경우 --
-- --
-- 인덱스를 사용하지 말아야 하는 경우 --
-- 1.테이블에 행의 수가 적을 때 --
-- 2.WHERE 문에 해당 컬럼이 자주 사용되지 않을 때 --
-- 3.검색 결과가 전체 데이터의 10% ~ 15% 이상 높을 때 --
-- 4.테이블에 DML 작업이 많은 경우 --
-- 즉, 입력 수정 삭제 등이 자주 일어 날 때 --
--------------------------------------------------------------------------------
-- 인덱스 생성/제거와 인첵스 정보 조회
CREATE TABLE E2
AS
SELECT *
FROM EMP;
INSERT INTO E2 SELECT * FROM E2;
-- 시간 체크
SQL> SET TIMING ON
SQL> SELECT DISTINCT EMPNO, ENAME FROM E2 WHERE ENAME = 'SCOTT';
EMPNO ENAME
---------- ----------
7788 SCOTT
Elapsed: 00:00:00.80
CREATE INDEX IDX_E2_ENAME
ON E2(ENAME);
-- 인덱스 생성후 시간 체크
SQL> SET TIMING ON
SQL> SELECT DISTINCT EMPNO, ENAME FROM E2 WHERE ENAME = 'SCOTT';
EMPNO ENAME
---------- ----------
7788 SCOTT
Elapsed: 00:00:00.37 -->> 인덱스 속도가 줄었음.
-- 인덱스 생성 유무 확인 데이터 딕셔너리(USER_INDEXES, USER_IND_COLUMNS(컬럼명확인))
SELECT INDEX_NAME, TABLE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME IN('EMP','DEPT','E2');
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME IN('EMP','DEPT','E2');
-- 인덱스 제거
DROP INDEX IDX_E2_ENAME;
-- 인덱스 재생성
SQL> SET TIMING ON
SQL> ALTER INDEX IDX_E2_DEPTNO REBUILD;
-- 인덱스의 종류
-- 1.고유 인덱스(Unique Index) : 유일한 값을 갖는 컬럼에 대해서 생성하는 인덱스
-- 2.비고유 인덱스(NonUnique Index) : 중복된 데이터를 갖는 컬럼에 대해서 생성하는 인덱스
-- 3.단일 인덱스(Single Index) : 한 개의 컬럼으로 구성한 인덱스
-- 4.결합 인덱스(Composite Index) : 두 개 이상의 컬럼으로 구성한 인덱스
-- 5.함수 기반 인덱스(Function Based Index)
CREATE TABLE D2
AS
SELECT *
FROM DEPT;
-- 고유 인덱스
CREATE UNIQUE INDEX IDX_D2_DEPTNO
ON D2(DEPTNO);
-- 비고유 인덱스
CREATE INDEX IDX_D2_LOC
ON D2(LOC);
-- 결합 인덱스
CREATE INDEX IDX_D2_COM
ON D2(DEPTNO, DNAME);
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME ='D2';
-- 함수 기반 인덱스
CREATE TABLE E3
AS
SELECT *
FROM EMP;
CREATE INDEX IDX_E3_ANNSAL
ON E3(SAL*12);
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME ='E3';
------사용법-----------
select /*+ INDEX (A UI_TEMP ) */ --> 테이블명 한칸띄고 인덱스명 (INDEX_desc-->인덱스를 꺼꾸로 탐)
name, se_code, dt
from temp A
where chk = 0 and rownum = 1
'개발 > ORCLE' 카테고리의 다른 글
오라클 Length, LengthB (0) | 2008.10.24 |
---|---|
오라클 UNION & UNION ALL & INTERSECT & MINUS (0) | 2008.10.24 |
오라클 CASE (0) | 2008.10.24 |
오라클 반환형 함수 (0) | 2008.10.23 |
오라클 NVL (0) | 2008.10.23 |