메인 콘텐츠로 건너뛰기
데이터를 RAM에 버퍼링한 뒤, 주기적으로 다른 테이블로 플러시합니다. 읽기 작업 중에는 버퍼와 다른 테이블에서 데이터를 동시에 읽습니다.
Buffer 테이블 엔진의 권장되는 대안은 비동기 삽입(asynchronous inserts)을 활성화하는 것입니다.
Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes [,flush_time [,flush_rows [,flush_bytes]]])

엔진 매개변수

database

database – 데이터베이스 이름입니다. currentDatabase() 또는 문자열을 반환하는 다른 상수 표현식을 사용할 수 있습니다.

table

table – 데이터를 플러시할 대상 테이블입니다.

num_layers

num_layers – 병렬 처리 계층입니다. 물리적으로 테이블(table)은 서로 독립적인 num_layers개의 버퍼로 구성됩니다.

min_time, max_time, min_rows, max_rows, min_bytes, and max_bytes

버퍼의 데이터를 플러시하는 조건입니다.

선택적 엔진 매개변수

flush_time, flush_rows, and flush_bytes

백그라운드에서 버퍼의 데이터를 플러시하기 위한 조건입니다(flush* 매개변수가 생략되었거나 0이면 flush* 매개변수를 사용하지 않음을 의미합니다). 모든 min* 조건이 충족되거나 max* 조건 중 하나 이상이 충족되면, 데이터가 버퍼에서 플러시되어 대상 테이블(destination table)에 기록됩니다. 또한 flush* 조건 중 하나 이상이 충족되면 백그라운드에서 플러시가 시작됩니다. 이는 max*와 다릅니다. flush*를 사용하면 Buffer 테이블에 대한 INSERT 쿼리에 지연 시간이 추가되지 않도록 백그라운드 플러시를 별도로 구성할 수 있습니다.

min_time, max_time, and flush_time

버퍼에 처음 기록한 시점부터 경과한 시간을 초 단위로 지정하는 조건입니다.

min_rows, max_rows, and flush_rows

버퍼의 행 수에 관한 조건입니다.

min_bytes, max_bytes, and flush_bytes

버퍼의 바이트 수에 대한 조건입니다. 쓰기 작업 중에는 데이터가 하나 이상의 임의 버퍼(num_layers로 구성)에 삽입됩니다. 또는 삽입할 데이터 파트가 충분히 큰 경우(max_rows 또는 max_bytes보다 큰 경우)에는 버퍼를 거치지 않고 대상 테이블에 직접 기록됩니다. 데이터를 플러시하는 조건은 각 num_layers 버퍼에 대해 별도로 계산됩니다. 예를 들어 num_layers = 16이고 max_bytes = 100000000이면 최대 RAM 사용량은 1.6 GB입니다. 예시:
CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 1, 10, 100, 10000, 1000000, 10000000, 100000000)
merge.hits와 동일한 구조를 가지며 Buffer 엔진을 사용하는 merge.hits_buffer 테이블을 생성합니다. 이 테이블에 데이터를 쓸 때는 RAM에 버퍼링되었다가 나중에 merge.hits 테이블에 기록됩니다. 단일 버퍼가 생성되며, 다음 조건 중 하나라도 충족되면 데이터가 플러시됩니다.
  • 마지막 플러시 이후 100초가 지났거나 (max_time)
  • 100만 행이 기록되었거나 (max_rows)
  • 100 MB의 데이터가 기록되었거나 (max_bytes)
  • 10초가 지났고 (min_time) 10,000행 (min_rows) 및 10 MB (min_bytes)의 데이터가 기록되었을 때
