복붙노트

[SQL] 포스트 그레스에서 5 분 잘라 내기 타임 스탬프 가장 빠른 방법은 무엇입니까?

SQL

포스트 그레스에서 5 분 잘라 내기 타임 스탬프 가장 빠른 방법은 무엇입니까?

포스트 그레스 수 라운드 (자르는)이 마찬가지로 date_trunc 함수를 사용하여 타임 스탬프 :

date_trunc('hour', val)
date_trunc('minute', val)

나는 가장 가까운 5 분 경계 그래서, 예를 들어, 14시 26분 57초이 14시 25분 0초됩니다에 타임 스탬프를 절단 할 수있는 방법을 찾고 있어요. 그것을 할 수있는 간단한 방법은 다음과 같이이다 :

date_trunc('hour', val) + date_part('minute', val)::int / 5 * interval '5 min'

이 쿼리의 성능이 중요한 부분이기 때문에, 나는 이것이 가장 빠른 솔루션인지 궁금하네요, 또는 내가 간과 한 것을 (포스트 그레스 8.1+와 호환) 일부 바로 가기가 있는지 여부.

해결법

  1. ==============================

    1.나는 어떤 빠른 방법이라고 생각하지 않습니다.

    나는 어떤 빠른 방법이라고 생각하지 않습니다.

    그리고 난 당신이 표현의 성능에 대해 걱정한다고 생각하지 않습니다.

    당신의 실행에 관여하는 다른 모든 (SELECT, UPDATE는 ...) 문은 날짜 / 시간 계산보다 (예를 들어, I / O가 행을 검색하는) 대부분의 아마 훨씬 더 비싸다.

  2. ==============================

    2.나는 같은 일을 궁금 해서요. 나는이 일을 두 가지 다른 방법을 찾았지만, 당신이 제안 하나 더 빨랐다.

    나는 같은 일을 궁금 해서요. 나는이 일을 두 가지 다른 방법을 찾았지만, 당신이 제안 하나 더 빨랐다.

    나는 비공식적으로 우리의 큰 테이블 중 하나에 대해 벤치마킹. 나는 처음 4 백만 행에 쿼리를 제한했다. 나는 때문에 DB 캐싱에 하나 불공정 한 이점을 제공하는 것을 방지하기 위해 두 개의 쿼리를 번갈아.

    SELECT to_timestamp(
        floor(EXTRACT(epoch FROM ht.time) / EXTRACT(epoch FROM interval '5 min'))
        * EXTRACT(epoch FROM interval '5 min')
    ) FROM huge_table AS ht LIMIT 4000000
    

    (당신이 인식하지 못하는 데이터 형식 시간대를 사용하는 경우이 timestamptzeven 생산하고 있습니다)

    결과

    SELECT 
        date_trunc('hour', ht.time) 
        + date_part('minute', ht.time)::int / 5 * interval '5 min'
    FROM huge_table AS ht LIMIT 4000000
    

    결과

    체계

    버전이 더 빠른 것 같다. 하지만 내 특정 유스 케이스에 대한 빠른 충분하지 않습니다. 시간을 지정하지 않아도의 장점은 더 다양한 신기원 버전을 만들고 클라이언트 측 코드에서 간단하게 파라미터를 생성합니다. 그것은 date_trunc 시간 단위 인수까지 범프하지 않고 2 개 시간의 간격뿐만 아니라 단지로 5 분 간격으로 처리한다. 끝면 메모에서, 나는이 시간 단위 인수 대신 시간 간격 인수로 변경 바랍니다.

  3. ==============================

    3.궁금 사람들을 위해 전체 쿼리 (@DNS 질문에 따라) :

    궁금 사람들을 위해 전체 쿼리 (@DNS 질문에 따라) :

    당신이 주문을하고 5 분 및 shop_id의 조각으로 그들을 계산하려면 가정 :

    SELECT date_trunc('hour', created_at) + date_part('minute', created_at)::int / 5 * interval '5 min' AS minute
          , shop_id, count(id) as orders_count
    FROM orders
    GROUP BY 1, shop_id
    ORDER BY 1 ASC
    
  4. from https://stackoverflow.com/questions/7299342/what-is-the-fastest-way-to-truncate-timestamps-to-5-minutes-in-postgres by cc-by-sa and MIT license