DB

[SQL] MySql에서 함수를 사용하는것과 사용하지 않는것에 대한 속도 차이

somuxsomu 2024. 1. 7. 15:33

MYSQL 쿼리 속도 차이

함수를 사용하는것과 사용하지 않는것에 대한 속도 차이

 

오늘은 MySql 쿼리 속도에 대해서 정리를 해보려고 한다.

함수를 사용하는것과 사용하지 않는것에 대해서 속도 차이가 있다고하여

직접 테스트를 진행 해보았다 !

 

 

 

 

회사에서 진행하는 프로젝트 테이블 중 코드를 관리하리 테이블이 있는데,

이 테이블은 유지보수를 용이하게 하기 위해

 

즉, 하드코딩을 하지 않기 위해 사용되는 테이블이다.

 

 

 

코드값과 코드명 등 저장하는 테이블을

아래 표에 정리해 보았다.

GROUP_CODE CODE CODE_NAME
STATUS ## 상태
STATUS READY 준비
STATUS COMPLETE 완료
STATUS CANCEL 취소

 

 

코드값(CODE)                         코드이름(CODE_NAME)

코드이름(CODE_NAME)    코드값(GROUP_CODE)

 

 

변환이 필요할 때

JSP단, JAVA단, 쿼리(SQL mapper)단 에서 이를 변환해줄 수 있다.

 

 

그 중 

쿼리(SQL mapper)에서 변환 작업 할 때,

속도에 대한 이야기가 나온적이 있었고,

궁금해서 속도 테스트와 이유를 알아보았다.

 

 

반복적인 동작을 사용할 때 편리하게 사용하기 위해서

'함수(Function)' 을 사용을 하는데,

CODE를 변환 처리 해주는,

회사에서 만든 SQL함수가 있다.

 

 

개발 당시 주로 저 함수를 이용해서 쿼리를 작성하였는데,

이 함수를 사용하는 쿼리문의 테이블 데이터 양이 많아지는 경우에는 

속도 저하의 우려가 있다고 해서

 

 

직접 테스트를 해보았다 !

 


 

해당 코드의 함수 명은 F_CODE_NM 이라고 칭한다.

 

 

🔸 예시

1-1. SELECT절에 F_CODE_NM 사용

1-2. FROM절에 서브쿼리를 사용하여, FROM절 밖 SELECT문에서 F_CODE_NM 사용

2. 함수를 사용하지 않고, SELECT절에서 SELECT 서브쿼리 사용 

 

🔸 결과

데이터가 1만건일때 ,

1-1. 쿼리 속도 : 7.218초

1-2. 쿼리 속도 : 7.390초

2. 쿼리속도 : 0.641초

 

데이터가  2만건일때,

1-1. 쿼리 속도 : 10.532초

1-2. 쿼리 속도 : 14.266초

2. 쿼리속도 : 1.204초

 


 

함수를 사용하면,

함수를 호출할 때 매번 데이터베이스에 연결을 하고 쿼리를 실행해야하는데

데이터 양이 많아질수록 속도가 느려질 수 있다.

 

반면에,

SELECT절에 SELECT조회를 하면,

데이터베이스에 연결을 1번만 하고

따로 불필요한 작업이 없기 때문에 속도 영향을 덜 받는다.

 

 

즉,

데이터 양이 많아지면 많아질수록 함수를 사용해서 조회하는것보다

SELECT절에 SELECT조회 하는것이 속도가 더 빠르다. 

 

 

또한,

함수를 사용하면 매번 새로운 함수를 호출하므로

함수 호출에 따른 오버헤드가 발생 할 수 있다.

 

따라서

함수를 사용하기 전에는 해당 함수가 필요한지

그리고 데이터베이스 연산과 데이터 처리에 얼마나 많은 시간이 소요되는지를 고려해서

SQL문을 작성하는것이 좋다.

 

그리고

함수 내부코드를 최적화하고 인덱스를 적절하게 사용하는 방법으로

성능을 개선 할 수 있다.

 

그리고

FROM절 서브쿼리를 사용하여 함수를 호출하는 경우,

서브쿼리의 결과가 캐시되어 메모리에 저장되므로 처리 속도가 조금 더 빠르다.

 

하지만, 서브쿼리에서 반환하는 데이터 양에 따라 성능차이가 발생 할 수 있다.

따라서 쿼리의 구조와 실행 계획에 따라 어떤 방법이 더 효율적인지 평가하여 최적의 방법을 선택해야한다.

 

하지만, SELECT절 조회와 FORM절 조회는 성능적으로 큰 차이는 없지만

몇몇 경우에는 FROM절 서브쿼리가 더 효율적일 수도 있다.

 

FROM절 서브쿼리를 사용하는 경우에는

서브쿼리에서 필요한 데이터만 가져와서 메인 쿼리와 결합하기 때문에

전체적인 데이터 양이 줄어들 수 있다.

 

또한, 서브쿼리에서 필요한 데이터를 먼저 처리해서

임시 테이블에 저장해 두기 때문에

메인 쿼리에서는 처리할 데이터가 줄어들어 성능을 개선할 수 있다. 

 

일반적으로 간단한 함수 호출, JOIN과 같은 쿼리는 성능 차이가 미미하다.

 

 

쿼리를 작성할 때

성능적인 측면가독성 등 다양한 측명을 고려해서 작성하는것이 좋다 !