by djwoo [PL/SQL] union union all multi table [2017.03.31 11:31:39]
key 값과 type을 가진 A 테이블
id | type | search_id |
1 | AAA | 3 |
1 | BBB | 2 |
3 | AAA | 1 |
4 | CCC | 10 |
4 | DDD | 2 |
이런식의 테이블 데이터가 들어가 있구요. A 테이블의 타입에 따라서 각각 조회할 테이블이 다릅니다. 거의 20개 정도 테이블이구요.
처음에는
select id, type, search_id , col1,col2 ...
from A ,
( select search_id, 'AAA' as type , col1, col2, col3 ... from A1
uion all
select search_id, 'BBB' as type ,col1, col2, col3 ... from A2
union all
select search_id, 'CCC' as type, clo1,col2, col3 ... from A3
union all
....
) B
where A.type = B.type
and A.search_id = B.search_id
and id = 1;
이런식으로 누군가 구현을 해놨던데.. 점점 타입에 따른 테이블과 테이블 안에 데이터가 많아 질수록 .... 느려지고 감당하기 힘들어져서 변경요청이 왔는데
저도 쿼리공부한지 1년밖에 안된 초보자인지라 도움을 구해요. postgresql 문법으로 작성을 해오라고해서 더 멘붕이네요. ㅠ ㅠ
테이블 구조 변경이 어렵다면
select * from ( select id, type, serchid, col1, col2 from a, a1 b where a.type ='AAA' and a.search_id = b.search_id union all select id, type, serchid, col1, col2 from a, a2 b where a.type ='BBB' and a.search_id = b.search_id union all select id, type, serchid, col1, col2 from a, a3 b where a.type ='CCC' and a.search_id = b.search_id ) where id = 1
이런 형태도 적용해보시고요.
예전에 테이블마다 select만 해도 느렸다면 인덱스 구성이 완전 잘못된 구조였던 것이고
지금은 DB를 밀어서 데이터가 작아져버렸으니 괜찮은 것처럼 보이는 것 뿐이죠.
시간이 지나서 데이터가 많아지면 다시 느려질 겁니다.
결론적으로 테이블마다 조회 조건 구성을 잘 파악하고 적절한 인덱스 구성만 해준다면
성능이 나아진다는 것이죠.
애초에 with문으로 쿼리를 바꾼다고 성능 문제를 해결할 수도 없는 구조구요.
항상 id 검색조건이 들어온다면 각 테이블마다 id컬럼으로 인덱스가 있는지..
조인 컬럼인 search_id 컬럼으로 인덱스가 있는지 확인해보세요.