SQL

[SQL튜닝] 효율이 좋은 쿼리 (대용량 데이터 처리)

춘식이2 2022. 8. 30. 19:17

오늘은 대용량 데이터를 추출시

가장 중요한 성능이 좋은 쿼리

메모리를 덜쓰고,  빠르게 데이터를 추출하는 SQL 쿼리에 대해서 알아보겠습니다.


 

SQL 쿼리를 효율적으로 짜는 것은 무엇일까요?

 

쿼리를 잘짠다?
= 빨리 돈다, 메모리를 덜 쓴다


 빨리돌고 메모리를 덜 쓰려면?
= 필터링을 많이 한다
= join/group by하는 데이터는 최소한으로 한다

 

그렇습니다. 

대용량의 데이터일 수록 데이터를 "작게"만들어야 하는 것이 중요해집니다.


대용량 데이터 SQL 튜닝의 핵심

데이터를 작게 만든다

 


1. 데이터를 작게 만들기 

  • 최대한 데이터를 한번에 잘라낼 수있게
  • 작은 데이터가 join 이되고 group by 가 될 수있도록



2. 두개 이상 테이블 join시, "join 전"에
where/group by 등의 조건을 각각 테이블에 넣기

  • join 과, group by의 성능이 나아질 수있다
  • 각 테이블에서 미리 group by하고 조인하기



3. join 을 한번에 많이하면 DB적으로 성능에서 좋지 않다

- 예를들어 3개 테이블이 조인이 필요하다면

3개 테이블을 한번에 하는 것보다 2개 먼저하고,
후에 메인테이블과 한번 더 하는 것이 효율적일 수도 있습니다.

 

 


 

참고1. DBMS가 가장 힘들어하는 것이 JOIN 입니다

  • 따라서 필터를 하고 데이터를 많이 줄이고
  • 필요한 데이터만 조인해서 붙여넣고 결과를 내는 것이 중요합니다



참고2. 또한, 쿼리가 짧다고 무조건 좋은 것만도 아닙니다. ('효율'의 관점에서)

  1. WINDOW Function 같은 경우에는 Hive에서 돌아갈때 굉장히 느립니다.
    • rank함수를 사용하게되면, 전체 데이터를 한번 sorting을 해야하는 부분이있어서,
      메모리관점에서 부하가 높고, 시간이 오래 걸리는 작업입니다.
    • 그래서 rank함수는 실무에서 많이 안쓰일수도 있어요.
      많이 느려서요. (회바회, 부바부 이겠지만요!)

  2. 따라서 rank 함수보다 데이터를 order by로 정렬하고 limit로 원하는만큼 잘라 오는것이 쿼리는 더 길어지더라도, 효율적인 측면에서는 더 좋을 수도 있어요
    • limit를 사용하면 100번째에서 중지를 할수 있지만,
      rank하게되면 전체 데이터를 sorting하니깐요
    • 따라서 쿼리가 길어지더라도, 이해하기 쉽고 직관적이고, 데이터가 빨리 나올수있는 구조라면,
      orderby와 limit를 사용한 쿼리가
      window 펑션을 쓴 짧은 쿼리보다 더 좋을 수도 있습니다.