본문 바로가기
Database

[SQL] 쿼리 사용시 주의사항

by BTC_동동 2023. 5. 19.

안녕하세요! 일단고 팀의 BTC_동동입니다.

점점 후덥지근한 날씨가 되어가는게 여름이 가까워지는 것을 느끼고 있습니다. 음식물에 관련해서 관리를 잘해야 하는 거 항상 주의하시고 후덥지근하더라도 늘 웃음을 잃지 말아야 겠죠?!

이번 시간에는 모든 IT 서비스의 핵심이 될 수 있는 데이터베이스에서 SQL 쿼리를 사용할 때 주의할 점을 알아보겠습니다.

1. 서론

 

우리가 사용하는 애플리케이션이나 대부분의 IT 서비스는 데이터베이스가 존재합니다. 그리고 이 데이터베이스의 중요도는 두 말할 것이 없습니다. 웹 서비스를 운영할 때 web이나 was가 고성능이고 장애에 즉각 대응할 수 있는 환경이라도 DB에 문제가 생기면 사실상 전체 서비스가 문제가 생기는 것과 다를 것이 없을만큼 중요한 부분입니다. 따라서 SQL 사용시 성능적인 문제와 더 나아가서 SQL 작성시 코드의 가독성을 높여 쿼리를 쉽게 파악하여 협업 능력을 높이고 문제 발생시 즉각 대응할 수 있도록 하고자 합니다.

 

2. 쿼리 사용시 주의사항

본론으로 들어와 쿼리를 사용할 때 기초적이고 간단한 주의사항에 대해 말하고자 합니다.

2.1 서브쿼리

서브쿼리는 쿼리안에 쿼리를 작성하여 좀 더 다양하고 유연한 쿼리를 만드는데 도움이 됩니다. 하지만 서브쿼리의 부분별한 사용은 데이터베이스에 성능이슈를 발생시킬 가능성이 매우 높습니다. 특히나 select 안에 서브쿼리가 존재할 경우 각별히 주의해야 합니다.

select colum1,colum2,colum3,(select colum1 from dual)
from dual;

다음과 같이 select에 서브쿼리가 존재할 때 출력되는 행의 갯수만큼 select 서브쿼리가 반복이 됩니다. 만약 행이 상당히 많다면 불필요한 지연시간과 메모리 점유가 발생할 수 있기 때문에 주의해야 합니다.

10000개의 데이터가 출력된다고 가정하면 서브쿼리가 무려 10000번이 실행될 것 입니다.

따라서 서브쿼리를 사용할 때 데이터의 양과 메모리를 먼저 고려하여 쿼리를 통해 출력하고자 하는 결과 행이 얼마나 되는지 어느정도 파악하고 사용할 필요가 있습니다.

2.2 window 함수

윈도우 함수는 데이터 집합 내에서 행에 대해 계산을 수행하고 결과를 반환하는 함수로 행과 행간의 관계를 고려하여 계산할 수 있습니다. window함수를 사용하면 코드의 가독성을 높일 수 있고 사용이 편리하여 원하는 결과를 만들어 낼 수 있지만 데이터 집합의 모든 행에 대해 계산을 수행해야 하므로 큰 데이터 집합에서 사용할 경우 성능 문제가 발생할 수 있습니다.

대표적인 window 함수로는 MYSQL 기준 RANK(), ROW_NUMBER(), DENSE_RANK() 등이 존재하고 집계함수인 SUM(), AVG()에 OVER()를 사용하여 특정 행을 기준으로 사용할 수 있습니다. 이러한 window함수를 사용할 때는 데이터의 크기와 성능 이슈에 대해 주의 깊게 살펴봐야 합니다.

 

2.3 가독성

쿼리 문법의 가독성은 협업과 이슈 발생시 즉각 대응할 수 있도록 합니다. 따라서 쿼리 작성시 팀 혹은 흔히 알려진 방식으로 쿼리의 가독성을 높이는 것도 주의할 부분 중 하나입니다.

아래의 쿼리 작성 방식과 같이 조직이나 팀 내에서 정해진 양식이 있다면 따라 주시면되고 그렇지 않다면 아래의 방식처럼 사용하는 것을 권장합니다.

select col1, col2
  from dual
 where col1 = ...
  left join dual2 on ....
  left join (
       select col3, col4
         from dual3
        where col3 = ...
	)
 group by ...
having .....
 order by ...

위 코드 처럼 select 과 from 절을 구분하되 select의 문자 끝에 맞춰 정렬한다면 추후 코드를 분석시 한눈에 파악할 수 있을 것입니다. 

 

그럼 다음시간에 만나요, 베빠~~~

'Database' 카테고리의 다른 글

Airflow Executor  (0) 2023.05.23
Airflow Operator와 Task  (0) 2023.05.19
Apache Superset & 설치  (0) 2023.05.15
Airflow 란?  (0) 2023.05.15
Hadoop이란?  (0) 2023.03.06

댓글