hyeonga_code

Database_55_SQL 데이터베이스 객체 본문

Oracle Database

Database_55_SQL 데이터베이스 객체

hyeonga 2023. 8. 11. 05:59
반응형

-- 데이터베이스 객체
    -- 데이터 베이스 하위 폴더로 표시된 모든 것을 의미합니다.
    -- 스키마_SCHEMA
        -- 데이터베이스의 구조와 제약 조건에 관해 전반적인 명세를 기술한 것
        -- 추상화 작업   
            -- 개념 스키마에서 외부 스키마를 생성하는 과정입니다.
            -- 대량의 데이터 중 원하는 데이터만을 추출하여 간략하게 테이블을 구성합니다.
        -- 기술 요소
            -- Attribute : 개체의 특성
            -- Entity : 속성의 집합
            -- Relation : 개체 사이에 존재하는 관계
            -- Constraint : 제약 조건
        -- 유형   
            -- 개념 스키마 : 전체적인 뷰
                -- 전체를 관리하는 데이터베이스입니다.
                -- 하나의 개념 스키마가 존재합니다.
            -- 외부 스키마 = 서브 스키마
                -- 전체 데이터베이스의 한 논리적 부분입니다.
                -- 다수의 외부 스키마자 존재할 수 있습니다.
                -- 각자 필요한 데이터의 집합을 테이블인 것처럼 사용합니다.
        -- 개념 스키마와 외부 스키마를 별도로 작성하는 이유
            -- 개념 테이블의 변경으로 영향을 받는 외부 스키마가 최소화되도록 하기 위함입니다.
            -- 데이터의 독립성
    -- 유형  
        -- TABLE_테이블
            -- 기본 저장 단위입니다.
            -- 행과 열로 구성됩니다.
        -- VIEW_뷰
            -- 논리적으로 하나 이상의 테이블에 있는 데이터의 부분 집합을 나타냅니다.
        -- SEQUENCE_시퀀스
            -- 숫자 값을 생성합니다.
        -- INDEX_인덱스 *****
            -- 쿼리 성능을 향상시킵니다.
        -- SYNONUM_동의어
            -- 객체에 다른 이름을 제공합니다.

    /*
    -- 디스크에는 하나의 파일 안에 여러 테이블, 데이터가 혼합되어 저장됩니다.
    -- 파일을 블록으로 분할하여 블록 안에 데이터를 저장합니다.
    -- 저장하는 순서로 저장하는 구조이므로 같은 테이블의 데이터라도 연속적으로 저장되지 않습니다.
    -- 출력의 형태는 연속적으로 출력됩니다.
    -- 데이터를 조회하기 위해 모든 데이터를 검색해야 합니다.
    -- 인덱스를 사용하여 행의 위치를 찾기 쉽게 하는 용도입니다.
    */
    -- FULL TABLE SCAN
        --  테이블에 존재하는 모든 데이터를 읽어 조건에 맞는 데이터를 추출합니다.
    -- INDEX SCAN
        -- 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출합니다.
    
    
