1. CREATE TABLE, ALTER TABLE, DROP TABLE, RENAME



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 테이블 생성
CREATE TABLE MY_TABLE(
       NAME VARCHAR2(10)
     , AGE NUMBER(10)
);
 
-- 생성된 테이블 조회
SELECT * FROM MY_TABLE;
 
-- 테이블에 컬럼 추가
ALTER TABLE MY_TABLE ADD ADDRESS VARCHAR2(10);
 
-- 테이블 컬럼명 수정
ALTER TABLE MY_TABLE RENAME COLUMN ADDRESS TO MY_ADDRESS;
 
-- 테이블 컬럼 삭제
ALTER TABLE MY_TABLE DROP(MY_ADDRESS);
 
-- 테이블 데이터 삽입
INSERT INTO MY_TABLE(NAME,AGE) VALUES('이상현',28);
cs



2. DELETE, TRUNCATE, DROP



1
2
3
4
5
6
7
8
-- DELETE는 이전에 할당되었던 영역은 삭제되어 빈 TABLE이나 CLUSTER에 그대로 남아 있게 된다.
DELETE FROM MY_TABLE;
 
-- TRUNCATE 는 TABLE이나 CLUSTER에서 모든 행을 삭제하는 빠르고 효율적인 방법
TRUNCATE TABLE MY_TABLE;
 
-- TABLE이나 CLUSTERED TABLE에 부여된 권한도 삭제된다.
DROP TABLE MY_TABLE;
cs


3. 데이터 딕셔너리, 데이터 딕셔너리 뷰


데이터 딕셔너리는 스키마,사용자,객체,권한,룰,데이터베이스 정보 등 정보관리하는 별도의 객체를 의미한다.


데이터 딕셔너리는 시스템 정보를 가지고 있기 때문에 보통 데이터딕셔너리 뷰를 통해 조회한다.


데이터 딕셔너리 뷰는 3종류로 나눌수 있다.


ALL : 모든 접근 가능

DBA : DB관리자만 접근 가능

USER : 사용자만 접근 가능


1. ALL 접근



1
2
3
4
5
6
7
8
9
10
11
12
-- ALL 접근
SELECT *
  FROM ALL_OBJECTS
;  
 
SELECT OWNER
     , OBJECT_NAME
     , OBJECT_TYPE
  FROM ALL_OBJECTS
 WHERE OBJECT_TYPE='TABLE'
   AND OWNER = 'SCOTT'
;
cs


출력 결과



2. USER 접근



1
2
3
4
5
6
7
8
9
-- USER 접근
SELECT *
  FROM USER_OBJECTS
;
 
SELECT OBJECT_NAME
     , OBJECT_TYPE
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE='TABLE'
cs


출력 결과




클러스터란 ?


  디스크로부터 데이터를 읽어오는 시간을 줄이기 위해서 조인이나 자주 사용되는 테이블의 데이터를 디스크의 같은 위치에 저장시키는 방법이다.


 

클러스터된 테이블과 클러스터 되지 않은 테이블의 차이


  테이블이 처음 생성될 때 행은 일반적으로 세그먼트의 첫 익스텐트의 첫 블록부터 삽입된다.


  정규 테이블로 저장될 경우 EMP와 DEPT은 서로 다른 세그먼트에 위치하게 됩니다. 이 말은 테이블이 자신들 고유의 블록을 사용한다는 뜻이다.


  즉, EMP 테이블의 행을 저장하는데 사용된 블록은 DEPT 테이블의 데이터를 저장하지 않습니다. 그 반대의 경우도 마찬가지이다.


  테이블 EMP와 DEPT의 클러스터로 저장되면 동일 클러스터 세그먼트를 공유하게 된다. 


  이 세그먼트의 블록은 양 테이블의 행을 모두 저장할 수 있다.


  테이블이 클러스터로 저장되면 클러스터는 물리적 저장 단위가 되고 테이블은 논리적 엔티티 즉, 클러스터의 일부분이 된다.


 

클러스터의 장점


  - 그룹된 컬럼 데이터 행들이 같은 데이터 Block에 저장되기 때문에 디스크 I/O를 줄여 준다.


  - 클러스터된 테이블 사이에 조인이 발생할 경우 그 처리 시간이 단축 된다.


  - 클러스터키 열을 공유하여 한번만 저장하므로 저장 영역의 사용을 줄인다.



