다른 테이블 끼리 UNION + ORDER BY + 페이징 성능 문제 0 2 4,903

by 화조 [SQL Query] [2024.06.05 18:17:12]


안녕하세요.

레거시 데이터 때문에 어쩔 수 없이 UNION을 사용해서 페이징 쿼리를 작성해야 합니다.

원래 쿼리는 너무 길어서 간단하게 적겠습니다.

 

A Table Query(최대 20_000건)

UNION

B Table Query(최대 20건)

UNION

C Table Query(최대 10건)

ORDER BY updated_at

limit 0, 20 (페이징)

*A, B, C 각 쿼리만 실행했을 땐 빠름

 

위 쿼리를 실행하면 A 테이블 건 수에 따라 엄청 느려집니다.

실행 계획을 보면 A, B, C 결과를 전부 다 가지고 온 후 ORDER BY 할 때 Using temporary, Using filesort가 발생하는데, 이 때문에 느린 걸로 보입니다.

 

혹시 이런 경우에 성능 개선할 수 있는 방법이 있을까요?

 

설명이 부족했다면 말씀 부탁드립니다!

by 마농 [2024.06.07 08:07:56]

1. UNION 사용이 적절한가?
- 대부분 UNION ALL 이 적합합니다.
- UNION 이 사용되어야 하는 이유가 있는지 검토해 보세요.
2. 복잡하고 긴 쿼리
- 간결하게 줄여야 합니다.
3. A Table Query 만 우선 페이징
- A Table Query 를 20개만 가져다가 사용하세요.
- 2페이지의 경우엔 40개를 가져오고, 3페이지에선 60개 형태로
4. 다른 대안은 없는지?
- 테이블의 특성등을 고려하여 다른 대체 방안 검토
- 예를 들면 합집합을 일배치 등으로 미리 별도 테이블로 만들어 두고 사용한다던가?
 


by 화조 [2024.06.09 21:33:20]

 

1. UNION 사용이 적절한가?
- 대부분 UNION ALL 이 적합합니다.
- UNION 이 사용되어야 하는 이유가 있는지 검토해 보세요.

 

-> 넵 UNION ALL이 맞네요. 감사합니다.


2. 복잡하고 긴 쿼리
- 간결하게 줄여야 합니다.

 

- 넵!


3. A Table Query 만 우선 페이징
- A Table Query 를 20개만 가져다가 사용하세요.
- 2페이지의 경우엔 40개를 가져오고, 3페이지에선 60개 형태로

 

-> 이거 정말 좋은 방법이네요. 감사합니다!


4. 다른 대안은 없는지?
- 테이블의 특성등을 고려하여 다른 대체 방안 검토
- 예를 들면 합집합을 일배치 등으로 미리 별도 테이블로 만들어 두고 사용한다던가?

 

-> 넵 이 부분도 고려해보겠습니다!

 

마농님 너무 감사드립니다. 많이 배워갑니다. 정말 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입