LLM WikiAccess-protected knowledge portal

WIKI

Apache Doris 4.1: 벡터·전문 검색·분석을 하나의 SQL 엔진으로 통합한 HSAP와 IVF 인덱스 확장

왜 지금 봐야 하나 Apache Doris 4.1.0은 2026년 4월 21일에 공개됐고, 버그픽스 릴리스 4.1.1이 2026년 5월 24일에 뒤따랐다. 이번 릴리스가 주목받는 이유는 세 가지다. 첫째, IVF와 IVF ON DISK 벡터 인덱스가 추가됐다. 4.0에서 HNSW로 시작한 벡터 검색이 4.1에서 수십억 건~조 건 규모까지 확장됐다. IVF ON DISK는 Microsoft SPANN 논문의 아이디어를 구현해 디

경로human/study/content/database-frontier/34-apache-doris-4-1-hsap-vector-hybrid-search.md
카테고리Study
태그#doris #hsap #hybrid #mysql #search #study #vector

왜 지금 봐야 하나

Apache Doris 4.1.0은 2026년 4월 21일에 공개됐고, 버그픽스 릴리스 4.1.1이 2026년 5월 24일에 뒤따랐다. 이번 릴리스가 주목받는 이유는 세 가지다.

첫째, IVF와 IVF_ON_DISK 벡터 인덱스가 추가됐다. 4.0에서 HNSW로 시작한 벡터 검색이 4.1에서 수십억 건~조 건 규모까지 확장됐다. IVF_ON_DISK는 Microsoft SPANN 논문의 아이디어를 구현해 디스크와 메모리를 조합함으로써 비용 부담 없이 극대 규모 벡터를 다룬다.

둘째, Segment V3 스토리지 포맷이 초광폭 테이블의 병목을 해소했다. 메타데이터를 footer에서 분리해 on-demand 로드를 지원하면서, V2 대비 파일 열기 속도 16배·메모리 사용 60배 절감을 달성한다. 수만 컬럼의 JSON 로그·이벤트 테이블을 운영하는 팀에게 직접적인 의미가 있다.

셋째, Iceberg V2/V3 완전 쓰기 지원(MERGE INTO 포함)과 Paimon DDL 지원이 Lakehouse 운영 경계를 실질적으로 넓혔다. 이전에는 Doris가 외부 테이블을 읽기만 했다면, 4.1부터는 Iceberg에 대한 UPDATE·DELETE·MERGE INTO가 가능하다.

Doris를 이미 운영 중이거나, AI/Search 워크로드와 OLAP을 한 엔진에서 처리하는 방안을 검토 중인 팀이라면 이 세 가지가 설계 결정에 직접 영향을 준다.


Apache Doris 4.1 핵심 변화 요약

영역4.0까지4.1에서 달라진 점운영자가 받는 영향
벡터 인덱스HNSW만 지원IVF + IVF_ON_DISK 추가억/조 규모 벡터를 저비용으로 운영 가능
스토리지 포맷Segment V2Segment V3 (메타 분리)초광폭 테이블 열기 속도·메모리 대폭 개선
JSON 처리즉시 shreddingDOC 모드 (deferred shredding)쓰기 부하 분산, V3과 함께 사용
Lakehouse 쓰기Iceberg 읽기 중심Iceberg V2/V3 MERGE INTO 지원Doris에서 직접 Iceberg 레코드 병합
Paimon 지원읽기 전용 커넥터DDL(CREATE TABLE 등) 직접 실행Paimon 테이블을 Doris SQL로 관리
SQL 기능기본 DMLASOF JOIN, Recursive CTE, UNNEST, MERGE INTO, TIMESTAMPTZ시계열 조인·트리 쿼리·Upsert 패턴
JSON 크기수 MB 수준100MB+ 초대형 JSON 지원RAG 파이프라인의 대형 문서 처리

HSAP 아키텍처: 하나의 엔진 안에서 벡터·전문·분석이 동시에

Apache Doris 4.1 HSAP: 하나의 테이블 — 세 가지 인덱스 — 하나의 SQL SQL 쿼리 단일 진입점 SELECT ..., score() AS bm25, cosine_distance(emb, ?) AS dist FROM t WHERE ... 쿼리 플래너 인덱스 유형 감지 → 실행 계획 생성 전문(Full-Text) 검색 역 인덱스 (Inverted Index) MATCH_* 연산자 / score() BM25 스코어링 (스토리지 레이어 TopN) ES 호환 구문 / NESTED JSON 지원 벡터 검색 (ANN) HNSW (4.0~) · IVF · IVF_ON_DISK (4.1 신규) cosine_distance / l2_distance / dot_product IVF: nprobe로 recall·latency 조정 IVF_ON_DISK: SPANN 방식 디스크 티어링 구조화 분석 컬럼형 스토리지 / 집계 연산 ASOF JOIN (시계열 조인) Recursive CTE / UNNEST MERGE INTO (Upsert) 결과 병합 (RBO/CBO 계획) BM25 score · ANN distance · 집계값을 단일 결과셋으로 통합 Segment V3 스토리지 (4.1 신규) 메타데이터 footer 분리 → on-demand 로드 파일 열기 16× 빠름 / 메모리 60× 절감 (초광폭 테이블) DOC 모드: JSON 쓰기 → compaction 때 shredding storage_format="V3"와 함께 사용 / sparse 모드와 배타적 Lance / Vortex 포맷에서 영감 메타데이터 bloat · 느린 파일 열기 · 랜덤 읽기 오버헤드 해소
Apache Doris 4.1 HSAP 아키텍처: 벡터·전문 검색·구조화 분석의 통합

