본문 바로가기
IT/Database

[SQL 쿼리 튜닝] OR -> UNION ALL 변환

by 성준하이 2023. 6. 26.
반응형

데이터베이스를 사용하다보면 많은 데이터를 갖고 있는 테이블에는 조회를 위해서 인덱스가 필요할 경우가 있다.

하지만 인덱스와는 별개로 쿼리를 좀더 튜닝을 하여 DBMS가 잘 읽을수만 있게 짜주는것만으로도 효과를 낼수가 있다.

 

요즘엔 DBMS 옵티마이저가 많이 똑똑해져서 실행계획을 잘 만든다고 들었다.

하지만 직접 명시해주는것만큼 확실한 방법은 없을것이다.

이번 포스팅에서는 쿼리 내의 OR조건을 UNION ALL 로 변환을 하며 쿼리를 개선하여 인덱스를 탈수 있도록 변경을 해볼 것이다.

 

먼저 UNION 과 UNION ALL 에 대한 개념은 아래 참고 포스팅을 참고 바란다.

 

일단 우선 UNION 과 UNION ALL 의 차이를 다시 소개하면.

UNION은 중복제거 + 정렬까지 들어가게 된다.

즉, 연산이 필요한 상황이고 UNION ALL은 단순 결과를 이어 붙여서 합치기만 해준다.

결론적으로는 UNION ALL 을 사용해주는것이 성능적으로 우수하다.

 

그럼 이제 OR 조건을 UNION 으로 바꿔줘볼것이다.

 

예시 쿼리를 보면

  • SELECT * FROM TABLE WHERE id = 'a' or name = 'b';

이렇게 쿼리를 짰다고 하면 ID 가 a 이거나 name 이 b 인 값을 가져오는것이다.

하지만 옵티마이저는 여기서 id와 name의 인덱스가 있다 한들 어떤 인덱스를 활용해야하는지 옵티마이저 힌트를 주지 않는다면 선택을 못할것이다.

 

이럴경우에는 

  • SELECT * FROM TABLE WHERE id = 'a' UNION ALL SELECT * FROM TABLE WHERE name = 'b';

이렇게 두개의 쿼리로 나눠서 합쳐주면 각각 쿼리에 맞는 인덱스를 사용하여 효과를 볼수 있다.

 

물론 중복 제거와 정렬에 관련해서는 해당 쿼리를 서브 쿼리로 빼서 동작을 하든 ,

프로그래밍 코드로 가져가서 구현을 해야하지만,

실제 사용하는 속도 면에서는 극적인 효과를 볼수 있을 것이다.

 


참고 포스팅

https://thenicesj.tistory.com/606

 

데이터베이스 테이블 합집합, 차집합(UNION, UNION ALL, MINUS)

데이터베이스를 사용하면 join이나 서브쿼리를 통해서 테이블을 합치곤 한다. 하지만 이렇게 합치는것은 수평적으로 하여 컬럼이 많아지도록 합치는 것이고, 오늘 소개할 UNION, UNION ALL, MINUS는 수

thenicesj.tistory.com

 

반응형

'IT > Database' 카테고리의 다른 글

[Oracle] TNS에 대해서  (50) 2023.08.09
DB Link 에 대해서(23.07.24)  (11) 2023.07.25
데이터베이스 테이블 합집합, 차집합(UNION, UNION ALL, MINUS, INTERSECT, EXCEPT)  (46) 2023.06.25
LAG, LEAD 함수에 대해서  (44) 2023.06.21
upsert 란?  (62) 2023.06.12

댓글