본문 바로가기
DataBase

[MySQL] 처리 대기(SLEEP)와 벤치마크(BENCHMARK)

by bkuk 2023. 4. 11.

SLEEP(): 일부로 쿼리의 실행을 멈추는 함수

SLEEP() 함수는 프로그래밍 언어나 쉡 스크립트 언에서 제공하는 sleep 기능을 수행한다. SQL의 개발이나 디버깅 용도로 잠깐 대기하거나 일부로 쿼리의 실행을 오랜시간 유지하고자 할 때 상당히 유용한 함수이다.
해당 함수는 대기할 시간을 초 단위로 인자를 받으며, 특별히 어떠한 처리를 하거나 반환 값을 넘겨주지 않는다. 단지 지정한 시간만큼 대기할뿐이다.

SELECT SLEEP(1.5)
	FROM {테이블명}

 
추가적으로, 레코드이 건수만큼 SLEEP() 함수를 호출하기 때문에 조회되는 레코드가 총 10건이라고 하면, 결국 전체적으로 15초 동안 쿼리를 실행하는 셈이 된다.
 

BENCHMARK(): 간단한 함수의 성능 테스트를 하는 함수

디버깅이나 간단한 함수의 성능 테스트용으로 아주 유용한 함수이다. 해당 함수는 2개의 인자를 필요로 한다. 첫 번째 인자는 반복해서 수행할 횟수이며, 두 번째 인자로는 반복해서 실행할 표현식을 입력하면 된다.
SELECT 쿼리를 BENCHMARK() 함수에 사용하는 것도 가능하지만, 반드시 스칼라값(하나의 컬럼을 가진 하나의 레코드)을 반환하는 SELECT 쿼리만 사용할 수 있다.
BENCHMARK() 함수의 반환 값은 중요하지 않으며, 단지 지정한 횟수만큼 반복 실행하는데 얼마나 시간이 소요됐는지 중요할 뿐이다.
 

SELECT BENCHMARK( 1000000, (SELECT COUNT(*) FROM 테이블));

 
위처럼 SQL 문장이나 표현식의 성능을 BENCHMARK() 함수로 확인할 때는 주의할 사항이 있다. 
 

BENCHMARK()는 상대적으로 비교하는 용도로만 사용하자.

SELECT BENCHMARK( 10, expr))과 SELECT expr을 10번 직접 실행하는 것과는 차이가 있다는 것이다. 후자의 쿼리를 10번 실행하는 경우에는 매번 쿼리의 파싱이나 최적화, 테이블 잠금이나 네트워크 비용이 소요된다. 하지만 전자의 쿼리를 실행하는 경우에는 벤치마크 횟수에 관계없이 단 1번의 네트워크, 쿼리 파싱 및 최적화 비용이 소모된다는 점을 고려해야 한다.
또한, 전자의 쿼리를 사용하면 한번의 요청으로 expr 표현식이 10번 실행되는 것이므로 이미 할당받은 메모리 자원까지 공유되고, 메모리 할당도 후자의 쿼리 대비 1/10 밖에 일어나지 않는다.
따라서, BENCHMARK() 함수로 얻은 쿼리나 함수의 성능은 그 자체로는 큰 의미는 없으며, 두 개의 동일 기능을 상대적으로 비교 분석하는 용도로 사용할 것을 권장한다.
 
 
참고: Real MySQL 8.0

댓글