반응형
db를 처음짜기 시작했던 때에 짰던 쿼리가 하나 있다
SELECT ta.*,
(select filed1 from T_TEST2 where test2_key = ta.test_key1) as name,
(select decode(count(1), 0, 'X', 'O') from T_TEST3 where test3_key = ta.test_key2) as val
FROM T_TEST1 ta
where test_file1 = 'ok'
order by test_field2;
딱 봐도 느리고 안좋다.
어쩔수없이 select문에 서브쿼리를 넣어서 특정 데이터를 가져올 때도 있긴하겠다만, 저 쿼리는 구조상 저러지 않아도된다.
주 테이블(T_TEST1)의 데이터 양이 많지 않다면 속도가 별로 느리지 않겠지만 양이 늘어날수록 속도는 상상이상으로 느려질 것이다. 실제로도 그랬고...
단순하게 생각만 해봐도
T_TEST1 의 데이터가 100만건이라면 100만건의 ROW마다 다시 T_TEST2와 T_TEST3 테이블을 SELECT 하게 될것이다. 절대 빠를수가 없지 아니한가...
그래서 좀 바꿔보았다.
--ORACLE
SELECT ta.*,
tb.field1 as name,
decode(tc.cnt,0,'X','O') as val
FROM (select * from T_TEST1
where test_file1 = 'ok' ) ta
join (select field1 , test2_key from T_TEST2) tb on ta.test_key1=tb.test2_key
left join (select test3_key, count(1) as cnt from T_TEST3 GROUP BY test3_key) tc on ta.test_key1=tc.test3_key
order by test_field2
--MYSQL
SELECT ta.*,
tb.field1 as name,
CASE WHEN tc.cnt = 0 THEN 'X' ELSE 'O' END as val
FROM (select * from T_TEST1
where test_file1 = 'ok' ) ta
join (select field1 , test2_key from T_TEST2) tb on ta.test_key1=tb.test2_key
left join (select test3_key, count(1) as cnt from T_TEST3 GROUP BY test3_key) tc on ta.test_key1=tc.test3_key
order by test_field2
서브쿼리를 빼고 join 문과 left join 문을 넣고 group by 까지 해주었다.
실제로 속도 차이가 몇 백 배 정도 차이가 났다.
당시 데이터양이 적어서 별 생각없이 쿼리를 짠듯한데 저러지말자...
쿼리는 반드시 작성 전 생각을 충분히 하기로하자
만약 망가진 쿼리를 그 이후에 생각하려면 더 복잡하다.
반응형
'DB' 카테고리의 다른 글
db 테이블 명세서 작성 쿼리 (0) | 2024.10.17 |
---|---|
join 다중 업데이트 (0) | 2024.10.17 |
오라클,MySQL 특정 문자 정렬 (0) | 2024.10.17 |
쿼리 조건절 유의점 (0) | 2024.08.24 |
EXISTS, IN 차이점 (0) | 2024.03.22 |