/*
    -- ROOT 에 1001부터 5000까지 저장되어 있습니다.
    -- BRANCH 에 500 단위로 분할 저장되어 있습니다.
    -- LEAF 에 100 단위로 분할 저장되어 있습니다.
    
    -- 3981 번을 찾을 경우
        -- ROOT 에서 3000번 대를 찾습니다.
        -- BRANCH 에서 3501부터 4000번이 저장된 위치를 찾습니다.
        -- LEAF 에서 3900번대에 가서 3981번을 찾습니다.
    -- 인덱스는 적은 데이터가 아닌 대량의 데이터에서 효과를 볼 수 있습니다.
    -- 옵티마이징 : 최적화, SQL문을 가장 빠르고 효율적으로 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진을 의미합니다.
*/

    -- 인덱스
        -- 쿼리 성능을 향상시킵니다.
        -- 스키마 객체입니다.
            -- ownership이 생성됩니다.
        -- Oracle Server에서 포인터를 사용하여 행 검색 속도를 높이기 위해 사용합니다.
        -- BTREE 검색 : 데이터 위치를 빠르게 찾는 신속한 경로 엑세스 방법을 사용하여 디스크 I/O를 줄여줍니다.
        -- 인덱스화된 테이블과 독립되어 존재합니다.
        -- Oracle Server에 의해 자동으로 유지 관리되며 사용됩니다.
        -- ENTITY_개체/항목
            -- 테이블에서의 열을 나타냅니다.
            -- 인덱스 키 값과 ROWID로 구성됩니다.
            -- 테이블과 별개로 저장됩니다.
            -- ROWID
                -- 행의 주소를 나타냅니다.
                -- Oracle 에서 ROWID를 사용하여 인덱스 등에 테이블 행의 주소를 저장합니다.
                -- 테이블마다 ROWID 의사_PSEUDO 열이 있습니다.  
        -- 테이블 하나에 인덱스가 여러 개가 존재할 수 있습니다.
        -- 인덱스가 생성되는 경우
            -- 자동 생성
                -- 테이블 정의에 primary key / unique 제약 조건을 정의하는 경우
            -- 수동 생성
                -- 사용자가 열에 인덱스를 생성하여 행에 대한 엑세스 시간을 줄일 수 있습니다.
        -- 유형
            -- UNIQUE / NON UNIQUE
            -- 조합 인덱스
        -- 인덱스 저장 기법
            -- B* TREE
            -- 역방향 키 : 인덱스 키 값을 역으로 지정하여 인덱스 번호로 지정됩니다.
                -- 데이터가 한쪽으로 집중되는 것을 방지하기 위함입니다.
                -- 응용프로그램에서 사용하는 연산자에 따라 결정됩니다.
                    -- '=' 연산자만 사용하는 경우 유용합니다.
                    -- 비교 연산자를 자주 사용하는 경우 비효율적입니다.
            -- 내림차순
            -- 함수 기반
                -- 표현식을 기반으로 하는 인덱스입니다.
                -- 테이블, 열, 상수, SQL 함수 및 사용자가 정의한 함수로부터 생성됩니다.
