[oracle] 오라클 SQL - View, Sequence, Index, Synonym, 데이터 연결 4가지 방법


오라클 SQL View, Sequence, Index, Synonym, 데이터 연결 4가지 방법

11장. View, Sequence, Index, Synonym, 데이터 연결 4가지 방법

11장 : 뷰(View), 시퀀스(Sequence), 인덱스(Index), 동의어(Synonym)

View

  • Named Select
  • 뷰에 대한 질의는 Base Table에 대한 질의로 QT(Query Transformation)됨.(예외 많음)
  • 집합의 무한 확장
  • 종류
    • Simple View : 테이블에 있는 내용 그대로
    • Complex View : 테이블에 있는 내용 그대로 안 보여줌 (사용자가 이것저것 추가 한다는 의미)

View - 집합의 무한 확장

    --
    create or replace view vu_numbers
    as
    select level as no, level*2 no2, level*5 no5, level*10 no10, chr(level+64) d
    from dual
    connect by level <= 10 ;
    
    select * from vu_numbers;  

View - Simple View 1

    --create view 생성
    create or replace view v1
    as
    select empno, ename, sal
    from emp
    where deptno = 30;
    
    --create view가 만들어 졌는지 확인
    select view_name, text
    from user_views;
    
    --create view 만든거 사용하기
    select *
    from v1;
    
    --v1의 조건인 Deptno = 30 결과와 where sal >= 2500 2개를 처리한다. 
    --이를 view merging이라고 한다.
    select empno, enamne, sal
    from v1
    where sal >= 2500;

View - Simple View 2

    --일부 내용만 보이게
    create or replace view vu_emp1
    as
    select empno, ename, job
    from emp;
    
    --급여 항목까지 보이게 
    create or replace view vu_emp2
    as
    select empno, ename, job, sal
    from emp;
    
    --검색 권한주기 
    grant select on vu_emp1 to public;
    grant select on vu_emp2 to public;
    
    --ace30에 대한 권한이 없기 때문에 에러 발생
    select * from ace30.emp;
    
    --뷰는 접근 가능
    select * from ace30.vu_emp1;
    select * from ace30.vu_emp2;

View - Complex View

    create or replace view v2
    as
    select d.deptno   부서번호, 
           d.dname    부서이름, 
           count(*)   사원수, 
           max(e.sal) 최고급여, 
           min(e.sal) 최소급여
      from emp e, dept d
     where e.deptno = d.deptno
     group by d.deptno, d.dname;
    
    
    select * from v2;

Sequence

  • https://orapybubu.blog.me/40020473578

11-30. Sequence를 사용할 경우 값의 Gap이 발생할 수 있음

    --발생한 번호를 포함한 DML문 ROLLBACK 
    insert into t values (seq.nextval, ...);  --1
    insert into t values (seq.nextval, ...);  --2
    
    commit;
    
    insert into t values (seq.nextval, ...);  --3
    insert into t values (seq.nextval, ...);  --4
    insert into t values (seq.nextval, ...);  --5
    
    rollback;
    
    insert into t values (seq.nextval, ...);  --6
    --하나의 시퀀스를 여러 테이블에서 사용할 경우
    insert into t values (seq.nextval, ...); --1
    insert into t values (seq.nextval, ...); --2
                                                        insert into t values (seq.nextval, ...); --3
    insert into t values (seq.nextval, ...); --4    
                                                        insert into t values (seq.nextval, ...); --5
                                                        insert into t values (seq.nextval, ...); --6
    --Cache 설정으로 추출한 번호를 서버 종료로 잃어버리는 경우
    select * from user_sequences;

Index

      - 이익          vs          손해
        검색속도 향상               검색속도 저하
        PK, UK 제약 강화           DML 속도 저하
        FK 관련 일부 Lock 해결      스토리지 소비
  • 데이터 저장소의 데이터가 순서없이 저장되어 있어서
  • 이를 극복하기 위해 만든 객체로서 rowid를 전문적으로 보관함. ```
    • rowid - pseudocolumn 컬럼 가운데 하나 -> https://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns.htm#SQLRF0025 - 64진법 - 6(Object) 3(File) 6(Block) 3(Row) 구조

    • 오라클에서 데이터를 찾는 가장 빠른 방법은 rowid를 활용하는 것이다. ```

    --rowid를 포함한 모든 속성의 emp 테이블 리턴
    --WARD 직원의 rowid를 살펴보자
    select rowid, e.* from emp e;
    
    --WARD 사원 정보 가져오기 
    select *
    from emp
    where rowid = 'AAAFGdAABAAAMKpAAC';
    --인덱스 생성
    create index emp_job_idx
    on emp(job);
    
    --방금 만든 인덱스 살펴보기
    select job, rowid
    from emp
    order by 1, 2;
    
    select * from emp;
  • 아래 쿼리를 수행할 경우 오라클의 Optimizer가 인덱스 사용 여부를 판단하며
  • 인덱스를 사용할 경우 MANAGER라는 값으로 인덱스를 이용해서 적절한 rowid를 획득함
  • 획득한 rowid로 테이블의 데이터를 찾아서 return하게 됨
      select *
      from emp
      where job = 'MANAGER';
    

Synonym

  • 하나의 객체(employees)에 여러개 synonym(es, sawon, …) 사용 가능
      create synonym es for employees;
        
      select * from es;
        
      select * from employees;
        
      drop synonym es;
    

데이터 연결 4가지 방법

  • [0] 데이터 준비
      drop table t1 purge;
      drop table t2 purge;
        
      create table t1 
      as
      select empno, ename
      from emp
      where empno <= 7788;
        
      create table t2
      as
      select empno, job
      from emp
      where empno <= 7788;
    
  • [1] 조인
      select *
      from t1, t2;
        
      select *
      from t1, t2
      where t1.empno = t2.empno;
        
      select t1.empno, t1.ename, t2.job
      from t1, t2
      where t1.empno = t2.empno;
    
  • [2] 서브쿼리
      select empno, ename, (select job from t2 where empno = t1.empno) as job
      from t1;
    
  • [3] SET 연산자
      select empno, ename, null as job
      from t1
      union all
      select empno, null, job
      from t2
      order by 1, 2;
        
      select empno, max(ename), max(job)
      from (select empno, ename, null as job
          from t1
          union all
          select empno, null, job
          from t2
          order by 1, 2)
      group by empno
      order by empno;
    
  • [4] 사용자 정의 함수
      create or replace function uf_get_t2_job(a t1.empno%type) 
      return varchar2
      is
      v_job t2.job%type;
      begin
      select job into v_job
      from t2
      where empno = a;
        
      return v_job;
      end;
      /
        
      col job format a20
        
      select empno, ename, uf_get_t2_job(empno) as job
      from t1;
    

References

개발자님들 덕분에 많이 배울 수 있었습니다. 감사의 말씀 드립니다.





© 2020. GANGPRO. All rights reserved.