범위 인덱스
범위 인덱스 (Range Index)
Apache Pinot용 range index 구성에 대해 설명해요.
출처: 문서
본문
Range indexing을 사용하면 어떤 범위에 걸쳐 필터링하는 쿼리에서 더 나은 성능을 얻을 수 있어요.
언제 사용할까
쿼리가 >, <, >=, <=, BETWEEN 같은 범위 조건자로 컬럼을 필터링할 때 range index 를 사용하세요. 특히 inverted index가 너무 커질 높은 카디널리티의 메트릭 컬럼에서 효과적이에요.
좋은 규칙은 매우 많은 고유 값을 가진 메트릭 컬럼에 범위 조건자를 적용하려 할 때 range index를 사용하는 거예요. 그런 컬럼에 inverted index를 사용하면 저장 공간과 성능 면에서 비효율적인 매우 큰 인덱스가 만들어져요.
동작 방식
Range index는 inverted index의 변형이에요. 개별 값을 문서 ID로 매핑하는 대신 값의 범위를 문서 ID로 매핑해요. 쿼리 시점에 Pinot는 range index를 사용해 컬럼 값이 요청된 범위 안에 속하는 문서 집합을 빠르게 식별해요.
지원 컬럼 유형
Range index는 다음에서 지원돼요.
- MAP을 제외한 모든 데이터 유형의 dictionary-enable 컬럼 (INT, LONG, FLOAT, DOUBLE, STRING, BIG_DECIMAL, BYTES, BOOLEAN, TIMESTAMP). 사전은 dictionary-encoded forward index 또는 standalone dictionary를 가진 RAW forward index와 함께 사용할 수 있어요.
- 숫자 유형(INT, LONG, FLOAT, DOUBLE, BIG_DECIMAL)의 dictionary가 없는 raw-encoded 컬럼.
Range index는 사전식 순서(lexicographical order)에 있는 datetime 형식만 Pinot가 지원하므로
STRING유형의 dictionary-encoded 시간 컬럼에도 사용할 수 있어요.
구성
Range index를 활성화하는 권장 방법은 table configuration의 fieldConfigList를 통한 방식이에요.
{
"fieldConfigList": [
{
"name": "hits",
"indexes": {
"range": {}
}
}
]
}
range index 버전(기본값 2)을 지정할 수도 있어요.
{
"fieldConfigList": [
{
"name": "hits",
"indexes": {
"range": {
"version": 2
}
}
}
]
}
컬럼이 RAW forward index를 유지하면서 range index를 위한 dictionary도 필요한 경우 standalone dictionary를 명시적으로 구성하고 range index 버전 2를 사용하세요.
{
"fieldConfigList": [
{
"name": "eventDate",
"encodingType": "RAW",
"indexes": {
"dictionary": {},
"range": {
"version": 2
}
}
}
]
}
range index 버전 1은 RAW forward index + dictionary 조합에선 거부돼요. 버전 1은 raw forward 값을 dictionary-ID 평가기와 비교하는 스캔으로 폴백할 수 있기 때문이에요. 버전 2는 BitSliced range index를 사용하며 RAW + dictionary의 필수 형태예요.
이전 구성
이전 방식은 tableIndexConfig에서 rangeIndexColumns를 사용해요.
{
"tableIndexConfig": {
"rangeIndexColumns": [
"hits"
]
}
}
쿼리 예시
SELECT COUNT(*)
FROM baseballStats
WHERE hits > 11
SELECT playerName, hits
FROM baseballStats
WHERE hits BETWEEN 50 AND 100
ORDER BY hits DESC
LIMIT 20
SELECT teamID, AVG(hits) AS avgHits
FROM baseballStats
WHERE hits >= 10 AND hits <= 200
GROUP BY teamID
ORDER BY avgHits DESC
제한 사항
- Range index는 MAP 컬럼을 지원하지 않아요.
- 컬럼에 대한 forward index가 비활성화되면 컬럼은 single-valued여야 하고 range 쿼리가 동작하려면 range index 버전 2를 사용해야 해요.
- 숫자 RAW 컬럼은 dictionary 없이 range index를 사용할 수 있어요. 숫자가 아닌 RAW 컬럼은 dictionary가 필요하며, RAW + dictionary range index는 버전 2를 사용해야 해요.