/*
    -- 인사관리 데이터베이스 하위 개체에 인덱스에 제약조건으로 인해 자동으로 생성된 인덱스가 존재합니다.
    -- 자동으로 생성된 인덱스는 DROP 명령문으로 삭제할 수 없습니다.
    -- 자동으로 생성된 인덱스는 PRIMARY KEY/ UNIQUE KEY를 비활성화/삭제하는 경우 자동으로 삭제됩니다.
*/
        -- 인덱스 생성이 필요한 경우
            -- 열에 광범위한 값이 포함된 경우
            -- 열에 널 값이 많이 포함된 경우
            -- WHERE 절 또는 조인 조건에서 하나 이상의 열이 함께 자주 사용되는 경우
            -- 큰 테이블에서 대부분의 질의에 의해 검색되는 행이 2-4% 미만인경우
        -- 인덱스를 생성하면 안되는 경우
            -- 테이블이 작은 경우
            -- 열이 질의의 조건으로 자주 사용되지 않는 경우
            -- 대부분의 질의가 테이블에 있는 행의 2-4% 이상을 검색하는 경우
            -- 테이블이 자주 갱신되는 경우
    -- 조합 인덱스
        -- 생성
            /*
            CREATE INDEX index_name
            ON table( column1, column2, column3);
                -- column1 : 인덱스로 많이 사용되는 컬럼으로 작성합니다.
            */
        -- 사용 : WHERE 절에 AND로 작성합니다.
        -- 두 개 이상의 열을 합쳐 인덱스를 만드는 인덱스입니다.
        -- 결합 인덱스
        -- 고려사항
            -- WHERE 절에서 AND 조건으로 자주 결합되어 사용됩니다.
            -- 각각의 분포도보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼
            -- 다른 테이블과 조인의 연결 고리로 자주 사용되는 컬럼들
            -- 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회되는 경우
        -- 지침
            -- 가장 자주 질의되는 열을 맨 앞에 작성합니다.
            -- 전체 키를 지정하려면 가장 자주 질의되는 열을 맨 앞에 작성합니다.
            -- 기본 테이블에 엑세스 하지 않고 질의 결과를 검색할 수 있도록 여분의 열을 인덱스에 추가합니다.
            -- 저장 영역을 줄이기 위해 COMPRESS 옵션을 사용하여 반복되는 키 열 값을 제거할 수 있습니다.
        -- WHERE 절의 조건문에서 첫 번째 열이 조건식에 없는 경우 사용하지 않습니다.
        -- 인덱스 생성 시 고려사항
            -- 인덱스 생성 시 DML 작업이 인덱스에 주는 영향을 고려해야 합니다.
            -- Oracle 서버는 인덱스를 유지 관리해야 하므로 많은 인덱스로 인해 DML 문의 처리 속도가 느려집니다.
                -- 삽입으로 인해 적절한 블록에 인덱스 항목이 삽입됩니다.
                    -- 블록이 분할될 수 있습니다.
                -- 삭제로 인해 인덱스 항목이 논리적으로 삭제됩니다.
                    -- 빈 블록은 사용할 수 있습니다.
                -- 키 열을 갯인하면 인덱스에 논리적인 삭제, 삽입이 발생합니다.
            -- 질의 속도를 높이기 위해 최적기에서 사용할 것이 확실한 인덱스만 생성합니다.
        -- 사용하지 않는 인덱스 식별
            /*
            ALTER INDEX index_name [ MONITORING | NOMONITORING ] USAGE;
            */
            -- Oracle은 인덱스 사용 통계를 수집하는 기능을 제공합니다.
            -- 인덱스 모니터링의 이점
                -- 사용되지 않는 인덱스를 삭제하여 공간을 관리합니다.
                -- DML 작업 중 불필요한 오버헤드 제거를 통해 성능을 향상시킵니다.
            /*
            V$OBJECT_USAGE
                -- 한 번이라도 사용된 인덱스는 YES로 표시됩니다.
                -- 사용되지 않은 경우 필요하지 않은 인덱스입니다.
            */
    -- 데이터 딕셔너리에서 인덱스 확인
        -- USER_INDEXES 데이터 딕셔너리 뷰는 인덱스 이름 및 고유성을 포함합니다.
            /*
            SELECT index_name, table_name, uniqueness FROM user_indexes
            WHERE table_name= table;
            */
    -- 인덱스 제거   
        /*
        DROP INDEX index;
        */
        -- 테이블을 삭제하는 경우 인덱스도 자동으로 삭제됩니다.
        -- 테이블을 복구하는 경우 인덱스도 자동으로 복구됩니다.
        
-- 제약 조건 확인
SELECT c.table_name, cc.column_name, c.constraint_name, c.constraint_type, c.search_condition, c.status
FROM user_constraints c JOIN user_cons_columns cc
ON (c.constraint_name = cc.constraint_name)
WHERE c.table_name IN ('EMP', 'DEPT');
    /*
    T_NAME  COL_NAME         CON_NAME             CON_TYPE   SEARCH_CONDITION 
    -------------------------------------------------------------------------------------------------------------------------------
    DEPT       DEPTNAME        SYS_C007541                 C            "DEPTNAME"" IS NOT NULL                  
    DEPT       CREATE_DATE   DEPT_CREDATE_NN     C            "CREATE_DATE"" IS NOT NULL               
    DEPT       DEPTNO              SYS_C007554                 P             ( null )                                              
    DEPT       DEPTNAME         SYS_C007544                U             ( null )                                              
    DEPT       LOC                      DEPT_LOC_UK               U             ( null )                                                         
    EMP         EMP_NAME         SYS_C007546                 C            "EMP_NAME" IS NOT NULL                            
    EMP         EMAIL                  SYS_C007547                 C            "EMAIL"" IS NOT NULL    
         
    EMP         SALARY              SYS_C007548                 C            "SALARY"" IS NOT NULL               
    EMP         SALARY               EMP_SAL_CK                 C             salary BETWEEN 2500 AND 30000   
    EMP         EMPID                 SYS_C007553                  P             ( null )                                        
    EMP         DEPTNO              EMP_DEPTNO_FK          R             ( null )                                      
    */


    
    
