В качестве рекомендуемой альтернативы движку таблицы Buffer используйте асинхронные вставки.
Параметры движка
database
database — имя базы данных. Можно использовать currentDatabase() или другое константное выражение, возвращающее строку.
table
table – Таблица, в которую сбрасываются данные.
num_layers
num_layers — уровень параллелизма. Физически таблица представлена как num_layers независимых буферов.
min_time, max_time, min_rows, max_rows, min_bytes, and max_bytes
Необязательные параметры движка
flush_time, flush_rows и flush_bytes
flush* отсутствуют).
Данные сбрасываются из буфера и записываются в целевую таблицу, если выполнены все условия min* или хотя бы одно из условий max*.
Кроме того, если выполнено хотя бы одно условие flush*, в фоновом режиме запускается сброс. Это отличается от max*: flush* позволяет отдельно настраивать фоновые сбросы, чтобы не добавлять задержку для запросов INSERT к таблицам Buffer.
min_time, max_time и 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, максимальное потребление оперативной памяти составляет 1,6 ГБ.
Пример:
merge.hits_buffer с той же структурой, что и у merge.hits, с использованием движка Buffer. При записи в эту таблицу данные буферизуются в оперативной памяти, а затем записываются в таблицу ‘merge.hits’. Создается один буфер, и данные сбрасываются, если выполняется хотя бы одно из условий:
- прошло 100 секунд с момента последнего сброса (
max_time) или - записан 1 миллион строк (
max_rows) или - записано 100 МБ данных (
max_bytes) или - прошло 10 секунд (
min_time), и записано 10 000 строк (min_rows) и 10 МБ (min_bytes) данных
DROP TABLE или DETACH TABLE буферизованные данные также сбрасываются в целевую таблицу.
Для имени базы данных и таблицы можно указать пустые строки в одинарных кавычках. Это означает отсутствие целевой таблицы. В этом случае при выполнении условий сброса данных буфер просто очищается. Это может быть полезно для хранения окна данных в памяти.
При чтении из таблицы Buffer данные обрабатываются как из буфера, так и из целевой таблицы (если она есть).
Обратите внимание, что таблица Buffer не поддерживает индекс. Иными словами, данные в буфере сканируются полностью, что может быть медленным при больших буферах. (Для данных в подчиненной таблице будет использоваться поддерживаемый ею индекс.)
Если набор столбцов в таблице Buffer не совпадает с набором столбцов в подчиненной таблице, вставляется подмножество столбцов, существующих в обеих таблицах.
Если типы одного из столбцов в таблице Buffer и подчиненной таблице не совпадают, сообщение об ошибке записывается в server log, а буфер очищается.
То же самое происходит, если в момент сброса буфера подчиненная таблица не существует.
Выполнение ALTER для таблицы Buffer в релизах, выпущенных до 26 Oct 2021, вызовет ошибку
Block structure mismatch (см. #15117 и #30565), поэтому единственный вариант — удалить таблицу Buffer и затем создать ее заново. Прежде чем пытаться выполнить ALTER для таблицы Buffer, проверьте, исправлена ли эта ошибка в вашей версии.FINAL и SAMPLE не работают корректно для таблиц Buffer. Эти условия передаются в целевую таблицу, но не используются при обработке данных в буфере. Если эти возможности необходимы, мы рекомендуем использовать таблицу Buffer только для записи, а читать из целевой таблицы.
При добавлении данных в таблицу Buffer один из буферов блокируется. Это вызывает задержки, если одновременно с этим из таблицы выполняется операция чтения.
Данные, вставляемые в таблицу Buffer, могут оказаться в подчиненной таблице в другом порядке и в других блоках. Из-за этого таблицу Buffer сложно корректно использовать для записи в CollapsingMergeTree. Чтобы избежать проблем, можно установить num_layers в 1.
Если целевая таблица является реплицируемой, при записи в таблицу Buffer теряются некоторые ожидаемые характеристики реплицируемых таблиц. Случайные изменения порядка строк и размеров частей данных приводят к тому, что дедупликация данных перестает работать, а это означает, что надежная запись в реплицируемые таблицы в режиме ‘exactly once’ невозможна.
Из-за этих недостатков мы можем рекомендовать использование таблицы Buffer только в редких случаях.
Таблица Buffer используется, когда за единицу времени поступает слишком много INSERT от большого числа серверов, и данные нельзя буферизовать до вставки, а значит, INSERT не могут выполняться достаточно быстро.
Обратите внимание, что выполнять вставку данных по одной строке не имеет смысла даже для таблиц Buffer. В этом случае скорость составит всего несколько тысяч строк в секунду, тогда как при вставке более крупных блоков данных она может превышать миллион строк в секунду.