반응형

안녕하세요


오늘은 서브쿼리 튜닝으로 돌아왔습니다.



서브쿼리 튜닝의 종류는 정말 다양합니다.



하지만!


이번 포스팅에서는


가장 중요한 두 가지!


merging과 unnesting에 대해 다뤄보도록 하겠습니다.






NO_MERGE     vs     NO_UNNEST



 NO_MERGE: 뷰나 인라인 뷰에 사용


(인라인 뷰 = FROM절의 서브쿼리)



NO_UNNEST: 인라인 뷰 외의 WHERE절 등의 서브쿼리에 사용




 NO_MERGE와 NO_UNNEST의 공통점은


서브쿼리 또는 뷰나 인라인 뷰 )

를 해체하지 말아라. 


라는 의미를 갖고 있습니다.



그럼 그 반대도 있겠죠?




 MERGE: 뷰나 인라인 뷰를 해체해라



UNNEST: 서브쿼리를 해체해라


(해쉬 테이블로 올릴 테이블을 직접 정하고자 할 때 사용)





먼저 서브쿼리 UNNESTING 문부터 알아보죠!



[짝꿍처럼 써줘야하는 힌트]



 NO_UNNEST: 서브쿼리를 해체하지 마라


1. PUSH_SUBQ: 서브쿼리부터 수행해라

2. NO_PUSH_SUBQ: 메인쿼리부터 수행해라


UNNEST: 서브쿼리를 해체해라


1. SWAP_JOIN_INPUT: 해쉬테이블로 올릴 테이블 지정

2.NO_SWAP_JOIN_INPUT: 해쉬테이블로 올리지 않을 테이블 지정




예제를 위한 테이블


[ emp ] : 사원테이블


사원명

나이

직업

연봉 

주소

 A

 35

 NULL

 NULL

 파주

 B

 34

 SALESMAN

 1600

 제주

 C

 38

 PRESIDENT

 5000

 서울

 D

 36

 SALESMAN

 1400

 파주

 E

 39

 ANALYST

 3000

 서울 

 F

 32

 SALESMAN

 1350

 서울

 G

 37

 MANAGER

 2850

 일산

 H

 35

 ANALYST

 3000

 파주

 I

 36

 SALESMAN

 1700

 서울



[ address ] : 주소테이블


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D



예제1. 관할 부서가 한국A인 사원들의 이름, 직업, 연봉을 출력하세요.(서브쿼리로)




[결과]


사원명

직업

연봉 

주소

 C

 PRESIDENT

 5000

 서울

 E

 ANALYST

 3000

 서울 

 F

 SALESMAN

 1350

 서울

 I

 SALESMAN

 1700

 서울




다음으로 서브쿼리 MERGING 문을 알아보죠!




 MERGE: 뷰나 인라인 뷰를 해체해라


NO_MERGE: 뷰나 인라인 뷰를 해체하지 마라

 



예제2. 직업이 SALESMAN과 관련된 데이터만 들어있는 뷰를 생성하고 

그 뷰에서

관할부서가 한국A인 사원들의 이름, 직업, 연봉, 관할부서를 출력하세요.




사원 테이블이 1억건이고 그 중에 SALESMAN이 10건 있다고 가정하면


VIEW를 해체하지 않고 주소테이블과 조인하는 것이 더 효율적입니다.


[결과]


사원명

직업

연봉 

관할부서

 C

 PRESIDENT

 5000

 한국 A

 E

 ANALYST

 3000

 한국 A

 F

 SALESMAN

 1350

 한국 A

 I

 SALESMAN

 1700

 한국 A




오늘은 여기까지!


서브쿼리문을 실행할 때, 서브쿼리문으로 실행할 지,

아니면 조인의 형태로 변경해서 실행할지,


쿼리변환기를 제어하는 기술을 알아보았습니다!



다음엔 PLSQL을 약간 다뤄보겠습니다!

반응형
반응형


안녕하세요~


코딩하는 euni입니다!


오늘은 오라클 SQL view에 대해 알아보도록 하겠습니다!



