(c1, c2, c3). Также можно использовать выражение с селектором столбцов, например *, и/или модификаторы, такие как APPLY, EXCEPT, REPLACE.
Например, рассмотрим таблицу:
b, это можно сделать с помощью ключевого слова EXCEPT. В соответствии с приведённым выше синтаксисом нужно убедиться, что число вставляемых значений (VALUES (v11, v13)) совпадает с числом указанных столбцов ((c1, c3)) :
a и c заполнены переданными значениями, а b — значением по умолчанию. Также можно использовать ключевое слово DEFAULT, чтобы вставить значения по умолчанию:
- Значениями, вычисленными из выражений
DEFAULT, указанных в определении таблицы. - Нулями и пустыми строками, если выражения
DEFAULTне заданы.
INSERT в любом формате, поддерживаемом ClickHouse. Формат должен быть явно указан в запросе:
INSERT ... VALUES:
Если вы хотите указать
SETTINGS для запроса INSERT, это нужно сделать до предложения FORMAT, поскольку всё, что идёт после FORMAT format_name, рассматривается как данные. Например:Ограничения
Если у таблицы есть ограничения, их выражения будут проверяться для каждой вставляемой строки данных. Если какое-либо из этих ограничений не выполняется, сервер выдаст исключение с именем ограничения и его выражением, а запрос будет остановлен.Проверка типов данных
ClickHouse проверяет допустимые типы данных (которые контролируются настройками вродеenable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types и т. д.) только при создании таблицы (CREATE TABLE) и изменении схемы (ALTER TABLE), но не при INSERT.
Это означает, что если таблица с недопустимым типом данных уже существует, в нее можно вставлять данные, даже если соответствующая настройка отключена на сервере. Это сделано намеренно: после создания таблицы вставка не должна блокироваться настройками, управляющими созданием типов.
Например:
В результате клиент с более новой версией (где параметр по умолчанию включен) может выполнять вставку данных с недопустимыми типами данных на сервер с более старой версией (где параметр отключен), если в целевой таблице уже есть столбцы соответствующих типов. Проверка выполняется на уровне DDL, а не DML.
Вставка результатов запроса SELECT
СинтаксисSELECT. Однако их имена в выражении SELECT и в таблице для INSERT могут различаться. При необходимости выполняется приведение типов.
Ни один из форматов данных, кроме формата Values, не позволяет задавать значения в виде выражений, таких как now(), 1 + 2 и т. д. Формат Values допускает ограниченное использование выражений, но это не рекомендуется, поскольку в этом случае для их вычисления используется неэффективный код.
Другие запросы на изменение частей данных не поддерживаются: UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE.
Однако старые данные можно удалить с помощью ALTER TABLE ... DROP PARTITION.
Предложение FORMAT должно быть указано в конце запроса, если предложение SELECT содержит табличную функцию input().
Чтобы вставить значение по умолчанию вместо NULL в столбец с типом данных, не допускающим NULL, включите настройку insert_null_as_default.
INSERT также поддерживает CTE (общее табличное выражение). Например, следующие два оператора эквивалентны:
Вставка данных из файла
Синтаксисfile_name и type — строковые литералы. Входной формат файла должен быть задан в предложении FORMAT.
Поддерживаются сжатые файлы. Тип сжатия определяется по расширению имени файла. Либо его можно явно указать в предложении COMPRESSION. Поддерживаются следующие типы: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2', 'snappy'. Для snappy формат передачи данных выбирается настройкой snappy_mode (по умолчанию basic).
Эта возможность доступна в клиенте командной строки и clickhouse-local.
Примеры
Один файл с использованием FROM INFILE
Выполните следующие запросы с помощью клиента командной строки:Query
Response
Несколько файлов в FROM INFILE с использованием глоб-шаблонов
Этот пример очень похож на предыдущий, но здесь вставка выполняется из нескольких файлов с помощьюFROM INFILE 'input_*.csv.
Вставка с помощью табличной функции
Данные можно вставлять в таблицы, указанные через табличные функции. СинтаксисQuery
Response
Вставка в ClickHouse Cloud
По умолчанию сервисы в ClickHouse Cloud предоставляют несколько реплик для высокой доступности. При подключении к сервису соединение устанавливается с одной из этих реплик. После успешного выполненияINSERT данные записываются в нижележащее хранилище. Однако репликам может потребоваться некоторое время, чтобы получить эти обновления. Поэтому, если вы используете другое соединение, которое выполняет запрос SELECT к одной из остальных реплик, обновлённые данные могут там ещё не отображаться.
Можно использовать select_sequential_consistency, чтобы принудительно синхронизировать реплику с последними обновлениями. Вот пример запроса SELECT с этой настройкой:
select_sequential_consistency увеличивает нагрузку на ClickHouse Keeper (который ClickHouse Cloud использует внутри своей инфраструктуры) и, в зависимости от нагрузки на сервис, может приводить к снижению производительности. Мы не рекомендуем включать этот параметр без необходимости. Рекомендуемый подход — выполнять операции чтения и записи в рамках одного сеанса или использовать клиентский драйвер, работающий через собственный протокол (и, следовательно, поддерживающий sticky connections).
Вставка в реплицируемой конфигурации
В реплицируемой конфигурации данные становятся видны на других репликах после репликации. Репликация данных (то есть их загрузка на другие реплики) начинается сразу послеINSERT. Это отличается от ClickHouse Cloud, где данные сразу записываются в общее хранилище, а реплики отслеживают изменения метаданных.
Обратите внимание: в реплицируемых конфигурациях операции INSERT иногда могут занимать заметное время (порядка одной секунды), поскольку для этого требуется фиксация в ClickHouse Keeper для достижения распределённого консенсуса. Использование S3 в качестве хранилища также увеличивает задержку.
Рекомендации по производительности
INSERT сортирует входные данные по первичному ключу и разбивает их на партиции по ключу партиционирования. Если вставлять данные сразу в несколько партиций, это может значительно снизить производительность запроса INSERT. Чтобы этого избежать:
- Добавляйте данные достаточно крупными батчами, например по 100 000 строк за раз.
- Группируйте данные по ключу партиционирования перед загрузкой в ClickHouse.
- Данные добавляются в реальном времени.
- Вы загружаете данные, которые обычно уже отсортированы по времени.
Асинхронные вставки
Можно асинхронно вставлять данные небольшими, но частыми порциями. Данные из таких вставок объединяются в батчи, а затем безопасно вставляются в таблицу. Чтобы использовать асинхронные вставки, включите настройкуasync_insert.
Использование async_insert или Buffer движка таблицы приводит к дополнительной буферизации.
Крупные или длительные вставки
При вставке больших объёмов данных ClickHouse оптимизирует производительность записи с помощью процесса, называемого «squashing». Небольшие блоки вставляемых данных в памяти сливаются и объединяются в более крупные блоки перед записью на диск. Squashing уменьшает накладные расходы, связанные с каждой операцией записи. В ходе этого процесса данные становятся доступными для запросов после того, как ClickHouse завершит запись каждыхmax_insert_block_size строк.
См. также
- async_insert
- wait_for_async_insert
- wait_for_async_insert_timeout
- async_insert_max_data_size
- async_insert_busy_timeout_ms
async_insert_stale_timeout_ms