1. 벡터 인덱스 삼총사: HNSW · IVF · IVF_ON_DISK

Doris 4.0에서 HNSW로 벡터 검색이 시작됐고, 4.1에서 IVF와 IVF_ON_DISK가 추가되면서 선택지가 세 가지가 됐다.

HNSW — 고품질 근사 검색의 기본

HNSW(Hierarchical Navigable Small World)는 다층 그래프 구조다. 상위 레이어에서 빠르게 후보를 좁히고, 하위 레이어에서 세밀하게 탐색한다. 주요 특성:

IVF — 클러스터링으로 탐색 공간을 줄이는 대규모 인덱스

IVF(Inverted File Index)의 핵심 원리는 "먼저 군집화하고, 그다음 국소 탐색"이다. k-means로 벡터를 클러스터로 나눈 뒤, 쿼리 시 가장 가까운 클러스터만 탐색한다.

-- IVF 인덱스 생성 예시
CREATE TABLE t_search (
    id BIGINT,
    content TEXT,
    emb ARRAY<FLOAT>
    INDEX idx_emb(emb) USING VECTOR PROPERTIES (
        "type" = "IVF",
        "metric" = "cosine",
        "nlist" = "1024"    -- 클러스터 수
    )
) ...;

-- 쿼리 시 recall·latency 조정
SET enable_vector_index = true;
SET nprobe = 64;            -- 탐색할 클러스터 수 (높을수록 recall↑, latency↑)

IVF_ON_DISK — 조 단위 규모의 저비용 벡터 검색

IVF_ON_DISK는 Microsoft의 SPANN 논문을 참고한 구현이다. 인덱스 일부를 메모리에, 나머지를 로컬 파일시스템에 두고 조합한다.

세 인덱스 선택 기준

기준HNSWIVFIVF_ON_DISK
적합 규모~수천만~수억수억~조
메모리 요구높음 (전체 인덱스)중간낮음 (파일 캐시)
recall 품질높음중간 (nprobe로 조정)중간~낮음 (디스크 캐시 의존)
인덱스 구성 속도느림빠름빠름
쿼리 latency낮음중간디스크 I/O 의존

2. 하이브리드 검색: 역 인덱스를 먼저 태운 다음 ANN으로 좁힌다

Doris 4.1의 하이브리드 검색 전략은 업계에서 흔히 쓰는 순서와 반대다.

일반적인 순서: ANN으로 top-K 후보를 뽑고 → 필터 적용

Doris의 순서: 역 인덱스로 조건을 먼저 걸러내고 → 생존한 행셋에만 ANN top-N 적용

이 순서의 장점은 필터가 선택적일수록 recall이 높아진다는 것이다. 필터가 데이터의 1%만 남기면 ANN이 탐색해야 하는 공간이 1%로 줄어든다. 반대로 ANN 먼저 하면 필터링 전 전체 데이터에서 approximate를 수행하므로 후속 필터에서 진짜 관련 결과가 잘려 나갈 수 있다.

-- 하이브리드 검색 예시: 최근 7일 데이터 중 "결제 오류"와 의미적으로 가까운 로그
SELECT
    id,
    content,
    score() AS bm25_score,
    cosine_distance(emb, [0.1, 0.2, ...]) AS vec_dist
FROM log_table
WHERE
    created_at >= NOW() - INTERVAL 7 DAY     -- 역 인덱스로 먼저 필터
    AND MATCH(content, "결제 오류")           -- BM25 전문 검색
ORDER BY vec_dist ASC                         -- ANN 정렬
LIMIT 20;

score() 함수는 BM25 relevance score를 반환하고, cosine_distance() / l2_distance() / dot_product()는 벡터 거리를 계산한다. 두 점수를 결합한 재순위화(re-ranking)는 애플리케이션 레이어에서 처리한다.

전문 검색 기능 확장 (4.1)


3. Segment V3와 DOC 모드: 초광폭 테이블의 병목 해소

수만 개 컬럼을 가진 JSON 로그 테이블을 Doris에서 운영하면 Segment V2에서 두 가지 문제가 나타난다.

  1. 파일 열기 지연: 메타데이터가 footer에 전부 들어 있어, 파일을 열 때마다 전체 메타를 읽어야 한다.
  2. 메모리 bloat: 활성 쿼리가 필요한 컬럼만 읽어도 메타데이터 메모리는 모든 컬럼에 대해 할당된다.

Segment V3는 메타데이터를 footer에서 분리해 on-demand 로드로 전환한다. 수치는 명확하다: V2 대비 파일 열기 속도 16배, 메모리 사용 60배 개선(초광폭 테이블 기준).

