오라클 INDEX

개발/ORCLE 2008. 10. 24. 10:07

네이버 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.

* 인덱스가 무시되는 경우
인덱스의 유무를 탐지할 수 있는 단순 열에 대해 적용되어야만 인덱스의 장점이 활용된다. 즉 substr이나 || 와 같은 함수에 의해 변형되어 있다면 오라클은 인덱스를 사용하지 않는다. 그러나 min과 max도 열 자체와 함께 사용된다면 인덱스의 장점을 활용할 수 있다. 또한 클러스터 인덱스를 제외하고는 null인 열은 인덱스 상에 나타나지 않는다. 하나 이상의 열에 대해 지정된 인덱스는 전체 열 중에 어느 하나라도 null이 아니면 엔트리를 가진다. 모든 열이 null이면 인덱스에 이와 관련된 엔트리는 생기지 않는다.
--> where ~~ is null 등과 같은 sql문에는 적합하지 않다.
--> 컬럼에 null값이 들어가있는 컬럼은 인덱스로 사용하기 불가능 하다???
 
 
 

 

 --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
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

오라클 CASE

개발/ORCLE 2008. 10. 24. 08:22
SELECT
(CASE COLUMVALUE
WHEN 'A'
THEN '1'
WHEN 'B'
THEN '2'
END)
FROM TEST

DECODE랑 거의 같은역할을 하고 있다고 보면됩니다.
이 CASE문을 DECODE로 바꾼다면..

DECODE(COLUMVALUE, 'A','1', 'B', '2')

'개발 > ORCLE' 카테고리의 다른 글

오라클 UNION & UNION ALL & INTERSECT & MINUS  (0) 2008.10.24
오라클 INDEX  (0) 2008.10.24
오라클 반환형 함수  (0) 2008.10.23
오라클 NVL  (0) 2008.10.23
오라클 DECODE  (0) 2008.10.23
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,

위에 숭어는 작은편에 속했습니다.
밑에 사진과 같이 엄청난 손맛을 느끼실수있어요
좌대 낚시 일인당 3만원이고
낚시대랑 미끼 빌려주구 회도 떠주시고~
새우사가신다면 우럭도 낚으실수있어요 ㅎㅎ
블로그 이미지

쭈니후니

개발자로서 공부와 낚시를 좋아하는 한사람으로서의 추억을 담을 블로그입니다.

,