Асинхронные вставки (async_insert)
Вставка данных в ClickHouse большими пакетами является лучшей практикой. Это экономит вычислительные циклы и ввод-вывод диска, и, следовательно, помогает сэкономить деньги. Если ваш случай использования позволяет пакетировать вставки вне ClickHouse, то это один из вариантов. Если вы хотите, чтобы ClickHouse создавал пакеты, то вы можете использовать асинхронный режим INSERT, описанный здесь.
Используйте асинхронные вставки в качестве альтернативы как пакетированию данных на стороне клиента, так и поддержанию скорости вставки около одного запроса на вставку в секунду, включив настройку async_insert. Это заставляет ClickHouse обрабатывать пакетирование на стороне сервера.
По умолчанию ClickHouse записывает данные синхронно. Каждый вставленный запрос, отправленный в ClickHouse, вызывает немедленное создание части, содержащей данные из вставки. Это поведение по умолчанию, когда настройка async_insert установлена по умолчанию на 0:

Установив async_insert на 1, ClickHouse сначала сохраняет входящие вставки в буфер в памяти, прежде чем регулярно сбрасывать их на диск.
Существует два возможных условия, которые могут вызвать сброс буфера ClickHouse на диск:
- размер буфера достиг N байт (N настраиваемый через async_insert_max_data_size)
- прошло как минимум N мс с последнего сброса буфера (N настраиваемый через async_insert_busy_timeout_max_ms)
В любое время, когда выполняется любое из условий выше, ClickHouse сбрасывает свой буфер в памяти на диск.
Ваши данные доступны для запросов на чтение, как только данные записаны в часть хранилища. Учтите это, когда вы хотите изменить настройки async_insert_busy_timeout_ms
(по умолчанию установлено на 1 секунду) или async_insert_max_data_size
(по умолчанию установлено на 10 MiB).
С помощью настройки wait_for_async_insert вы можете настроить, хотите ли вы, чтобы команда вставки возвращалась с подтверждением либо сразу после вставки данных в буфер (wait_for_async_insert = 0), либо по умолчанию, после записи данных в часть после сброса из буфера (wait_for_async_insert = 1).
Следующие две диаграммы иллюстрируют два параметра для async_insert и wait_for_async_insert:


Включение асинхронных вставок
Асинхронные вставки можно включить для конкретного пользователя или для конкретного запроса:
-
Включение асинхронных вставок на уровне пользователя. Этот пример использует пользователя
default
, если вы создаете другого пользователя, замените это имя пользователя: -
Вы можете указать настройки асинхронной вставки, используя предложение SETTINGS в запросах на вставку:
-
Вы также можете указать настройки асинхронной вставки в качестве параметров подключения при использовании клиента языка программирования ClickHouse.
Например, так вы можете сделать это в строке подключения JDBC, когда вы используете драйвер ClickHouse Java JDBC для подключения к ClickHouse Cloud:
Наша сильная рекомендация - использовать async_insert=1, wait_for_async_insert=1, если вы используете асинхронные вставки. Использование wait_for_async_insert=0 очень рискованно, потому что ваш клиент INSERT может не знать, если произошли ошибки, а также может вызвать потенциальную перегрузку, если ваш клиент продолжает писать быстро в ситуации, когда сервер ClickHouse должен замедлить записи и создать некоторое обратное давление, чтобы обеспечить надежность сервиса.
Ручное пакетирование (см. bulk insert)) имеет преимущество, поскольку поддерживает встроенную автоматическую дедупликацию данных таблицы, если (в точности) один и тот же запрос на вставку отправляется несколько раз в ClickHouse Cloud, например, из-за автоматической повторной попытки в клиентском программном обеспечении из-за временных проблем с сетевым подключением.