데이터베이스를 사용하다보면 많은 데이터를 갖고 있는 테이블에는 조회를 위해서 인덱스가 필요할 경우가 있다.
하지만 인덱스와는 별개로 쿼리를 좀더 튜닝을 하여 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
'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 |
댓글