-- 자동 생성된 인덱스 확인
SELECT table_name, index_name
FROM user_indexes
WHERE table_name IN ('EMP', 'DEPT');
    /*
    TABLE_NAME   INDEX_NAME
    --------------------------------------
    DEPT                DEPT_LOC_UK
    DEPT                SYS_C007544
    DEPT                SYS_C007554

    EMP                  SYS_C007553
    */



-- DEPT의 DEPTNAME 인덱스를 삭제합니다.
DROP INDEX SYS_C007544;
    /*
        <오류>---------------------------------------------------------------------------------
        오류 보고 -
        ORA-02429: cannot drop index used for enforcement of unique/primary key
        02429. 00000 -  "cannot drop index used for enforcement of unique/primary key"
        *Cause:    user attempted to drop an index that is being used as the
                   enforcement mechanism for unique or primary key.
        *Action:   drop the constraint instead of the index.
        -----------------------------------------------------------------------------------------
    */

-- EMP 테이블의 empid를 확인합니다. : SYS_C007553
-- empid 제약 조건을 비활성화합니다.
ALTER TABLE emp DISABLE PRIMARY KEY;
    /*
    Table EMP이(가) 변경되었습니다.
    */

-- 제약 조건 확인
SELECT c.table_name, cc.column_name, c.constraint_name, c.constraint_type, c.status
FROM user_constraints c JOIN user_cons_columns cc
ON (c.constraint_name = cc.constraint_name)
WHERE c.table_name IN ('EMP', 'DEPT');
    /*
    T_NAME  COL_NAME         CON_NAME             CON_TYPE   STATUS
    -----------------------------------------------------------------------------------------------
    DEPT       DEPTNAME        SYS_C007541                 C           ENABLED    
    DEPT       CREATE_DATE   DEPT_CREDATE_NN     C          ENABLED     
    DEPT       DEPTNO              SYS_C007554                 P          ENABLED   
    DEPT       DEPTNAME         SYS_C007544                U          ENABLED 
    DEPT       LOC                      DEPT_LOC_UK               U          ENABLED 
    EMP         EMP_NAME         SYS_C007546                 C          ENABLED  

    EMP         EMAIL                  SYS_C007547                 C          ENABLED  
    EMP         SALARY               SYS_C007369                 C          ENABLED   
    EMP         SALARY               EMP_SAL_CK                 C          ENABLED   
    EMP         EMPID                 SYS_C007553                  P          DISABLED   
    EMP         DEPTNO              EMP_DEPTNO_FK          R          ENABLED  
    */


    
-- 자동 생성된 인덱스 확인
SELECT table_name, index_name
FROM user_indexes
WHERE table_name IN ('EMP', 'DEPT');
    /*
    TABLE_NAME    INDEX_NAME
    ------------------------------------------
    DEPT                DEPT_LOC_UK
    DEPT                SYS_C007544
    DEPT                SYS_C007554

    */


    
-- 다시 활성화합니다.
ALTER TABLE emp ENABLE PRIMARY KEY;
    /*
    Table EMP이(가) 변경되었습니다.
    */
    
-- 자동 생성된 인덱스 확인
SELECT table_name, index_name
FROM user_indexes
WHERE table_name IN ('EMP', 'DEPT');
    /*
    TABLE_NAME    INDEX_NAME
    ------------------------------------------
    DEPT                DEPT_LOC_UK
    DEPT                SYS_C007544
    DEPT                SYS_C007554
    EMP                  SYS_C007553


    */

-- 기본키를 삭제합니다.
ALTER TABLE emp DROP PRIMARY KEY;
    /*
    Table EMP이(가) 변경되었습니다.
    */

