본문 바로가기

DB

쿼리 속도차이

반응형

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' 카테고리의 다른 글

EXISTS, IN 차이점  (0) 2024.03.22