"INSERT" query descripion is updated. Information on performance of query is added.

Session parameter "strict_insert_defaults" is desribed.
This commit is contained in:
2017-08-31 16:17:51 +03:00
parent 2c5c42a917
commit 47ff950420
5 changed files with 63 additions and 19 deletions

View File

@ -8,7 +8,7 @@
ClickHouse:
* Полностью или частично хранить словари в оперативной памяти.
* Полностью или частично хранит словари в оперативной памяти.
* Периодически обновляет их и динамически подгружает отсутствующие значения. Т.е. словари можно подгружать динамически.
Конфигурация внешних словарей находится в одном или нескольких файлах. Путь к конфигурации указывается в параметре :ref:`server_settings-dictionaries_config`.

View File

@ -1,3 +1,5 @@
.. _type_conversion_functions:
Функции преобразования типов
----------------------------

View File

@ -1,3 +1,5 @@
.. _interfaces:
Интерфейсы
==========

View File

@ -316,3 +316,15 @@ input_format_skip_unknown_fields
output_format_json_quote_64bit_integers
---------------------------------------
Если значение истинно, то при использовании JSON* форматов UInt64 и Int64 числа выводятся в кавычках (из соображений совместимости с большинством реализаций JavaScript), иначе - без кавычек.
.. _settings-strict_insert_defaults:
strict_insert_defaults
----------------------
Строгое присвоение значений по умолчанию при добавлении данных.
Если при выполнении запроса :ref:`queries-insert` данные для столбца не заданы, то ClickHouse присваивает полям значения по умолчанию. Значения по умолчанию определяются свойством ``DEFAULT`` для каждого столбца в настройках таблицы. Если для столбца не определен ``DEFAULT``, то когда:
* ``strict_insert_defaults=0`` - полям столбца присваиваются нули и пустые строки.
* ``strict_insert_defaults=1`` - ClickHouse генерирует исключение и обязывает пользователя передать данные в столбец.

View File

@ -549,27 +549,39 @@ OPTIMIZE
Если указан ``PARTITION``, то оптимизация будет производиться только для указаной партиции.
Если указан ``FINAL``, то оптимизация будет производиться даже когда все данные уже лежат в одном куске.
.. _queries-insert:
INSERT
~~~~~~
Запрос имеет несколько вариантов.
Добавление данных.
Базовый формат запроса:
.. code-block:: sql
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
Вставляет в таблицу table строчки с перечисленными значениями.
Запрос полностью аналогичен запросу вида:
В запросе можно указать список столбцов для вставки ``[(c1, c2, c3)]``. В этом случае, в остальные столбцы записываются:
* Значения, вычисляемые из ``DEFAULT`` выражений, указанных в определении таблицы.
* Нули и пустые строки, если ``DEFAULT`` не определены.
Если :ref:`strict_insert_defaults=1 <settings-strict_insert_defaults>`, то столбцы, для которых не определены ``DEFAULT``, необходимо перечислить в запросе.
В INSERT можно передавать данные любого :ref:`формата <formats>`, который поддерживает ClickHouse. Для этого формат необходимо указать в запросе в явном виде:
.. code-block:: sql
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name data_set
Например, следующий формат запроса идентичен базовому:
.. code-block:: sql
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...
.. code-block:: sql
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format ...
Вставка данных в произвольном указанном формате.
Сами данные идут после format, после всех пробельных символов до первого перевода строки, если он есть, включая его, или после всех пробельных символов, если переводов строки нет. Рекомендуется писать данные начиная со следующей строки (это важно, если данные начинаются с пробельных символов).
ClickHouse отсекает все пробелы и один перенос строки (если он есть) перед данными. Рекомендуем при формировании запроса переносить данные на новую строку после операторов запроса (это критически важно, если данные начинаются с пробелов).
Пример:
@ -579,26 +591,42 @@ INSERT
11 Hello, world!
22 Qwerty
Подробнее про форматы данных смотрите в разделе "Форматы".
В разделе "Интерфейсы" описано, как можно вставлять данные отдельно от запроса, при использовании клиента командной строки или HTTP интерфейса.
С помощью консольного клиента или HTTP интерфейса можно вставлять данные отдельно от запроса. Как это сделать, читайте в разделе :ref:`interfaces`.
В запросе может быть опционально указан список столбцов для вставки. В этом случае, в остальные столбцы записываются значения по умолчанию.
Значения по умолчанию вычисляются из DEFAULT выражений, указанных в определении таблицы, или, если ``DEFAULT`` не прописан явно - используются нули, пустые строки. Если настройка ``strict_insert_defaults`` выставлена в 1, то все столбцы, для которых нет явных DEFAULT-ов, должны быть указаны в запросе.
Вставка результатов ``SELECT``
------------------------------
.. code-block:: sql
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
Вставка в таблицу результата запроса ``SELECT``.
Имена и типы данных результата выполнения SELECT-а должны точно совпадать со структурой таблицы, в которую вставляются данные, или с указанным списком столбцов.
Для изменения имён столбцов следует использовать синонимы (AS) в запросе ``SELECT``.
Для изменения типов данных следует использовать функции преобразования типов (смотрите раздел "Функции").
Имена и типы данных в результатах ``SELECT`` должны совпадать со структурой таблицы или с указанным списком столбцов. Если изначально структуры разные, то измените:
* Имена столбцов с помощью ``AS`` в запросе ``SELECT``.
* Типы данных с помощью :ref:`функций преобразования типов <type_conversion_functions>`.
Ни один из форматов данных не позволяет использовать в качестве значений выражения.
То есть, вы не можете написать ``INSERT INTO t VALUES (now(), 1 + 1, DEFAULT)``.
Не поддерживаются другие запросы на модификацию части данных: ``UPDATE``, ``DELETE``, ``REPLACE``, ``MERGE``, ``UPSERT``, ``INSERT UPDATE``.
Впрочем, вы можете удалять старые данные с помощью запроса ``ALTER TABLE ... DROP PARTITION``.
Вы можете удалять старые данные с помощью запроса ``ALTER TABLE ... DROP PARTITION``.
Замечания о производительности
------------------------------
``INSERT`` сортирует входящие данные по времени и разбивает их на порции по месяцам. Если вы вставляете данные, перемешанные по времени, то это может значительно снизить производительность запроса ``INSERT``. Чтобы избежать этого:
* Добавляйте данные большими объемами. Например, по 100K.
* Сортируйте данные по месацам самостоятельно перед загрузкой в ClickHouse.
Снижения производительности не будет, если:
* Данные поступают в режиме реального времени.
* Вы загружаете дампы, которые как правило отсортированы по времени.
SELECT
~~~~~~