타임스탬프 인덱스
타임스탬프 인덱스 (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 데이터 유형 컬럼에 대한 세분성을 구성할 수 있어요. 그러면:
- Pinot는 시간 세분성당 하나의 컬럼을 forward index와 range index로 사전 생성해요. 명명 규칙은
$<ts_column_name>$<ts_granularity>이며, 세분성이DAY,MONTH인 timestamp 컬럼ts는$ts$DAY와$ts$MONTH라는 두 개의 추가 컬럼을 생성해요. - 조건자 및 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)

대비:

사용 방법
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 이상이 필요해요.