오늘은 대용량 데이터를 추출시
가장 중요한 성능이 좋은 쿼리
메모리를 덜쓰고, 빠르게 데이터를 추출하는 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. 또한, 쿼리가 짧다고 무조건 좋은 것만도 아닙니다. ('효율'의 관점에서)
- WINDOW Function 같은 경우에는 Hive에서 돌아갈때 굉장히 느립니다.
- rank함수를 사용하게되면, 전체 데이터를 한번 sorting을 해야하는 부분이있어서,
메모리관점에서 부하가 높고, 시간이 오래 걸리는 작업입니다. - 그래서 rank함수는 실무에서 많이 안쓰일수도 있어요.
많이 느려서요. (회바회, 부바부 이겠지만요!)
- rank함수를 사용하게되면, 전체 데이터를 한번 sorting을 해야하는 부분이있어서,
- 따라서 rank 함수보다 데이터를 order by로 정렬하고 limit로 원하는만큼 잘라 오는것이 쿼리는 더 길어지더라도, 효율적인 측면에서는 더 좋을 수도 있어요
- limit를 사용하면 100번째에서 중지를 할수 있지만,
rank하게되면 전체 데이터를 sorting하니깐요 - 따라서 쿼리가 길어지더라도, 이해하기 쉽고 직관적이고, 데이터가 빨리 나올수있는 구조라면,
orderby와 limit를 사용한 쿼리가
window 펑션을 쓴 짧은 쿼리보다 더 좋을 수도 있습니다.
- limit를 사용하면 100번째에서 중지를 할수 있지만,
'SQL' 카테고리의 다른 글
[SQL] 테이블 생성하기(DROP DATABASES, CREATE DATABASE) (0) | 2022.10.06 |
---|---|
[SQL] NULL처리 (IFNULL, NVL, ISNULL, COALESCE, NULLIF ) (0) | 2022.09.29 |
[SQL] update, set - 테이블 내 데이터 값 변경하기 (0) | 2022.08.30 |
Mysql 에 csv 파일 불러오기 (0) | 2022.08.15 |
[SQL튜닝] SQL 성능 튜닝 기초 (INDEX, Cardinality, 점조건, 선분조건) (0) | 2022.06.28 |