-- 자동 생성된 인덱스 확인
SELECT table_name, index_name
FROM user_indexes
WHERE table_name IN ('EMP', 'DEPT');
    /*
    TABLE_NAME    INDEX_NAME
    ------------------------------------------
    DEPT                DEPT_LOC_UK
    DEPT                SYS_C007544
    DEPT                SYS_C007554

    */



-- 새로운 기본키를 추가합니다.
ALTER TABLE emp ADD PRIMARY KEY(empid);
    /*
    Table EMP이(가) 변경되었습니다.
    */

-- 자동 생성된 인덱스 확인
SELECT table_name, index_name
FROM user_indexes
WHERE table_name IN ('EMP', 'DEPT');
    /*
    TABLE_NAME    INDEX_NAME
    ------------------------------------------
    DEPT                DEPT_LOC_UK
    DEPT                SYS_C007544
    DEPT                SYS_C007554

    EMP                  SYS_C007557
        -- 새로 생성한 기본키에 대해 인덱스가 자동으로 생성되었습니다.
    */ 

-- 기존의 테이블을 삭제합니다.
DROP TABLE emp PURGE;
    /*
    Table EMP이(가) 삭제되었습니다.
    */

-- 기존의 테이블을 삭제합니다.
DROP TABLE dept PURGE;
    /*
    Table DEPT이(가) 삭제되었습니다.
    */

-- EMP 테이블 생성
CREATE TABLE emp
AS
SELECT * FROM employees;
    /*
    Table EMP이(가) 생성되었습니다.
    */
   

-- EMP 테이블과 연관된 데이터가 없음을 확인합니다. 
SELECT index_name
FROM user_indexes
WHERE table_name='EMP';
    /*
        -- 아무 것도 출력되지 않습니다.
    */


    
-- [F10] : 계획설명
    
-- 테이블 전체를 조회합니다.
SELECT last_name, email, hire_date
FROM emp;


    
-- 특정 데이터를 조회합니다.
SELECT last_name, email, hire_date
FROM emp
WHERE employee_id=101;
    /*
    LAST_NAME         EMAIL           HIRE_DATE       
    -------------------------------------------------
    Kochhar             NKOCHHAR     04/09/21
    */


    
-- 인덱스를 생성합니다.
CREATE INDEX emp_emp_id_ix ON emp(employee_id);
    /*
    Index EMP_EMP_ID_IX이(가) 생성되었습니다.
    */

-- 인덱스를 사용하는 경우에만 발생합니다.
SELECT last_name, email, hire_date
FROM emp
WHERE last_name='King';


SELECT employee_id, last_name
FROM emp
WHERE employee_id=100
AND last_name='King';
    /*
    EMPLOYEE_ID     LAST_NAME
    ----------------------------------
    100                  King
    */



SELECT employee_id, last_name
FROM emp
WHERE last_name='King'
AND employee_id=100;




-- bigemp 테이블 생성
    /*
    DROP TABLE bigemp purge
    /
    CREATE TABLE bigemp AS SELECT * FROM empl_demo
    /
    ALTER TABLE bigemp MODIFY (employee_id NUMBER)
    /
    DECLARE
    n NUMBER;
    BEGIN
    FOR n IN 1..12
    LOOP
    INSERT INTO bigemp SELECT * FROM bigemp;
    END LOOP;
    COMMIT;
    END; 
    /
    SELECT MIN(employee_id), MAX(employee_id), COUNT(*) FROM bigemp
    /
    
    
    MIN(EMPLOYEE_ID)    MAX(EMPLOYEE_ID)   COUNT(*)
    ----------------            ----------------       ----------
                 100                   206                 438272
    */


-- bigemp 테이블 데이터 순차 수정
    /*
    SELECT MIN(employee_id), MAX(employee_id), COUNT(*) FROM bigemp
    /
    UPDATE bigemp
    SET employee_id = rownum
    /
    COMMIT
    /
    SELECT MIN(employee_id), MAX(employee_id), COUNT(*) FROM bigemp
    /
    
    MIN(EMPLOYEE_ID) MAX(EMPLOYEE_ID)   COUNT(*)
    ----------------       ----------------         ----------
                   1            438272                 438272
    */