예를 들어, 단 1개의 행만 기록되었다면 100초 후에는 무조건 플러시됩니다. 반면 많은 행이 기록되었다면 데이터는 더 빨리 플러시됩니다. 서버가 중지될 때, 또는 DROP TABLE이나 DETACH TABLE을 수행할 때도 버퍼링된 데이터는 대상 테이블로 플러시됩니다. 데이터베이스와 테이블 이름에는 작은따옴표로 묶인 빈 문자열을 설정할 수 있습니다. 이는 대상 테이블이 없음을 의미합니다. 이 경우 데이터 플러시 조건에 도달하면 버퍼는 단순히 비워집니다. 이는 메모리에 데이터 윈도우를 유지하는 데 유용할 수 있습니다. Buffer 테이블에서 읽을 때는 버퍼와 대상 테이블(있는 경우) 모두의 데이터가 처리됩니다. Buffer 테이블은 인덱스를 지원하지 않는다는 점에 유의하십시오. 즉, 버퍼의 데이터는 전체 스캔되므로 버퍼가 크면 느릴 수 있습니다. (종속 테이블의 데이터에는 해당 테이블이 지원하는 인덱스가 사용됩니다.) Buffer 테이블의 컬럼 집합이 종속 테이블의 컬럼 집합과 일치하지 않으면, 두 테이블에 모두 존재하는 컬럼의 부분 집합만 삽입됩니다. Buffer 테이블과 종속 테이블의 컬럼 중 하나라도 타입이 일치하지 않으면 서버 로그에 오류 메시지가 기록되고, 버퍼가 비워집니다. 버퍼가 플러시될 때 종속 테이블이 존재하지 않는 경우에도 동일한 일이 발생합니다.
2021-10-26 이전 릴리스에서 Buffer 테이블에 대해 ALTER를 실행하면 Block structure mismatch 오류가 발생합니다(#15117#30565 참조). 따라서 Buffer 테이블을 삭제한 뒤 다시 생성하는 것만이 유일한 방법입니다. Buffer 테이블에서 ALTER를 실행하기 전에 사용 중인 릴리스에서 이 오류가 수정되었는지 확인하십시오.
서버가 비정상적으로 재시작되면 버퍼의 데이터는 손실됩니다. Buffer 테이블에서는 FINALSAMPLE이 올바르게 동작하지 않습니다. 이 조건들은 대상 테이블로 전달되지만 버퍼의 데이터를 처리하는 데는 사용되지 않습니다. 이러한 기능이 필요하다면, 쓰기에는 Buffer 테이블만 사용하고 읽기는 대상 테이블에서만 수행하는 것을 권장합니다. Buffer 테이블에 데이터를 추가할 때는 버퍼 중 하나가 잠깁니다. 이로 인해 테이블에서 읽기 작업이 동시에 수행되면 지연이 발생합니다. Buffer 테이블에 삽입된 데이터는 종속 테이블에 서로 다른 순서와 서로 다른 블록으로 저장될 수 있습니다. 이 때문에 Buffer 테이블은 CollapsingMergeTree에 올바르게 쓰는 용도로 사용하기 어렵습니다. 문제를 피하려면 num_layers를 1로 설정할 수 있습니다. 대상 테이블이 복제된 경우, Buffer 테이블을 통해 쓸 때는 복제된 테이블의 일부 기대되는 특성이 사라집니다. 행의 순서와 데이터 파트 크기가 무작위로 바뀌면서 데이터 중복 제거가 더 이상 동작하지 않게 되므로, 복제된 테이블에 대해 신뢰할 수 있는 “exactly once” 쓰기를 수행할 수 없습니다. 이러한 단점 때문에 Buffer 테이블은 드문 경우에만 사용하는 것을 권장합니다. Buffer 테이블은 짧은 시간 동안 많은 수의 서버로부터 지나치게 많은 INSERT를 받을 때 사용됩니다. 이 경우 삽입 전에 데이터를 버퍼링할 수 없으므로 INSERT를 충분히 빠르게 실행할 수 없습니다. Buffer 테이블의 경우에도 데이터를 한 번에 한 행씩 삽입하는 것은 의미가 없다는 점에 유의하십시오. 이렇게 하면 속도가 초당 수천 행 수준에 그치지만, 더 큰 데이터 블록을 삽입하면 초당 100만 행을 넘길 수 있습니다.
마지막 수정일 2026년 6월 10일