테이블 클러스터링의 특징


  클러스터는 데이터 조회 성능을 향상 시키지만 데이터 저장, 수정, 삭제 또는 한 테이블 전체 Scan의 성능을 감소 시킨다.


클러스터 하기 좋은 테이블


- 주로 조회가 자주 발생하고 수정이 거의 발생하지 않는 테이블

- 컬럼안의 많은 중복 데이터를 가지는 테이블

- 자주 Join되는 테이블


클러스터 Key가 되기 좋은 컬럼


- 데이터 값의 범위가 큰 컬럼

- 테이블 간의 조인에 사용되는 컬럼


클러스터 key가 되기 나쁜 컬럼


- 특정 데이터 값이 적은 컬럼

- 자주 데이터 수정이 발생하는 컬럼

- LONG, LONG RAW 컬럼은 포함할 수 없다.


1. SUM, AVG, MAX, MIN, COUNT 그룹함수 사용 WHERE, GROUP BY, HAVING 사용



1
2
3
4
5
6
7
8
9
10
11
SELECT DEPTNO
     , SUM(SAL)
     , AVG(SAL)
     , MAX(SAL)
     , MIN(SAL)
     , COUNT(SAL)
  FROM EMP
 WHERE JOB='MANAGER'
 GROUP BY DEPTNO
 HAVING DEPTNO >= 10
 ORDER BY DEPTNO
cs

출력 결과




2. ROUND 반올림, TRUNC 값짜름



