[SQL 성능개선하기] - 조인 조건이 없는 조인

이동찬·2023년 2월 5일
0

SQL

목록 보기
21/22

CARTESIAN Product가 발생하는 경우

  1. WHERE절이 없는 조인 수행
  2. 조인을 위한 조건 없이 조인 수행
  • '데이터 복제'라는 개념을 활용하기 위해 사용하지만, 잘못 사용하게 되면 오히려 데이터를 부푸리는 원인이 되기 때문에 퍼포먼스를 오히려 나쁘게 할 수도 있음

CARTESIAN PRODUCT의 개념

  • 2개의 테이블을 where절 없이 조인한다고 가정!
  • 앞의 테이블은 4건의 데이터, 뒤의 테이블은 3건의 데이터가 있다.
  • where절 없이 조인을 하게 되었을 때, 출력되는 데이터는 4건*3건 = 12건의 데이터가 나타나게 된다.(곱집합)

자주 사용하는 방법

  • ?가 나타난곳에 테이블이 사용될 수도 있고 view가 사용될 수도 있다.
  • COPY_T, IMSI_T, DUMMY_T와 같은 temporary Table을 활용함
  • DUAL을 사용함(DUAL은 단 한거의 데이터를 가진 더미테이블이다.)
  • 타 SQL에서 사용하고 있는 Table 활용 및 ROWNUM을 사용함
    -> 주로 MASTER 성 테이블을 사용함.
    	더미테이블 : 날짜와 같이 사용 빈도가 높은 데이터들을 미리 테이블로 만들어 놓고 필터링을 위한 목적으로 사용하는 테이블.

CARTESIAN PRODUCT 적용 예제

  • 3개의 쿼리 모두 테이블 emp를 사용중이다.
  • where절 없이 데이터를 찾고있다.
  • 이와 같은 쿼리가 데이터 복제를 통해 수정해야할 대표적인 쿼리문이다.
  • 만약에 이와 같이 SQL이 작성되어 있을 때, WHERE절같은 조건이 있다면 조건까지도 똑같아야 되겠다. 즉, 한마디로 각 SQL문이 읽어들이는 데이터가 모두 같을 때 데이터 복제를 통해서 튜닝을 해야한다라는 말이다!

쿼리 수정문

  • emp 테이블로부터 필요한 컬럼정보를 찾게 하는 sql문이 작성되어있다.

  • 상대쪽 view에는 DUAL을 사용하되 CONNECY BY를 이용해서 ROWNUM이 3보다 작거나 같다라고 했을 때, 1,2,3이라는 3건의 데이터를 갖게된다. 따라서, 테이블로부터 읽은 데이터가 상대편에 있는 1,2,3이라는 3건의 데이터와 각각 연결이 되어있다라고 할 수 있다.

  • SELECT할 때, 어떤 값으로 연결되어있냐를 고려해서 직군별, 부서별, 총인원이라고 구분을 해주면 된다.

    	CONNECY BY : CONNECT BY 절은 각 행이 어떻게 연결되는지를 오라클에게 알려주는 역할을 한다. 즉 계층 구조 내에서 각 행의 관계를 설정하는 것이다.

또 다른 CARTESIAN PRODUCT 적용 예제 사례 1

  • 왼쪽은 개인별 실적데이터들 그리고 컬럼들은 분기별 실적들이다.
  • 왼쪽 그림을 오른쪽 그림으로 구조변환을 하고자 하는 것이다.
  • 이것을 단 하나의 SQL로 나타내는 것이 중요하다.
  • 그럴려면 쿼터 구분으로 사용하기 위한 1,2,3,4라는 4건의 데이터와 조인 조건없이 조인을 수행시키면 된다.

적용예제 쿼리

  • 이렇게 쿼리를 짜면 구조변환이 가능하다.
  • CONNECT BY ROWNUM <= 4를 통해서 1,2,3,4가 들어있는 테이블을 만들어 줄 수 있다.

적용예제 쿼리(ORACLE VER 11g부터~)

  • UNPIVOT이라는 함수를 통해 CARTESION PRODUCT가 없이 구조변환이 가능하다.
  • FROM절에 VIEW에 대한 구문을 나타내기보다는, 요즘 들어 특히 SELECT 위쪽에 WITH AS 구문으로 테이블로부터 데이터를 읽도록 하는 구문도 볼 수 있다.
  • 그렇게 한번 데이터를 읽고 UNPIVOT을 통해, 쿼터1,2,3,4를 각각 나타내면 구조변환이 가능해진다라고 할 수 있다.
  • 이와 같은 함수가 없다면 CARTESION PRODUCT로 진행해야한다.

또 다른 CARTESIAN PRODUCT 적용 예제 사례 2

  • 날짜 정보를 넣어둔 테이블이 있다고 가정한다. (31건의 날짜정보를 넣어두었다.)
  • 날짜정보를 넣어둔 테이블 하나로 특정 연도에 대한 1년치 날짜를 만들어 낼 수 있다.
  • CARTESION PRODUCT를 통해 2017년도를 예로 들어 1년치 날짜를 만든다.
  • 01부터 12까지를 찾아오게 해서 월로 사용하고, 그 다음 01부터 31일까지가 날짜를 사용하면 되니깐 월로사용하는 12건과 날짜로 사용하는 31건의 데이터를 수행시키고 있는 중이다. 이렇게 되면 각 월마다 31일자가 만들어진다.
  • 하지만 각 월마다 마지막 날짜를 찾아내야한다. 마지막 날짜를 찾기 위해서 SQL문에다가 LAST_DAY라는 함수를 이용해 월별 마지막 날짜를 찾도록 한다.
  • 이때 찾아들인 진짜 마지막 날짜와 앞서 만든 372일자를 WHERE절에서 조건으로 비교하게 되면 실제 1년치 날짜를 나타낼 수 있다.

실전예제문제


  • 해당 같은 데이터를 3번씩 읽고있어 비효율적이기 때문에 CARTESION PRODUCT로 진행을 해주어야 한다.

실전예제문제 수정문

  • DUAL 더미 테이블을 이용하여 ROWNUM을 3개 만들어준다.

  • 굳이 4초짜리를 1초짜리로 만들어야하냐 ㅋㅋ 좀 기다리자

0개의 댓글

관련 채용 정보