본문 바로가기
Database

[Query] Join 속도 개선 방법 (feat. SubQuery)

by GoodDayDeveloper 2021. 4. 13.
반응형

 

안녕하세요. 오늘은 조인 쿼리의 성능을 개선하는 것을 이야기해보려 합니다.

사실 아직까진 sql 지식이 많이 없고 부족해서 올리지 않을려고 했던 부분이지만..

혹여 저처럼 잘 모르는 분들을 위해 간단하게나마 올립니다.

 

서브쿼리에는 대표적으로 SELECT절 / FROM절 / WHERE절이 있습니다.

말 그대로 각각의 해당 부분에 쿼리문에 또 다른 쿼리문을 적용하는 것인데

필요한 쿼리만을 함축하여 속도를 개선할 수 있습니다.

 

여기서는 크게 두 가지 부분을 가지고 속도 개선을 확인 할 수 있습니다.

 

 

  1. SELECT절 
  2. FROM절 

 

 

 

 


 

 

 

 

 

 

 

 

 

예를들어 tbl_A, tbl_B, tbl_C 이렇게 3개의 테이블을 조인할 경우는 흔히 아래와 같이 사용합니다.

하지만 아래 부분은 tbl_A, tbl_B, tbl_C 테이블에서 모든 컬럼과 모든 데이터들을 전부 조회하기 때문에

속도가 느려질 수 밖에 없습니다.

또한, 데이터양이 많으면 쿼리의 속도는 현저히 느려지기 마련이고,

10개의 테이블을 이런식으로 조인하게 되면 더욱 느려지게 되겠죠.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
     TblA.A
 
    ,TblB.B
    
    ,TblC.B
FROM
    tbl_A TblA   
    LEFT OUTER JOIN tbl_B TblB    
            ON TblB.join_value = TblA.join_value
    LEFT OUTER JOIN tbl_C TblC
            ON TblC.join_value = TblA.join_value
cs

 

 

 

 

그래서 서브쿼리를 이용하여 필요한 부분만 추출한 다음, 조인을 진행하면 속도가 일부 개선될 수가 있습니다.

 

 

 

 


 

 

 

반응형

 

 

 

 

SELECT절

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
     TblA.A
 
    ,TblB.B
    
    ,TblC.C
FROM
    (SELECT  A ,join_value   FROM  tbl_A  )   TblA   
LEFT OUTER JOIN 
    (SELECT  B ,join_value   FROM  tbl_B  )   TblB    
        ON TblB.join_value = TblA.join_value
LEFT OUTER JOIN 
    (SELECT  C ,join_value   FROM  tbl_C  )   TblC
        ON TblC.join_value = TblA.join_value
cs

 

 

 

아래와 같이 tbl_A의 컬럼을 전부 불러올 필요 없이,

서브쿼리를 통해 tbl_A의 테이블에서 A라는 컬럼과 조인에 필요한 join_value만 불러 사용하면 됩니다.

또한 서브쿼리 안에 where절과 group by를 통해 불러오는 데이터양을 감소시킬 수 있습니다.

 

 

 

 

 

 

FROM절

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
     TblZ.A
    ,TblZ.B
    ,TblZ.C
FROM
   (
   SELECT
       TblA.A, TblA.join_value,
       TblB.B, TblB.join_value,
       TblC.C, TblC.join_value  
   FROM  
      tbl_A AS TblA   
   LEFT OUTER JOIN 
      tbl_B AS TblB    
   ON 
      TblB.join_value = TblA.join_value
   LEFT OUTER JOIN 
      tbl_C AS TblC
   ON 
      TblC.join_value = TblA.join_value
   ) AS TblZ
cs

 

 

 

SELECT절도 속도를 개선할 수 있지만

어째꺼나 테이블을 하나하나 불러오기 때문에 시간이 걸릴 수 있습니다.

FROM 절에서 서브쿼리로 하나로 묶어 가지고 오면 좋은 성능을 발휘할 수 있습니다.

 

 

 

 

 

반응형

댓글