1
2
3
4
5
6
7
8
9
-- ROUND 반올림, TRUNC 짜른값  
SELECT ROUND(45.62,0-- 45
     , ROUND(45.62,1-- 45.6
     , ROUND(45.62,2-- 45.62
     , ROUND(45.62,-1-- 50
     , TRUNC(45.62,0-- 45
     , TRUNC(45.62,1-- 45.6
     , TRUNC(45.62,2-- 45.2
  FROM DUAL
cs


출력 결과



3. 다중행 서브 쿼리( IN / ALL / ANY / SOME / EXISTS )



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--IN : 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 하나라도 일치하면 참, ‘=‘비교만 가능
SELECT *
  FROM EMP
 WHERE SAL IN(8001600-- 
;
 
-- ALL : 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 모든값이 일치하면 참,
SELECT *
  FROM EMP
 WHERE SAL < ALL(20002500-- WHERE SAL < 2000 AND SAL < 2500
;
 
--ANY, SOME : 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 하나라도 일치하면 참, ‘=‘비교만 가능
SELECT *
  FROM EMP
 WHERE SAL < ANY(20002500-- WHERE SAL < 2000 OR SAL < 2500
;
  
SELECT *
  FROM EMP
 WHERE SAL < SOME(20002500-- WHERE SAL < 2000 OR SAL < 2500
;
cs


IN, EXISTS


값이 안에 존재할때 IN

값이 안에 존재할때 EXSITS


두 표현을 사용할 수 있다.


아래 식은 같은 결과 값을


IN과 EXISTS를 각각 따로 사용해 작성한 쿼리이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 --IN
SELECT *
  FROM EMP
 WHERE DEPTNO IN(10,20)
;
 
 --EXISTS
SELECT *
  FROM EMP
 WHERE EXISTS
       (
        SELECT DEPTNO
          FROM DEPT
         WHERE DEPTNO IN(10,20)
       )
;
cs



1. MONTHS_BETWEEN


달수와 달수 사이를 구한다.



1
2
3
4
5
6
7
-- MONTHS_BETWEEN
SELECT MONTHS_BETWEEN
       (
       TO_DATE('2017-07-01','YYYY-MM-DD')
     , TO_DATE('2017-06-01','YYYY-MM-DD')
       ) AS MONTHS_BETWEEN
  FROM DUAL
cs

출력 결과




2. ADD_MONTHS


달수를 더한다.



1
2
3
-- ADD_MONTHS
SELECT ADD_MONTHS(TO_DATE('2017-07-01','YYYY-MM-DD'),1) AS ADD_MONTHS
  FROM DUAL
cs


출력 결과




3. NEXT_DAY


기준날짜에서 요일을 찾아 몇일인지 반환한다.



1
2
3
-- NEXT_DAY
SELECT NEXT_DAY(TO_DATE('2017-06-05','YYYY-MM-DD'),'FRIDAY'
  FROM DUAL
cs


출력 결과




4. LAST_DAY


기준날짜에서 마지막 날을 출력한다.



1
2
3
-- LAST_DAY
SELECT LAST_DAY(TO_DATE('2017-06-01','YYYY-MM-DD'))
  FROM DUAL
cs


출력 결과




5. TO_DATE


DATE 형식으로 출력한다.



1
2
3
4
5
6
7
8
9
10
11
12
-- TO_DATE1
SELECT TO_DATE('2017-06-01','YYYY-MM-DD') MDATE1
     , TO_DATE('2017/06/01','YYYY/MM/DD') MDATE2
     , TO_DATE('20170601','YYYY-MM-DD') MDATE3
     , TO_DATE('20170601','YYYYMMDD') MDATE4
     , TO_DATE('20170601112030','YYYYMMDDHH12MISS') MDATE5
     , TO_DATE('20170601232030','YYYYMMDDHH24MISS') MDATE6
     , TO_DATE('2017-06-01-11-20-30','YYYY-MM-DD-HH12-MI-SS') MDATE7
     , TO_DATE('2017-06-01-23-20-30','YYYY-MM-DD-HH24-MI-SS') MDATE8
     , TO_DATE('2017/06/01/11/20/30','YYYY/MM/DD/HH12/MI/SS') MDATE9
     , TO_DATE('2017/06/01/23/20/30','YYYY/MM/DD/HH24/MI/SS') MDATE10
  FROM DUAL
cs

출력 결과



1
2
3
4
5
6
7
8
9
10
11
12
13
-- TO_DATE2
SELECT TO_DATE(SYSDATE,'YYYY-MM-DD') MDATE1
     , SYSDATE MDATE2
     , TO_CHAR(SYSDATE) MDATE3
     , TO_CHAR(SYSDATE,'YYYY-MM-DD') MDATE4
     , TO_CHAR(SYSDATE,'YYYY/MM/DD') MDATE5
     , TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') MDATE6
     , TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD') MDATE7
     , TO_CHAR(SYSDATE,'YYYY-MM') MDATE8
     , TO_CHAR(SYSDATE,'YYYY/MM') MDATE9
     , TO_CHAR(SYSDATE,'MM') MDATE10
     , TO_CHAR(SYSDATE,'DD') MDATE11
  FROM DUAL
cs


출력 결과




6. DECODE


DECODE(VALUE, IF1, THEN1, IF2, THEN2)


DECODE 함수는 조건에 따라 데이터를 다른 값이나 컬럼값으로 추출 할 수 있다.

DECODE(VALUE, IF1, THEN1, IF2, THEN2...) 형태로 사용 할 수 있다.

VALUE 값이 IF1일 경우에 THEN1 값을 반환하고, VALUE 값이 IF2일 경우에는 THEN2 값을 반환한다.

DECODE 함수 안에 DECODE함수를 중첩으로 사용 할 수 있다.



1
2
3
4
SELECT DEPTNO
     , DECODE(DEPTNO, 10'CLERK',20'MANAGER',30'SALESMAN') AS DECODE
     , DECODE(DEPTNO, 10, SAL)
  FROM EMP;
cs


출력 결과




7. CASE


CASE 

 WHEN 

 THEN 

 ELSE 

END 컬럼명


CASE 함수는 DECODE함수가 제공하지 못하는 비교연산의 단점을 해결할 수 있는 함수이다.

DECODE함수에서 비교연산을 수행하기 위해서는 GREATEST, LEAST등의 함수를 사용해야 하지만, CASE함수에서는 조건 연산자를 모두 사용 할 수 있다.

CASE함수는 IF.. THEN .. ELSE 구문과 비슷 하다. WHEN절 다음에 여러 조건이 올 수 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT JOB
     , CASE
        WHEN JOB='CLERK'
        THEN 'MY_CLERK'
       END JOB1
     , SAL
     , CASE 
        WHEN SAL<1000
        THEN SAL+200
       END SAL1
     , HIREDATE
     , CASE
        WHEN HIREDATE<TO_DATE('1981-03-01','YYYY-MM-DD')
        THEN ADD_MONTHS(HIREDATE,1)
       END HIREDATE1
  FROM EMP
cs


출력 결과




1. DUAL


듀얼 테이블(DUAL table)은 모든 오라클 데이터베이스 설치본에 기본으로 존재하는, 한 열로 이루어진 특별한 테이블이다. 

SYSDATE, USER와 같은 의사컬럼 선택에 사용하는 것이 적절하다. 

이 테이블은 'X' 값을 포함하는 DUMMY(더미)라 불리는 하나의 VARCHAR2(1) 열이 있다.

일반적으로 DUAL TABLE의 Owner는 SYS이지만 모든 사용자가 사용할 수 있다. 그리고 SELECT 문장에서 조회 시 오직 하나의 Row, 하나의 Column에 'X'만 출력된다.


DUAL 예제



1
2
3
4
5
6
7
8
SELECT SYSDATE 
  FROM DUAL;
 
SELECT 10*20 
  FROM DUAL;
 
SELECT * 
  FROM DUAL;
cs


2. 문자처리 함수


 함수

 설명 

 UPPER 

 대문자로 변환시킨다.

 LOWER

 소문자로 변환시킨다. 

 INITCAP

 맨 앞 이니셜만 대문자로 변환시켜준다. 

 LENGTH

 문자열의 길이를 알려준다. 

 INSTR

 특정문자가 출현하는 위치를 알려준다. 

 SUBSTR

 문자의 일부분을 추출한다.

 LPAD

 오른쪽 정렬 후 왼쪽에 생긴 빈 공백에 특정 문자를 채운다. 

 RPAD

 왼쪽 정렬 후 오른쪽에 생긴 빈 공백에 특정 문자를 채운다. 

 LTRIM

 왼쪽에서 특정 문자를 삭제한다. 

 RTRIM

 오른쪽에서 특정 문자를 삭제한다.


문자처리 함수 예제



1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT EMPNO
     , ENAME 
     , LOWER(ENAME) AS LOWER -- 소문자 출력
     , UPPER(LOWER(ENAME)) AS UPPER -- 대문자 출력
     , INITCAP(ENAME) AS INITCAP -- 첫 글자 이니셜만 대문자 출력
     , LENGTH(ENAME) AS LENGTH -- 문자열 길이 출력
     , INSTR(ENAME,'E') AS INSTR -- 문자열 E의 위치 값 출력 
     , SUBSTR(ENAME,1,3) AS SUBSTR -- 문자의 1번째부터 3번째까지 문자열 출력
     , LPAD(ENAME,6,'@') AS LPAD -- 오른쪽정렬 후 왼쪽 6자리까지 @로 채움
     , RPAD(ENAME,6,'@') AS RPAD-- 왼쪽정렬 후 오른쪽 6자리까지 @로 채움
     , LTRIM(ENAME) AS LTRIM -- 인자가 없을경우 공백제거
     , LTRIM(ENAME,'S') AS LTRIM -- 왼쪽에서부터  S로 시작하는 문자 자름
     , RTRIM(ENAME,'H') AS RTRIM -- 오른쪽에서부터 H로 시작하는 문자 자름
  FROM EMP
cs


출력 결과





LIKE/%/ESCAPE/IS NULL/IS NOT NULL/ORDER BY/ASC/DISTINCT


NULL인 컬럼을 추출하는 연산자와 ORDER BY 절을 이용하여 특정 컬럼에 대해 정렬과 DISTINCT/별칭/연결 연산자



1. ESCAPE


ESCAPE는 %(퍼센트)나 _(언더바)가 같이 특수문자를 조건 안에 넣기 위해 사용한다.


만약 LIKE 연산자로 '%SAMPLE', 'SAM%PLE', 'SAMPLE%' 라는 단어를 찾을때 %나 _인 문자를 어떻게 찾을것인가?


SELECT *
  FROM EMP
 WHERE JOB LIKE 'S%'
  
SELECT *
  FROM EMP
 WHERE JOB LIKE '%S'
    
위와 같은 방식으로 찾기 어렵다는 한계 발견하였다.


다음과 같이 ESCAPE를 사용해 해당하는 단어를 추출할수 있다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--테스트 위해 샘플 데이터 INSERT
 
SELECT * FROM DEPT
INSERT INTO DEPT VALUES(50,'MY','NEW_YORK')
INSERT INTO DEPT VALUES(60,'MY2','NEW%YORK')
 
 
--'_' 가 있는 문자 검색 -1
SELECT LOC
  FROM DEPT
 WHERE LOC LIKE '%#_%' ESCAPE '#'
 
 
--'_' 가 있는 문자 검색 -2
SELECT LOC
  FROM DEPT
 WHERE LOC LIKE '%N%@_%' ESCAPE '@' 
 
--'%' 가 있는 문자 검색 -1
     
SELECT LOC
  FROM DEPT
 WHERE LOC LIKE '%@%%' ESCAPE '@'
cs


2. IS NULL / IS NOT NULL


NVL


사용 방법 : NVL(expr, expr1)


NVL 함수는 NULL 값을 다른 값으로 바꿀 때 사용하며, 모든 데이터 타입에 적용이 가능하다.



1
2
3
4
5
6
SELECT EMPNO
     , ENAME
     , JOB
     , NVL(MGR,0) AS MGR --MGR이 없는 경우(NULL)
     , NVL(COMM,0) AS COMM --COMM이 없는 경우(NULL)
  FROM EMP
cs


NVL2


사용 방법 : NVL2(expr, expr1, expr2)


NVL2라는 함수는 NVL함수의 DECODE 함수의 개념을 합쳤다고 생각하면 쉽다.

expr의 값이 NULL이 아닐 경우에는 expr1의 값을 반환 하고, NULL일 경우에는 expr2의 값을 반환 한다.



1
2
3
4
5
6
SELECT EMPNO
     , NVL2(ENAME,ENAME,0) AS ENAME 
     , NVL2(JOB,JOB,0) AS JOB
     , NVL2(MGR,MGR,0) AS MGR
     , NVL2(COMM,COMM,0) AS COMM
  FROM EMP
cs


3. ORDER BY


컬럼 값을 기준으로 정렬할 때 사용한다.



1
2
3
4
5
6
7
SELECT *
  FROM EMP
 ORDER BY SAL -- 오름차순 정렬
  
SELECT *
  FROM EMP
 ORDER BY SAL DESC -- 내림차순 정렬
cs


4. DISTINCT


조회하려는 칼럼의 중복되는 값은 제거 후 보여준다.

DISTINCT 키워드 뒤에 2개 이상의 칼럼을 정의하면 하나의 RECORD로 인식하여 DISTINCT 키워드 이후에 오는 칼럼에 대해 모두 중복 제거한다.



1
2
SELECT DISTINCT JOB
  FROM EMP
cs

출력 결과




ORACLE 에서는 여러 연산자를 사용 할 수 있다. 산술, 비교, 논리, 기타 연산자를 정리해보았다.


1. 산술 연산자


+ - * / 덧셈, 뺄셈, 곱셈, 나눗셈


2. 비교 연산자


= > < >= <= 비교


<> != ^= 같지 않다


3. 논리 연산자



3-1. AND

두 가지 조건을 모두 만족해야만 검색할 수 있다.



1
2
3
4
5
-- AND 
SELECT * 
  FROM EMP
 WHERE JOB = 'SALESMAN' 
   AND SAL >=500
cs



3-2. OR

두 가지 조건중 하나만 만족해도 검색할 수 있다.



1
2
3
4
5
-- OR
SELECT *
  FROM EMP
 WHERE JOB = 'SALESMAN'
    OR JOB = 'MANAGER'
cs



3-3. NOT

조건을 만족하지 않아야 검색할 수 있다.



1
2
3
4
5
-- NOT
SELECT *
  FROM EMP
 WHERE NOT JOB = 'SALESMAN'
   AND NOT JOB = 'MANAGER'
cs


4. 기타 연산자



4-1. BETWEEN 범위를 지정하여 조건을 걸때 사용 한다.



1
2
3
4
-- BETWEEN
SELECT *
  FROM EMP
 WHERE SAL BETWEEN 1000 AND 2000
cs



4-2. IN 범위에 포함되는 것 


1
2
3
4
 -- IN 포함되는 것
SELECT *
  FROM EMP
 WHERE JOB IN('SALESMAN','MANAGER'
cs


1
2
3
4
 -- NOT IN 포함되지 않는 것
SELECT *
  FROM EMP
 WHERE JOB NOT IN('SALESMAN','MANAGER'
cs



4-3. LIKE ~와 같은 조건 사용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
 -- LIKE - 1 시작이 S로 나타날때
SELECT *
  FROM EMP
 WHERE JOB LIKE 'S%'
 
 -- LIKE - 2 끝이 S로 끝날때
SELECT *
  FROM EMP
 WHERE JOB LIKE '%S'
   
 -- LIKE - 3 S가 시작,끝 모두 포함
SELECT *
  FROM EMP
 WHERE JOB LIKE '%S%'
cs



인덱스란?


SQL명령문의 처리속도를 향상시키기 위해 컬럼에 대해서 생성하는 오라클 객체


인덱스 장점 및 왜 사용하는가?


인덱스 사용하면 검색속도 높일수 있음.

검색결과가 늦게 나올 경우 인덱스를 재생성해줘야 함

검색속도가 빨라짐

시스템 부하 줄여 시스템 전체 성능 향상 시킴

색인에서 해당단어(테이블)를 찾아 그 페이지로 이동


인덱스의 단점


인덱스를 생성하는데 시간이 걸림

인덱스를 위한 추가적인 공간이 필요함

데이터 변경 작업(INSERT, UPDATE, DELETE) 자주 일어날 경우 성능저하됨


인덱스의 특징


인덱스는 기본키나 유일키와 같은 제약조건을 지정하면 따로 인덱스를 생성하지 않더라도 자동으로 생성

기본키나 유일키는 데이터 무결성을 확인하기 위해서 수시로 데이터를 검색하기 때문

빠른 조회를 목적으로 오라클에서는 내부적으로 해당컬럼에 인덱스를 자동으로 생성


인덱스를 사용해야 하는 경우


테이블에 행의 수가 많을 때

WHERE문에 해당 컬럼이 많이 사용될 때

JOIN에 자주사용되는 컬럼이나 NULL을 포함하는 컬럼이 많은 경우


인덱스를 사용하지 말아야 하는 경우


테이블에 행의 수가 적을 때

WHERE문에 해당컬럼이 자주 사용되지 않을 때

테이블에 DML작업이 많은 경우


인덱스를 재생성하는 문법


ALTER INDEX EMP REBUILD



인덱스 생성하기 및 제거하기



1. 인덱스 없이 실행하기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- EMP08 에는 INDEX 존재하지 않음, EMP로 부터 제약조건이 복사되지 않기 때문에
CREATE TABLE EMP08 
    AS SELECT * FROM EMP; 
 
SELECT TABLE_NAME
     , INDEX_NAME
     , COLUMN_NAME 
  FROM USER_IND_COLUMNS 
 WHERE TABLE_NAME IN('EMP''EMP08'); 
 
INSERT INTO EMP08 SELECT * FROM EMP08; 
INSERT INTO EMP08 (EMPNO, ENAME) VALUES(1111'MJS'); 
 
-- INDEX 없이 SELECT 실행
SELECT DISTINCT EMPNO
     , ENAME 
  FROM EMP08 WHERE ENAME='MJS'
cs



2. 인덱스 만들어 실행하기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- EMP08에 INDEX 생성
CREATE INDEX IDX_EMP08_ENAME 
    ON EMP08(ENAME); 
    
SELECT TABLE_NAME
     , INDEX_NAME 
  FROM USER_INDEXES 
 WHERE TABLE_NAME IN('EMP08'); 
 
-- INDEX 유 SELECT 실행
SELECT DISTINCT EMPNO
     , ENAME 
  FROM EMP08 
 WHERE ENAME='MJS'
cs



3. 인덱스 제거하기



1
2
3
4
5
6
7
8
-- DROP INDEX 사용
DROP INDEX IDX_EMP08_ENAME; 
 
 -- 인덱스 제거 확인
SELECT TABLE_NAME
     , INDEX_NAME 
  FROM USER_INDEXES 
 WHERE TABLE_NAME IN('EMP08'); 
cs


+ Recent posts