안녕하세요. 오늘은 조인 쿼리의 성능을 개선하는 것을 이야기해보려 합니다.
사실 아직까진 sql 지식이 많이 없고 부족해서 올리지 않을려고 했던 부분이지만..
혹여 저처럼 잘 모르는 분들을 위해 간단하게나마 올립니다.
서브쿼리에는 대표적으로 SELECT절 / FROM절 / WHERE절이 있습니다.
말 그대로 각각의 해당 부분에 쿼리문에 또 다른 쿼리문을 적용하는 것인데
필요한 쿼리만을 함축하여 속도를 개선할 수 있습니다.
여기서는 크게 두 가지 부분을 가지고 속도 개선을 확인 할 수 있습니다.
- SELECT절
- 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 절에서 서브쿼리로 하나로 묶어 가지고 오면 좋은 성능을 발휘할 수 있습니다.
'Database' 카테고리의 다른 글
[SQL] Insert 후 인덱스 값 가져오는법 (Mybatis&Ibatis) (0) | 2022.07.14 |
---|---|
[MYSQL] 계정 및 권한 생성 방법!! (0) | 2021.12.20 |
[MYSQL] 더미데이터 생성 쿼리!! (0) | 2021.03.31 |
[mysql] 테이블명세서 추출 쿼리 정리!! (3) | 2021.03.11 |
[mysql] 월별통계방법!! (데이터 없는 날짜 0 처리 방법) (0) | 2021.02.25 |
댓글