-- 인덱스가 있는지 확인합니다.
SELECT index_name
FROM user_indexes
WHERE table_name='BIGEMP';
    /*
        -- 데이터가 없습니다.
    */



-- 모든 데이터를 읽어옵니다.
SELECT * 
FROM bigemp;

-- 인덱스를 생성합니다.
CREATE INDEX bigemp_empid_ix ON bigemp(employee_id);
    /*
    Index BIGEMP_EMPID_IX이(가) 생성되었습니다.
    */

-- 인덱스가 있는지 확인합니다.
SELECT index_name
FROM user_indexes
WHERE table_name='BIGEMP';
    /*
    INDEX_NAME
    ---------------
    BIGEMP_EMPID_IX
    */


    
    
-- 자주 사용하는 데이터에 관해 인덱스를 사용하는 경우 계획 설명에서 확인할 수 있습니다.
    -- COST가 줄어듭니다.
    -- 실제 운영중인 대량 데이터 처리에서 성능차이가 많이 날 수 있습니다.
    
-- 인덱스 정보를 확인합니다.
DESC user_indexes;    
    -- UNIQUENESS 인덱스가 있습니다.
    
-- UNIQUENESS 정보 확인합니다.
SELECT index_name, uniqueness
FROM user_indexes
WHERE table_name='BIGEMP';
    /*
    INDEX_NAME           UNIQUENESS
    ----------------------------------------
    BIGEMP_EMPID_IX     NONUNIQUE
        -- 따로 지정하지 않는 경우 자동으로 NONUNIQUE로 설정됩니다.
    */



SELECT *
FROM emp
WHERE salary>15000;
    -- 인덱스를 사용하지 않고 FULL SCAN으로 작업합니다.



    -- 계획 설명에 변화가 없습니다.
-- 연봉 관련 인덱스를 생성합니다.
CREATE INDEX emp_sal_ix ON emp(salary);
    /*
    Index EMP_SAL_IX이(가) 생성되었습니다.
    */


    
-- 생성한 인덱스를 사용하는지 확인합니다.
SELECT *
FROM emp
WHERE salary>15000;    
    -- 계획 설명에서 EMP_SAL_IX를 사용하여 RANGE SCAN하는 것을 볼 수 있습니다.


    
-- 함수를 사용하여 인덱스를 사용하는 지 확인합니다.
SELECT *
FROM emp
WHERE salary*12>150000;
    -- 계획 설명에서 인덱스를 사용하지 않고 FULL TIME으로 실행합니다.



-- salary*12에 대한 함수 기반 인덱스를 생성합니다.
CREATE INDEX emp_annal_ix ON emp(salary*12);
    /*
    Index EMP_ANNAL_IX이(가) 생성되었습니다.
    */
    
-- 함수 기반 인덱스를 사용하는지 확인합니다.
SELECT *
FROM emp 
WHERE salary*12 > 150000;
    -- 인덱스 기반으로 RANGE SCAN 으로 함수 기반 인덱스를 사용합니다.



-- 조합 인덱스
CREATE INDEX emp_id_name_dept_ix
ON emp(employee_id, last_name, department_id);
    /*
    Index EMP_ID_NAME_DEPT_IX이(가) 생성되었습니다.
    */

    --인덱스 사용 여부 체크
-- 아이디만 검색하는 경우 
SELECT * FROM emp
WHERE employee_id=101;
    -- 인덱스를 사용합니다.



-- 아이디와 성을 검색하는 경우
SELECT * FROM emp
WHERE employee_id=100
AND last_name='King';
    -- 인덱스를 사용합니다.


    
-- 아이디, 성, 부서 번호를 검색하는 경우
SELECT * FROM emp
WHERE employee_id=100
AND last_name='King'
AND department_id=90;
    -- 인덱스를 사용합니다.



-- 첫 번째로 작성한 아이디를 제외하고 검색하는 경우
SELECT * FROM emp
WHERE last_name='King'
AND department_id=90;   
    -- 인덱스를 사용하지 않습니다.