뷰는 위의 그림처럼 가상!의 테이블입니다!


더 자세히 알아볼까요?



데이터베이스 객체


뷰는 데이터베이스 오브젝트 5가지 중 하나입니다.



VIEW란?


하나 이상의 테이블에 있는 데이터의 부분 집합을 나타낼 수 있는

리적 테이블 입니다.

(다른 뷰를 기반으로 할 수 있습니다.)


뷰는 자체적으로 데이터를 갖고있지 않지만

테이블의 데이터를 보거나 변경 할 수있습니다.



그럼 뷰가 필요한 이유는 무엇일까요?



      1. 보안상의 이유로 특정 데이터를 조회되지 않도록 하고 싶을 때

                  (데이터 엑세스 제한)


      2. 복잡한 쿼리를 간단하게 조회하고 싶을 때

 



뷰에는 단순 뷰복합 뷰 두 가지 유형이 있습니다.


 기능

 단순 뷰

 복합 뷰

 테이블 수

 1개 

 2개 이상

 그룹 함수 포함 여부

 포함하지 않음

 포함

 DML작업 가능 여부

 가능

 불가능할 수도 있음



뷰옵션 2가지



     1. WITH CHECK OPTION

         : WHERE절에서 기술한 조건에 위배되게 VIEW를 수정하지 못한다.

 

     2. WITH READ ONLY

         : VIEW 전체를 수정, 삭제, 입력이 불가한 상태로 만들겠다.





그럼~ 오늘의 예제로 들어가 볼까요?



[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 전화번호

 추천인

 A

 24

 서울

 30000

 010-0123-4567

 null

 B

 29

 서울

 10000

 010-1234-5678

 A

 C

 26

 파주

 25000

 010-2345-6789

 A

 D

 27

 제주

 1000

 010-3456-7891

 B



예제1. 서울에 사는 뷰(고객_서울)로 생성하고 싶습니다.

(단 전화번호는 중요한 정보로 이 뷰를 사용하는 사람이 볼 수 없게 해주세요.)




위와 같이 하나의 테이블을 기반으로 생성한 뷰를 단일 뷰라고 합니다.


특징: CREATE VIEW문에 subquery를 포함시킵니다.


참고: 하나의 테이블을 사용하여 view를 만들 때

group 함수를 포함한다면 복합뷰입니다!


뷰 수정 방법: create or replace view절을 사용하여

뷰를 삭제하고 다시 생성할 수 있습니다.



예제2. 고객_서울 뷰에서

고객 B의 총구매액을 20000으로 갱신하는 쿼리문을 작성해주세요




위의 결과는 고객_서울 뷰에 반영되었습니다.




그렇다면 고객 테이블에서는 고객 B의 총구매액이 20000으로 갱신될까요?




그 이유는 뷰는 데이터를 갖고있는 것이 아니고

논리적으로 존재하기 때문이죠.


또 다르게 생각해보면,


만약 뷰로 데이터를 갱신하지 못한다면

기반이 되는 기본 테이블로만 데이터 갱신이 가능하게 되고

새로운 테이블을 만드는 것과 다름이 없게됩니다.

 

동일한 데이터의 다른 뷰를 제공하는 것이 뷰의 또다른 장점입니다!




만약! 특정 VIEW의 데이터를  수정, 삭제, 입력을 불가능하게 하고싶다면?




이때 사용하는 것이 VIEW의 옵션 WITH READ ONLY입니다.

물론 권한을 주는 다른 SQL문도 존재합니다.


하지만

뷰를 생성하면서 데이터 손상을 막기위해

미리 제약을 두는 방법도 사용할 수 있답니다!


(WITH CHECK ONLY절도 위와 같은 방법으로 사용할 수 있습니다.)




오늘은 VIEW(뷰)에 대해 알아보았습니다.


데이터 검색 query의 성능을 향상시키려면 인덱스를 생성하는 것을 추천합니다!


내일은 인덱스로 찾아올께요~

반응형

+ Recent posts