DOC 모드: 쓰기 부하를 compaction으로 미루는 전략

기존 방식은 JSON이 들어오면 즉시 컬럼별로 분해(shredding)했다. 컬럼 수가 많을수록 쓰기 CPU 비용이 높아진다.

DOC 모드는 이 순서를 바꾼다.

이 전략의 핵심 trade-off:

항목즉시 ShreddingDOC 모드
쓰기 CPU높음 (모든 필드 즉시 처리)낮음 (문서로만 저장)
쿼리 성능hot path 최적화 이미 완료compaction 전까지 cold path 쿼리 느림
compaction 부하낮음높음 (shredding 포함)
사용 조건범용V3와 함께만 사용 가능 / sparse 모드와 배타적

운영 원칙: 쓰기 처리량이 읽기 응답 시간보다 중요한 파이프라인, 또는 대부분의 컬럼이 거의 조회되지 않는 초광폭 테이블에 DOC 모드가 맞다.


4. Lakehouse 쓰기: Iceberg V3와 Paimon DDL 지원

Iceberg V2/V3 완전 쓰기 (MERGE INTO 포함)

4.1 이전에는 Doris가 Iceberg 테이블을 주로 읽기 위한 외부 테이블로 취급했다. 4.1부터 쓰기가 본격 지원된다.

-- Iceberg 테이블에 Upsert
MERGE INTO iceberg.my_catalog.orders AS target
USING staging_orders AS source
ON target.order_id = source.order_id
WHEN MATCHED THEN
    UPDATE SET total_amount = source.total_amount, updated_at = source.updated_at
WHEN NOT MATCHED THEN
    INSERT (order_id, customer_id, total_amount, created_at)
    VALUES (source.order_id, source.customer_id, source.total_amount, source.created_at);

Iceberg V3 신기능 지원:

Paimon DDL 직접 실행

기존에는 Paimon 테이블을 Doris에서 읽으려면 Paimon 쪽에서 테이블을 먼저 만들어야 했다. 4.1부터는 Doris SQL로 직접 생성할 수 있다.

-- Doris에서 Paimon 테이블 생성
CREATE DATABASE paimon_catalog.my_db;

CREATE TABLE paimon_catalog.my_db.events (
    event_id BIGINT,
    user_id BIGINT,
    event_type STRING,
    ts TIMESTAMPTZ,
    payload VARIANT
) USING paimon;

이 변화의 의미: Doris를 데이터 플랫폼의 단일 SQL 관리 포인트로 쓸 수 있게 됐다. 외부 시스템에서 테이블을 만들고 Doris에서 읽는 2단계 과정이 사라진다.


5. SQL 기능 확장: 시계열 조인과 Upsert 패턴

ASOF JOIN — 시계열 데이터의 "가장 가까운 시점" 조인

금융·이벤트 분석에서 자주 필요한 패턴: "이 주문이 들어온 시점의 가장 최근 환율"을 구하고 싶을 때.

-- 주문 시점 기준으로 가장 가까운 환율 적용
SELECT o.order_id, o.amount_usd, r.rate
FROM orders o
ASOF JOIN exchange_rates r
ON o.currency = r.currency
AND o.created_at >= r.rate_time
ORDER BY r.rate_time DESC;

ASOF JOIN은 >= 또는 <= 조건으로 "그 이전(이후) 시점 중 가장 가까운 행"을 찾는다. 기존에는 correlated subquery나 window function으로 구현해야 했다.

MERGE INTO — Lakehouse 내 Upsert

Iceberg 외에도 Doris 자체 테이블에서도 MERGE INTO를 쓸 수 있다. Doris가 데이터 싱크 역할을 하는 CDC 파이프라인에서 중복 처리·Upsert를 SQL로 깔끔하게 표현할 수 있다.

Recursive CTE — 트리/그래프 쿼리

카테고리 계층, 조직도, 댓글 스레드 같은 재귀적 구조를 표준 SQL로 쿼리할 수 있다.

WITH RECURSIVE category_tree AS (
    SELECT id, name, parent_id, 1 AS depth FROM categories WHERE parent_id IS NULL
    UNION ALL
    SELECT c.id, c.name, c.parent_id, t.depth + 1
    FROM categories c JOIN category_tree t ON c.parent_id = t.id
)
SELECT * FROM category_tree ORDER BY depth, name;

6. 도입 전에 해볼 검증 체크리스트

벡터 인덱스 선택 검증

Segment V3 / DOC 모드 검증

Iceberg 쓰기 / MERGE INTO 검증


이 릴리스에서 특히 조심할 한계

Apache Doris 4.1의 핵심은 "새 기능을 많이 추가했다"보다, AI·Search 워크로드와 OLAP 분석을 동일한 데이터 레이어에서 다루면서 이중 적재와 동기화 비용을 없앤다는 방향이다. 벡터 인덱스 선택, 스토리지 포맷 전환, Lakehouse 쓰기 활성화 — 세 축 각각에 운영 판단이 따른다.

References