-- 인덱스에 포함된 데이터만 검색하는 경우
SELECT employee_id, department_id FROM emp
WHERE employee_id=100
AND last_name='King'
AND department_id=90;
    -- 테이블을 스캔하지 않고 인덱스만 사용합니다.
    -- 성능이 보다 좋아집니다.



-- 인덱스를 확인합니다.
DESC user_ind_columns
SELECT index_name, column_name, column_position
FROM user_ind_columns
WHERE table_name='EMP';
    /*
        INDEX_NAME                      COLUMN_NAME     COLUMN_POSITION        
        ---------------------------------------------------------------------------------------------
        EMP_EMP_ID_IX                 EMPLOYEE_ID                 1
        EMP_SAL_IX                        SALARY                            1
        EMP_ANNAL_IX                   SYS_NC00012$                1
        EMP_ID_NAME_DEPT_IX   EMPLOYEE_ID                 1
        EMP_ID_NAME_DEPT_IX   LAST_NAME                     2
        EMP_ID_NAME_DEPT_IX   DEPARTMENT_ID            3
            -- COLUMN_POSITION : 누가 조합 인덱스인지 알 수 있습니다.
    */



-- 인덱스 제거
DROP INDEX emp_sal_ix;
    /*
    Index EMP_SAL_IX이(가) 삭제되었습니다.
    */

-- 인덱스를 확인합니다.
DESC user_ind_columns
SELECT index_name, column_name, column_position
FROM user_ind_columns
WHERE table_name='EMP';
    /*
        INDEX_NAME                      COLUMN_NAME     COLUMN_POSITION        
        ---------------------------------------------------------------------------------------------
        EMP_EMP_ID_IX                 EMPLOYEE_ID                 1
        EMP_ANNAL_IX                   SYS_NC00012$                1
        EMP_ID_NAME_DEPT_IX   EMPLOYEE_ID                 1
        EMP_ID_NAME_DEPT_IX   LAST_NAME                     2
        EMP_ID_NAME_DEPT_IX   DEPARTMENT_ID            3
    */



-- 테이블을 확인합니다. 
SELECT * FROM emp;

-- 테이블 삭제
DROP TABLE emp;
    /*
    Table EMP이(가) 삭제되었습니다.
    */

-- 인덱스를 확인합니다.
SELECT index_name, column_name, column_position
FROM user_ind_columns
WHERE table_name='EMP';
    /*
        INDEX_NAME     COLUMN_NAME     COLUMN_POSITION        
        ------------------------------------------------------------------------------

            -- 테이블과 같이 삭제되었습니다.
    */



-- 휴지통을 확인합니다.
SHOW RECYCLEBIN;
/*
ORIGINAL NAME                  RECYCLEBIN NAME                           OBJECT TYPE     DROP TIME           
----------------------------------------------------------------------------------------------------------------------------------------------
EMP_EMP_ID_IX                BIN$uPO9JWBlSdCpYsi7yoGevw==$0      INDEX      2023-08-09:18:50:49 
EMP_ANNAL_IX                 BIN$NaVffKYwQ8e30sha05WYDg==$0      INDEX      2023-08-09:18:50:49 
EMP_ID_NAME_DEPT_IX  BIN$DsrHJzkFTxS6sJl2TNOOaw==$0       INDEX      2023-08-09:18:50:49 
EMP                                    BIN$/ OzfjNBXTyS2Zqi5IXT8fA==$0           TABLE      2023-08-09:18:50:49 
    -- 인덱스도 같이 휴지통에 버려집니다.
*/

-- 테이블을 복구합니다.
FLASHBACK TABLE emp TO BEFORE DROP;
    /*
    Flashback을(를) 성공했습니다.
    */

-- 휴지통을 확인합니다.
SHOW RECYCLEBIN;
    -- 데이터가 존재하지 않습니다.


-- 실습이 끝났으므로 테이블을 영구 삭제합니다.
DROP TABLE emp PURGE;



반응형