서버 개발/프로그래머를 위한 RDBMS

인라인 뷰의 활용

지노윈 2020. 5. 27. 10:59
반응형

단계적 조인을 위한 활용

전체적인 일량을 줄이기 위해 사용하는 방법

 

- group by 후 조인

내가 추출할 그룹의 레벨인 테이블로 group by 한 후 조인하면 많은 불필요한 조인을 줄일 수 있습니다.

select y.상인이름
       sum(x.판매수량),
       sum(x.판매금액)
from 상품목록 x, 상인 y
where x.상인코드 = y.상인코드 
  and x.아이템코드 = @아이템코드
group by y.상인이름

상품 목록을 '상인' 레벨로 추출 후 조인하였습니다.

select y.상인이름, 수량, 금액
from (select 상인코드,
             sum(판매수량) 수량,
             sum(판매금액) 금액,
      from 상품목록
      where 아이템코드 = @아이템코드
      group by 상인코드) x, 상인 y
where x.상인코드 = y.상인코드 

이렇게 하면 1:m이 아니라 1:1 조인이 되어 join의 수가 줄어 듭니다.

 

- 유저 조회 예

다음과 같이 항목 두개를 입력 받아 검색하는 프로그램을 작성하세요.

idx1 : 계정id, idx2 : 유저이름

select ...
from 유저
where 계정id like @v1 +'%'
  and 유저이름 like @v2 +'%'

위와 같이 쿼리를 작성하면 안됩니다.  실행 계획은 idx1 또는 idx2 인덱스를 사용할 것입니다. 실행 계획이 idx2를 사용하지만 검색어 입력이 계정id만 있고 유저 이름이 비어 있다면 index full scan해서 계정id를 찾고 보니 1건이 딱 나옵니다. 아니면 두 인덱스를 모두 읽어서 index로 풀릴 수도 있고 이것도 아니면 full table scan으로 실행 될 수도 있습니다.

 

입력 조건에 따라 실행 계획도 달라지게 쿼리를 작성해야 겠습니다.

다음과 같이 인라인 뷰를 사용하여 실행이 달라 지도록 할 수 있습니다.

select ...
from 
  (select ...
   from 유저
   where @v1 is not null
     and 계정id like @v1 + '%'
   union all
   select ...
   from 유저
   where @v1 is null
     and 유저이름 like @v2 + '%')

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 게임 서버 프로그래머가 알아야 할 RDBMS

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 옵티마이저 맛보기

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 테이블 조인 하면 느리다?

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 리커시브 모델의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 아크 모델(exclusive or)에서의 주의점

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 부분범위 처리와 전체 범위처리

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인덱스의 제대 사용하자

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 옵티마이저

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - Nested Loop/Sort Merge/Hash Join

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 테이블 클러스터링 팩터

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - DB 절차적 사고 VS 집합적 사고

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL 집합의 가공

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - SQL IN의 특징과 IN의 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 서브 쿼리 활용

[데이터베이스/게임 서버 프로그래머가 알아야 할 RDBMS] - 인라인 뷰의 활용