타임스탬프 인덱스

타임스탬프 인덱스 (Timestamp Index)

timestamp index를 사용해 시간 쿼리를 다양한 세분성으로 가속화해요.

출처: 문서

본문

이 기능은 Pinot 0.11+부터 지원돼요.

배경

Pinot 0.8.0 릴리스에서 도입된 TIMESTAMP 데이터 유형은 값을 밀리초 epoch long 값으로 저장해요.

일반적으로 사용자는 분석 쿼리에 이렇게 낮은 수준의 세분성은 필요로 하지 않아요. 데이터 스캔과 시간 값 변환은 빅데이터에서 비용이 많이 들 수 있어요.

timestamp 컬럼의 일반적인 쿼리 패턴은 시간 범위로 필터링한 다음 서로 다른 시간 세분성(일/월 등)으로 그룹화하는 것이에요.

일반적으로 이렇게 하려면 쿼리 실행기가 값을 추출하고 변환 함수를 적용한 다음 필터/groupBy를 수행해야 하며, dictionary나 인덱스를 활용하지 못해요.

이것이 Pinot timestamp index의 영감이 됐으며, TIMESTAMP 컬럼에 대한 범위 쿼리와 group by 쿼리의 성능을 개선하는 데 사용돼요.

지원 데이터 유형

TIMESTAMP 인덱스는 TIMESTAMP 컬럼이나 밀리초 epoch 값을 저장하는 LONG 컬럼에서만 생성할 수 있어요.

Timestamp Index

TIMESTAMP 데이터 유형 컬럼에 대한 세분성을 구성할 수 있어요. 그러면:

  1. Pinot는 시간 세분성당 하나의 컬럼을 forward index와 range index로 사전 생성해요. 명명 규칙은 $<ts_column_name>$<ts_granularity>이며, 세분성이 DAY, MONTH인 timestamp 컬럼 ts는 $ts$DAY와 $ts$MONTH라는 두 개의 추가 컬럼을 생성해요.
  2. 조건자 및 selection/group by에 대한 쿼리 재작성: 2.1 GROUP BY: dateTrunc('DAY', ts) 같은 함수는 하부 컬럼 $ts$DAY를 사용해 데이터를 가져오도록 변환돼요. 2.2 PREDICATE: 모든 세분성 컬럼에 range index가 자동 구축돼요.

쿼리 사용 예시:

select count(*), 
       datetrunc('WEEK', ts) as tsWeek 
from airlineStats 
WHERE datetrunc('WEEK', ts) > fromDateTime('2014-01-16', 'yyyy-MM-dd') 
group by tsWeek
limit 10

몇몇 예비 벤치마크는 timestamp index와 다음 같은 쿼리를 사용해 27억 레코드 전체의 쿼리 성능이 45초에서 4.2초로 개선됐음을 보여줘요.

select dateTrunc('YEAR', event_time) as y, 
       dateTrunc('MONTH', event_time) as m,  
       sum(pull_request_commits) 
from githubEvents 
group by y, m
limit 1000
Option(timeoutMs=3000000)

Without Timestamp Index

대비:

With Timestamp Index

사용 방법

timestamp index는 테이블 구성의 fieldConfigList 섹션 안에서 컬럼별로 구성돼요.

timestampConfig 필드를 지정하세요. 이 객체는 granularities라는 필드를 반드시 포함해야 하며, 이는 다음 값 중 하나 이상을 가진 배열이에요.

  • MILLISECOND
  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • MONTH
  • QUARTER
  • YEAR

샘플 구성:

{
  "fieldConfigList": [
    {
      "name": "ts",
      "timestampConfig": {
        "granularities": [
          "DAY",
          "WEEK",
          "MONTH"
        ]
      }
    }
    ...
  ]
  ...
}

제한 사항

  • TIMESTAMP 데이터 유형이거나 밀리초 epoch 값을 저장하는 LONG 데이터 유형의 컬럼에서만 지원돼요.
  • 세분성당 추가 컬럼 하나를 사전 생성하므로 저장 공간이 늘어나요. 실제로 쿼리하는 세분성만 선택하세요.
  • 자동 재작성은 조건자와 group-by 절의 dateTrunc 함수 호출에만 적용돼요. 다른 시간 함수는 재작성되지 않아요.
  • Pinot 0.11 이상이 필요해요.

더 알아보기 (Learn more)