Dev/DB

PostgreSQL pg_sleep() 이란?

두넌 2024. 3. 9.

pg_sleep()

PostgreSQL 에서는 pg_sleep() 을 사용하여 지정된 시간(초) 동안 실행을 지연시킬 수 있음

  • 지정된 시간(초) 가 경과할 때까지 해당 세션의 프로세스를 절전 모드로 만듦
  • MySQL 에서의 sleep() 과 유사하게 작동
  • 소수점 초 단위 지연을 지정할 수도 있음

문법

select pg_sleep(seconds)
  • seconds 에는 프로세스가 진행되기 전 반드시 경과해야 하는 시간(초)를 지정할 수 있다
  • 소수점 단위로도 가능하며 double precision 값이다

예시

SELECT 
  clock_timestamp(),
  pg_sleep(1),
  clock_timestamp(),
  pg_sleep(1),
  clock_timestamp();

clock_timestamp() 의 실행 사이 사이에 약 1초정도의 지연이 존재하는 것을 볼 수 있다

 

SELECT pg_sleep_for('1 seconds');
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00')

찾아보면 이런 것도 가능하다!

 

응용

    public void callPgSleep(Double interval) {
        Query query = entityManager.createNativeQuery("SELECT pg_sleep(?)")
                .setParameter(1, interval);
        query.getResultList();
    }
   @GET
    public Response callSleep(@QueryParam("interval") @DefaultValue("10") Double interval) {
        sleepService.callPgSleep(interval);
        return Response.noContent().build();
    }

해당 쿼리를 실행하기 위해서 Native Query를 생성하고, 이를 실행해 주었다

인자로 interval 을 Double 형태로 받고, 해당 경로로 오는 요청에 대하여 pg_sleep 을 호출하는 코드를 작성해 보았다

 

요청

GET http://localhost:7020/api/sleep?interval=5

응답

HTTP/1.1 204 No Content

<Response body is empty>Response code: 204 (No Content); Time: 5013ms (5 s 13 ms); Content length: 0 bytes (0 B)

 

정확히 5초는 아니지만, 살짝 지연된 시간 이후 응답을 받을 수 있었다

실제 postgresql 의 공식 docs 에서도 서버 부하 요인에 따라 더 길어질 수 있다 라고 언급되어 있고,

"지정한 시간에 정확히 깨어난다는 보장은 없지만, 더 일찍 깨어나지는 않는다" 라고 나와 있다

 

 

Reference

https://www.postgresql.org/docs/16/functions-datetime.html#FUNCTIONS-DATETIME-DELAY

https://database.guide/how-pg_sleep-works-in-postgresql/

 

댓글