> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 데이터를 RAM에 버퍼링한 뒤, 주기적으로 다른 테이블로 플러시합니다. 읽기 작업 중에는 버퍼와 다른 테이블에서 데이터를 동시에 읽습니다.

# Buffer 테이블 엔진

데이터를 RAM에 버퍼링한 뒤, 주기적으로 다른 테이블로 플러시합니다. 읽기 작업 중에는 버퍼와 다른 테이블에서 데이터를 동시에 읽습니다.

<Note>
  Buffer 테이블 엔진의 권장되는 대안은 [비동기 삽입(asynchronous inserts)](/ko/concepts/features/operations/insert/asyncinserts)을 활성화하는 것입니다.
</Note>

```sql theme={null}
Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes [,flush_time [,flush_rows [,flush_bytes]]])
```

<div id="engine-parameters">
  ### 엔진 매개변수
</div>

<div id="database">
  #### `database`
</div>

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

<div id="table">
  #### `table`
</div>

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

<div id="num_layers">
  #### `num_layers`
</div>

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

<div id="min_time-max_time-min_rows-max_rows-min_bytes-and-max_bytes">
  #### `min_time`, `max_time`, `min_rows`, `max_rows`, `min_bytes`, and `max_bytes`
</div>

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

<div id="optional-engine-parameters">
  ### 선택적 엔진 매개변수
</div>

<div id="flush_time-flush_rows-and-flush_bytes">
  #### `flush_time`, `flush_rows`, and `flush_bytes`
</div>

백그라운드에서 버퍼의 데이터를 플러시하기 위한 조건입니다(`flush*` 매개변수가 생략되었거나 0이면 `flush*` 매개변수를 사용하지 않음을 의미합니다).

모든 `min*` 조건이 충족되거나 `max*` 조건 중 하나 이상이 충족되면, 데이터가 버퍼에서 플러시되어 대상 테이블(destination table)에 기록됩니다.

또한 `flush*` 조건 중 하나 이상이 충족되면 백그라운드에서 플러시가 시작됩니다. 이는 `max*`와 다릅니다. `flush*`를 사용하면 Buffer 테이블에 대한 `INSERT` 쿼리에 지연 시간이 추가되지 않도록 백그라운드 플러시를 별도로 구성할 수 있습니다.

<div id="min_time-max_time-and-flush_time">
  #### `min_time`, `max_time`, and `flush_time`
</div>

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

<div id="min_rows-max_rows-and-flush_rows">
  #### `min_rows`, `max_rows`, and `flush_rows`
</div>

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

<div id="min_bytes-max_bytes-and-flush_bytes">
  #### `min_bytes`, `max_bytes`, and `flush_bytes`
</div>

버퍼의 바이트 수에 대한 조건입니다.

쓰기 작업 중에는 데이터가 하나 이상의 임의 버퍼(`num_layers`로 구성)에 삽입됩니다. 또는 삽입할 데이터 파트가 충분히 큰 경우(`max_rows` 또는 `max_bytes`보다 큰 경우)에는 버퍼를 거치지 않고 대상 테이블에 직접 기록됩니다.

데이터를 플러시하는 조건은 각 `num_layers` 버퍼에 대해 별도로 계산됩니다. 예를 들어 `num_layers = 16`이고 `max_bytes = 100000000`이면 최대 RAM 사용량은 1.6 GB입니다.

예시:

```sql theme={null}
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 테이블과 종속 테이블의 컬럼 중 하나라도 타입이 일치하지 않으면 서버 로그에 오류 메시지가 기록되고, 버퍼가 비워집니다.
버퍼가 플러시될 때 종속 테이블이 존재하지 않는 경우에도 동일한 일이 발생합니다.

<Note>
  2021-10-26 이전 릴리스에서 Buffer 테이블에 대해 ALTER를 실행하면 `Block structure mismatch` 오류가 발생합니다([#15117](https://github.com/ClickHouse/ClickHouse/issues/15117) 및 [#30565](https://github.com/ClickHouse/ClickHouse/pull/30565) 참조). 따라서 Buffer 테이블을 삭제한 뒤 다시 생성하는 것만이 유일한 방법입니다. Buffer 테이블에서 ALTER를 실행하기 전에 사용 중인 릴리스에서 이 오류가 수정되었는지 확인하십시오.
</Note>

서버가 비정상적으로 재시작되면 버퍼의 데이터는 손실됩니다.

Buffer 테이블에서는 `FINAL`과 `SAMPLE`이 올바르게 동작하지 않습니다. 이 조건들은 대상 테이블로 전달되지만 버퍼의 데이터를 처리하는 데는 사용되지 않습니다. 이러한 기능이 필요하다면, 쓰기에는 Buffer 테이블만 사용하고 읽기는 대상 테이블에서만 수행하는 것을 권장합니다.

Buffer 테이블에 데이터를 추가할 때는 버퍼 중 하나가 잠깁니다. 이로 인해 테이블에서 읽기 작업이 동시에 수행되면 지연이 발생합니다.

Buffer 테이블에 삽입된 데이터는 종속 테이블에 서로 다른 순서와 서로 다른 블록으로 저장될 수 있습니다. 이 때문에 Buffer 테이블은 CollapsingMergeTree에 올바르게 쓰는 용도로 사용하기 어렵습니다. 문제를 피하려면 `num_layers`를 1로 설정할 수 있습니다.

대상 테이블이 복제된 경우, Buffer 테이블을 통해 쓸 때는 복제된 테이블의 일부 기대되는 특성이 사라집니다. 행의 순서와 데이터 파트 크기가 무작위로 바뀌면서 데이터 중복 제거가 더 이상 동작하지 않게 되므로, 복제된 테이블에 대해 신뢰할 수 있는 "exactly once" 쓰기를 수행할 수 없습니다.

이러한 단점 때문에 Buffer 테이블은 드문 경우에만 사용하는 것을 권장합니다.

Buffer 테이블은 짧은 시간 동안 많은 수의 서버로부터 지나치게 많은 INSERT를 받을 때 사용됩니다. 이 경우 삽입 전에 데이터를 버퍼링할 수 없으므로 INSERT를 충분히 빠르게 실행할 수 없습니다.

Buffer 테이블의 경우에도 데이터를 한 번에 한 행씩 삽입하는 것은 의미가 없다는 점에 유의하십시오. 이렇게 하면 속도가 초당 수천 행 수준에 그치지만, 더 큰 데이터 블록을 삽입하면 초당 100만 행을 넘길 수 있습니다.
