Buffer 테이블 엔진의 권장되는 대안은 비동기 삽입(asynchronous inserts)을 활성화하는 것입니다.
엔진 매개변수
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입니다.
예시:
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)의 데이터가 기록되었을 때
DROP TABLE이나 DETACH TABLE을 수행할 때도 버퍼링된 데이터는 대상 테이블로 플러시됩니다.
데이터베이스와 테이블 이름에는 작은따옴표로 묶인 빈 문자열을 설정할 수 있습니다. 이는 대상 테이블이 없음을 의미합니다. 이 경우 데이터 플러시 조건에 도달하면 버퍼는 단순히 비워집니다. 이는 메모리에 데이터 윈도우를 유지하는 데 유용할 수 있습니다.
Buffer 테이블에서 읽을 때는 버퍼와 대상 테이블(있는 경우) 모두의 데이터가 처리됩니다.
Buffer 테이블은 인덱스를 지원하지 않는다는 점에 유의하십시오. 즉, 버퍼의 데이터는 전체 스캔되므로 버퍼가 크면 느릴 수 있습니다. (종속 테이블의 데이터에는 해당 테이블이 지원하는 인덱스가 사용됩니다.)
Buffer 테이블의 컬럼 집합이 종속 테이블의 컬럼 집합과 일치하지 않으면, 두 테이블에 모두 존재하는 컬럼의 부분 집합만 삽입됩니다.
Buffer 테이블과 종속 테이블의 컬럼 중 하나라도 타입이 일치하지 않으면 서버 로그에 오류 메시지가 기록되고, 버퍼가 비워집니다.
버퍼가 플러시될 때 종속 테이블이 존재하지 않는 경우에도 동일한 일이 발생합니다.
서버가 비정상적으로 재시작되면 버퍼의 데이터는 손실됩니다.
Buffer 테이블에서는
FINAL과 SAMPLE이 올바르게 동작하지 않습니다. 이 조건들은 대상 테이블로 전달되지만 버퍼의 데이터를 처리하는 데는 사용되지 않습니다. 이러한 기능이 필요하다면, 쓰기에는 Buffer 테이블만 사용하고 읽기는 대상 테이블에서만 수행하는 것을 권장합니다.
Buffer 테이블에 데이터를 추가할 때는 버퍼 중 하나가 잠깁니다. 이로 인해 테이블에서 읽기 작업이 동시에 수행되면 지연이 발생합니다.
Buffer 테이블에 삽입된 데이터는 종속 테이블에 서로 다른 순서와 서로 다른 블록으로 저장될 수 있습니다. 이 때문에 Buffer 테이블은 CollapsingMergeTree에 올바르게 쓰는 용도로 사용하기 어렵습니다. 문제를 피하려면 num_layers를 1로 설정할 수 있습니다.
대상 테이블이 복제된 경우, Buffer 테이블을 통해 쓸 때는 복제된 테이블의 일부 기대되는 특성이 사라집니다. 행의 순서와 데이터 파트 크기가 무작위로 바뀌면서 데이터 중복 제거가 더 이상 동작하지 않게 되므로, 복제된 테이블에 대해 신뢰할 수 있는 “exactly once” 쓰기를 수행할 수 없습니다.
이러한 단점 때문에 Buffer 테이블은 드문 경우에만 사용하는 것을 권장합니다.
Buffer 테이블은 짧은 시간 동안 많은 수의 서버로부터 지나치게 많은 INSERT를 받을 때 사용됩니다. 이 경우 삽입 전에 데이터를 버퍼링할 수 없으므로 INSERT를 충분히 빠르게 실행할 수 없습니다.
Buffer 테이블의 경우에도 데이터를 한 번에 한 행씩 삽입하는 것은 의미가 없다는 점에 유의하십시오. 이렇게 하면 속도가 초당 수천 행 수준에 그치지만, 더 큰 데이터 블록을 삽입하면 초당 100만 행을 넘길 수 있습니다.