Мы запустили базу знаний ClickHouse® с открытым исходным кодом!

Мы поделимся некоторыми советами здесь, на Dev.to, но если вы не хотите ждать, присоединяйтесь и найдите их все в одном месте.

О, и если вы являетесь гуру ClickHouse, пожалуйста, не стесняйтесь вносить свою собственную магию ClickHouse.

Вот часть 1:

Просмотр промежуточных состояний агрегатов
Использование функций агрегации с модификатором -State (например, sumState) приводит к тому, что промежуточные состояния сохраняются в ClickHouse. Эти промежуточные состояния обычно невозможно прочитать, так как они хранятся в двоичном представлении. Таким образом, чтобы прочитать результат, мы должны использовать соответствующий модификатор -Merge при выборе результата (например, sumMerge).

Например:

SELECT
    number % 4 AS pk,
    avgState(number) AS avg_state
FROM numbers(2000)
GROUP BY pk

Query id: af1c69e7-b5d2-4063-9b8d-1ac08598fc79

┌─pk─┬─avg_state─┐
│  0 │ 8��         │
│  1 │ ,��         │
│  2 │  ��         │
│  3 │ ��          │
└────┴───────────┘
Войти в полноэкранный режим

Выйти из полноэкранного режима

Если вы хотите исследовать промежуточные состояния, возможно, не зная, каким был исходный метод агрегации, вы можете вместо этого использовать функцию finalizeAggregation.

SELECT
    pk,
    finalizeAggregation(avg_state)
FROM
(
    SELECT
        number % 4 AS pk,
        avgState(number) AS avg_state
    FROM numbers(2000)
    GROUP BY pk
)

Query id: 7cf3a07f-f5d1-4ddd-891f-a89bb304b227

┌─pk─┬─finalizeAggregation(avg_state)─┐
│  0 │                            998 │
│  1 │                            999 │
│  2 │                           1000 │
│  3 │                           1001 │
└────┴────────────────────────────────┘
Войти в полноэкранный режим

Выйти из полноэкранного режима

Применить столбец по умолчанию к существующим строкам
ClickHouse включает специальный тип оболочки Nullable, который позволяет столбцу содержать нулевые значения. Обычно это используется на ранних этапах разработки схемы, когда значение по умолчанию еще не определено.

CREATE TABLE deleteme
(
    `number` UInt64,
    `date` Nullable(DateTime)
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number AS
SELECT
    number,
    NULL
FROM numbers(10)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Однако вы часто обнаружите, что в конечном итоге захотите изменить этот столбец, чтобы удалить Nullable и вставить значение по умолчанию вместо нулей.

ALTER TABLE deleteme MODIFY COLUMN `date` DEFAULT now()
Войти в полноэкранный режим

Выйти из полноэкранного режима

Добавление значения по умолчанию повлияет на новые строки, но не заменит пустые значения в существующих строках.

SELECT *
FROM deleteme
LIMIT 1;

┌─number─┬─date─┐
│      0 │ ᴺᵁᴸᴸ │
└────────┴──────┘
Войти в полноэкранный режим

Выйти из полноэкранного режима

Чтобы применить новое значение по умолчанию к существующим строкам, вы можете использовать MATERIALIZE.

ALTER TABLE deleteme
MATERIALIZE COLUMN `date`;

SELECT *
FROM deleteme
LIMIT 1;

┌─number─┬────────────────date─┐
│      0 │ 2022-09-23 12:31:14 │
└────────┴─────────────────────┘
Войти в полноэкранный режим

Выйти из полноэкранного режима

Избегайте TOO_MANY_PARTS с помощью async_insert
ClickHouse изначально был разработан для пакетной вставки данных.

Для инженеров, привыкших к другим базам данных, распространенной ошибкой является отправка сотен отдельных вставок в секунду в ClickHouse и получение ошибки TOO_MANY_PARTS. Эта ошибка возникает из-за того, что ClickHouse говорит нам ограничить прием данных, так как он не справляется.

До недавнего времени вам приходилось решать эту проблему самостоятельно, буферизируя вставки и отправляя большие пакеты.

Однако ClickHouse v21.11 представил async_insert, который позволяет ClickHouse обрабатывать небольшие вставки за вас.

ПРИМЕЧАНИЕ
async_insert по умолчанию отключен, поэтому вы должны включить его, чтобы воспользоваться преимуществами этой функции.

Если вы решите использовать его, вам также следует взглянуть на async_insert_threads, async_insert_max_data_size, async_insert_busy_timeout_ms и wait_for_async_insert.