ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 오라클 - 객체 종류
    DataBase/Oracle 2023. 8. 31. 16:57

     - 오라클 데이터 베이스는 데이터 보관 및 관리를 위한 여러 기능 과 저장 공간을 객체를 통해 제공함

     - 테이블은 SQL문과 더불어 오라클에서 가장 많이 사용하는 객체 중 하나 

     - 테이블 외 데이터 사전, 인덱스, 뷰, 시퀀스, 동의어 등 사용빈도가 높은 객체를 살펴보자 

     

    1. 데이터 사전 (테이블 객체)

     

     - 오라클에서 테이블사용자 테이블데이터 사전으로 나뉜다.

     - 데이터 사전은 데이터베이스를 구성하고 운영하는 데 필요한 모든 정보를 저장하는 특수 테이블 

       데이터베이스가 생성되는 시점에 자동으로 만들어 진다.

     - 데이터 사전에는 메모리,성능,사용자,권한,객체 등 운영에 중요한 데이터가 보관되어 있다.

     - 데이터 사전 뷰를 통해 정보를 열람해 보자 

     

     * 열람할 수 있는 데이터 사전 보기 

    SELECT * FROM DICT;

     

     > USER_XXXX : 현재 데이터 베이스에 접속한 사용자가 소유한 객체 정보 

    SELECT * FROM USER_TABLES;

     

    > ALL_XXXX : 현재 접속한 사용자 소유 + 사용 허가 받은 객체 

    SELECT * FROM ALL_TABLES;

     

    >DBA_XXX: SYS,SYSTEM 권한을 가진 사용자만 열람가능

    > V$_XXXX: 데이터 성능 관련 정보

     

     

    2. 인덱스 

     

     - DB에서 검색 성능 향상 시키기 위해 테이블 열에 사용하는 객체 

     - 테이블에 보관된 특정 행 데이터 주소, 위치 정보를 목록으로 만들어 놓은 것 

     - 인덱스는 테이블의 여러 열을 여러 분석을 통해 선정하여 설정 가능하다.

     - 인덱스 사용 여부에 따라 검색 방식을 TABLE FULL SCAN, INDEX SCAN으로 구분합니다.

     - 인덱스도 객체이므로 소유 사용자와 사용 권한이 존재합니다. 

     - 인덱스 정보는 USER_INDEXS, USER_IND_COLUMNS의 사전을 사용하여 보자 

     

    * 기본키와 고유키는 인덱스가 자동 생성

     

    -----------------------인덱스 강의 자료 --------------------------------- (195p)

    데이터의 빠른 검색을 위해 사용하는 색인 기술 (인덱스)

    - B-tree자료 구조 이용하여 검색 속도 향상

    - B-tree(Balanced Tree)란 이진트리의 변형된 알고리즘으로, 데이터를 빠르게 찾을 수 있도록 

      트리구조에 정렬한 상태로 보관하는 방식

     

    -인덱스를 생성하는 순간 데이터가 정렬되고, 인덱스가 생성됨 

     ex (age [30,20,10,50,40] -> index -> age[정렬] 10(3),20(2),30(1),40(5),50(4)

      위와 같이 값과 인덱스 저장해서 조회시에  정렬된 age를 기반으로 빠르게 값을 찾아서 리턴

      이때 기존 age테이블에 새로운 데이터가 추가되거나, 삭제되거나 변경이 발생할 때 다시 정렬하는 과정이 필요하므로, 속  도가 느려지는 단점이 있다. 

     

    - 인덱스 생성 

    CREATE INDEX 인덱스명 ON 테이블명 (컬럼);

    - 인덱스 실행 전 실행 계획 출력 

    EXPLAIN PLAN FOR select * FROM emp WHERE ENAME = 'SMITH';
    SELECT * FROM TABLE(dbms_xplan.display);
    //각각 실행

      > 실행결과 TABLE ACCESS FULL / EMP/COST(3) -> 인덱스가 없기 때문에  테이블을 모두 SCAN해서 찾는다.

     

    - 인덱스 생성 후 실행 계획 출력

    CREATE INDEX empindex ON emp (ename);
    
    EXPLAIN PLAN FOR SELECT * FROM EMP WHERE ENAME ='SMITH';
    SELECT * FROM TABLE(dbms_xplan.display);

     > 인덱스 생성후 실행하면, INDEX RANGE SCAN / EMPINDEX 으로 변경되고 COST 1로 바뀌어 있다!

      

    **인덱스를 사용해야할 컬럼은?

      -> WHERE 조건에서 자주 사용되는 컬럼, 조인 시 조건에 사용되는 컬럼

      -> WHERE절에 두 개 이상의 컬럼이 포함되는 조건인 경우 복합 인덱스 화 (ename, job)

      -> 복합 인덱스인 경우 조회 조건에 모든 컬럼이 동시에 사용되도록 지정 ( > WHERE절에 동시에 ename과 job을 사용해야 인덱스 적용됨)

      -> 주로 숫자, 날짜, char 타입에 적용한다. ( 가번문자열은 미적용 가능성이 높음) 

        

     

     ** 주의 사항 

     -> PRIMARY KEY, UNIQUE KEY 제약조건에서는 인덱스 자동 생성

     -> 해당 칼럼을 가공하기 전 상태에서 조건 지정 

     -> 인덱스 여부까지 데이터 모델링 시 고려할 필요가 있다.

     -> LIKE 연산은 인덱스 미적용 가능성이 높다 (% 앞뒤로 포함된 경우)  

     

    - 인덱스 스캔범위 비교 (217p) 

     > 복합인덱스를 사용한다고 하더라도, WHERE 절 범위 지정 순서에 따라 인덱스 스캔범위 차이 있을 수 있다.

     

    - 인덱스 설계 전략 (218p) 

     

    -인덱스 외에 DB성능을 높이는 다른 방법 간단하게 살펴보기 

     > 정규화와 반정규화

        원래 테이블의 중복데이터 제거 등등을 위해 테이블 분리 -> 정규화

        데이터 조회시 조인등에 의한 성능 저하를 막기 위해 분리된 테이블을 다시 합침 -> 반정규화

     > 통계용 테이블 생성

    --------------------------------------------------------------------------------------------------------------------------------------------------------

     

    2.1 인덱스 생성 

     

    CREATE INDEX 인덱스 명 
    ON 테이블 이름 (열 이름1 ASC or DESC,
                   열 이름2 ASC or DESC...)

     - CREATE문을 사용하여 index를 만들 수 있습니다. (정렬 순서도 정할 수도 있다 - 기본 오름차순) 

     - 인덱스가 걸린 SAL열을 WHERE의 검색 조건으로하여 EMP 테이블을 조회하면 출력 속도가 빨라질 것으로 예상

     - 인덱스를 설정하는 것은 데이터 구조 및 데이터 분포도 등 여러 조건을 고려하여 이루어져야 합니다. 

       (무조건 속도가 빨리진다고 보장할 수 없다)

     

    *목적에 따라 여러 방식으로 생성할 수 있는 인덱스 종류들이 있는데, 추후에 꼭 알아보자

     

    2.2 인덱스 삭제 

    DROP INDEX 인덱스 이름;

     

    - 인덱스는 데이터 접근 및 검색 속도 향상을 위해 사용하는 객체이지만, 꼭 좋은 결과로 이어지는 것은 아니다.

    - 정확한 데이터 분석에 기반을 두고 인덱스를 생성해야한다. 

    - 생성과 사용에 관련된 내용은 SQL튜닝 관련 서적을 찾아봅시다! 

     

    3. 뷰

     

     - 가상 테이블을 의미 한다. 특정 SELECT문을 저장한 객체이다. (뷰를 생성할 때 수행한 SELECT문을 저장)

     - SELECT문을 저장하기 때문에 물리적 데이터를 따로 저장하지 않습니다. 

     - 뷰를 FROM절에 사용하면 특정 테이블을 조회하는 것과 같습니다! (서브쿼리와 같아!)

     

    3.1 뷰의 사용 목적(편리성)

     

     - 편리성: SELECT문 복잡도 완화

     - 보안성: 테이블 특정 열을 노출하고 싶지 않은 경우

                     (그냥 테이블 불러다가 쓰면 안되는 민감한 정보가 포함되어 있는 경우..!)

     

    ex)  5개의 테이블을 조인해서 결과를 얻어야할 때 -> 테이블을 새로 짜면 좋지 않을까..?라는 생각이 들 때 

                                                                                   -> 하지만 테이블을 새로 만드는 것은 비효율적

                                                                                   -> 5개 테이블 join한 결과를 view로 만들어서 활용

          

    *하지만 뷰는 새로운 데이터가 추가되었을 때 실시간으로 뷰에 반영되지 않음

    -> 데이터 추가시 마다 view 새로 생성해야함 따라서 특별한 목적 외 엄청 자주 사용하지 않는다고함 

     

    3.2 뷰 생성

     

     - CREATE문으로 생성할 수 있다. (뷰 생성할 수 있는 권한이 있어야함)

    --sys계정
    grant create view to testuser;
    CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 뷰이름(열이름,열이름..)
    AS (저장할 SELECT 문)
    [WITH CHECK OPTION [CONSTRAINT 제약조건]]
    [WITH READ ONLY[CONSTRAINT 제약조건]];
    OR REPLACE  이름 겹칠 때 다른 이름(선택)
    FORCE  뷰가 저장할 SELECT문의 기반 테이블이 존재하지 않아도 만들기 강제(선택)
    NOFORCE  기반 테이블 존재시에만 생성(기본값)
    뷰이름  생성할 뷰 이름
    열 이름  SELECT문에 명시된 이름 대신 사용할 열 이름 지정 (생략가능)
    저장할 SELECT  생성할 뷰에 저장할 SELECT문 지정 
    WITH CHECK OPTION  지정한 제약조건 만족하는 데이터에 한해 DML작업이 가능하도록 뷰 생성
    WITH READ ONLY  뷰의 열람, 즉 SELECT만 가능하도록 뷰 생성 
    CREATE VIEW VW_EMP20
    AS (SELECT EMPNO, ENAME, JOB, DEOTNO FROM EMP WHERE DEPTNO = 20);
    
    SELECT * FROM USER_VIEWS; -- 뷰 정보 확인 가능

     

    3.3 뷰 삭제 

    DROP VIEW 뷰이름

     

     

    * 뷰와 데이터 조작어 

      의외로 뷰에 데이터 삽입-수정-삭제 같은 데이터 조작어 사용이 가능하다! 근데 잘은 안한다! 

      데이터를 따로 저장하는 것이 허용되는 구체화뷰도 있다.

     

    4. 시퀀스 (규칙에 따라 순번을 생성)

     

     4.1 시퀀스란? 

     

      - 특정 규칙에 맞는 연속 숫자를 생성하는 객체입니다. (대기 순번표)

      - 단지 연속하는 새로운 번호를 만든다면, MAX함수 +1 을 활용할 수도 있다.

    SELECT MAX(글번호) +1 FROM 게시판 테이블

     -> 이 방법은 쉽지만 동시에 SELECT문을 요구했을 경우, 데이터를 찾고 더하는 과정이 아쉽다.

     -> 시퀀스는 이런점을 보완해 줄 수 있다.

     

    4.2 시퀀스 생성 

    CREATE SEQUENCE 시퀀스명 
    [INCREMENT BY n]
    [START WITH n]
    [MAXVALUE n | NOMAXVALUE]
    [MINVALUE n | NOMINVALUE]
    [CYCLE | NOCYCLE]
    [CACHE n | NOCACHE]
    INCREMENT N  시퀀스 생성할 번호의 증가값 (기본값 1)
     START WITH  시퀀스 생성 번호 시작 값
    MAXVALUE n  생성할 번호 최대값 지정, 시작값과 최소값 사이,
      NOMAXVALUE일 경우 오름차순 10^27, 내림차순 -1 (선택)
    MINVALUE n  MAX와 반대 NOMINVALUE일 경우 오름차순 1 내림차순 -10^26 (선택)
    CYCLE  최대값 도달시 다시 시작값으로
    CACHE  시퀀스가 생성할 번호를 메모리에 미리 할댕해 놓은 수 지정 (생략시 기본 20 (선택))
    SEQUENCE  시퀀스 이름 설정
    CREATE SEQUENCE SEQ_DEPT_SEQUENCE
    INCREMENT BY 10
    START WITH 10
    MAXVALUE 90
    MINVALUE 0
    NOCYCLE
    CACHE 2;

     

    4.3 시퀀스 사용

    --시퀀스 이용하여 업데이트할 테이블 생성
    CREATE TABLE DEPT_SEQUENCE 
    AS SELECT * FROM DEPT WHERE 1<>1;

    - sql-developer 이용하여 시퀀스 생성

    시퀀스 명  SEQ_DEPT_SEQUENCE로 바꿨음

    -- currval을 하고 싶다면 먼저 nextval을 해야함 
    SELECT SEQ_DEPT_SEQUENCE.nextval from dual;
    
    SELECT SEQ_DEPT_SEQUENCE.currval from dual;

     

     - 생성된 시퀀스 사용시에는 시퀀스명.CURRVAL 혹은 시퀀스명.NEXTVAL을 사용할 수 있다.

       *CURRVAL은 시퀀스 생성 후 바로 사용시 오류 

     

    --시퀀스를 이용하여 테이블에 값 삽입
    INSERT INTO DEPT_SEQUENCE(DEPTNO, DNAME,LOC)
    VALUES(SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE','SEOUL');
    
    SELECT * FROM DEPT_SEQUENCEl

     

    4.4 시퀀스 수정 및 삭제

     

     - ALTER 명령어를 통해 시퀀스 수정하고 DROP를 통해 삭제할 수 있다.

     - 시퀀스 수정 몇가지 옵션을 수정할 수 있는데 START WITH은 변경 불가하다.

    ALTER SEQUENCE SEQ_DEPT_SEQUENCE
    INCREMENT BY 3
    MAXVALUE 99
    CYCLE;

     -> 시퀀스 삭제 

    DROP SEQUENCE SEQ_DEPT_SEQUENCE;

     - 시퀀스를 삭제해도 시퀀스를 사용하여 추가된 데이터는 삭제되지 않는다.

     

     

    5. 공식 별칭을 지정하는 동의어 

     

    5.1 동의어란 

     

     - 테이블,뷰,시퀀스 등 객체 이름 대신 사용할 수 있는 다른 이름을 부여하는 객체이다. 

     - 주로 테이블 명이 너무 길어서  불편할 때 사용한다. (별칭 하나 더 생성)

    CREATE [PUBLIC] SYNONYM 동의어 이름
    FOR [사용자.][객체명];
     PUBLIC  동의어를 모든 사용자가 사용할 수 있도록 함. 생략시 동의어 생성한 사용자만 사용자만 가능
    동의어 이름 필수
    사용자. 본래 객체 소유자 지정, 생략 시 현재 접속한 사용자(선택)
    객체명 동의어 생성 대상 객체(필수)

     -> 이렇게 사용한 동의어는 다양한 SQL에서 사용할 수 있다.

     -> SELECT문 SELCT, FROM에서 사용한 별칭과 다르게 일회성이 아니다.

     

    *열 별칭을 만들기 위한 권한 설정해줘야함! 

     

    --생성
    CREATE SYNONYM E FOR EMP;
    --삭제
    DROP SYNONYM E;

     

    'DataBase > Oracle' 카테고리의 다른 글

    오라클 sql - 인라인 뷰를 사용한 TOP-N SQL  (0) 2023.09.01
    SQL 레벨업 (1) DBMS 아키텍처  (0) 2023.08.31
    SQL - 서브쿼리  (0) 2023.08.31
    SQL - 조인  (0) 2023.08.30
    SQL - 다중행 함수  (0) 2023.08.30
Designed by Tistory.