Clickhouse基本面:第1部分
#开源 #database #性能 #clickhouse

我们已经启动了一个Open Source ClickHouse® Knowledge Base

我们将在dev.to上分享一些技巧,但是如果您不想等待,请跳入all in one place

哦,如果您是Clickhouse Guru,请随时贡献自己的Clickhouse Magic。

这是第1部分:

查看聚集的中间状态
使用 - 状态修饰符(例如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)

但是,您经常会发现您最终要修改此列以删除可删除可删除并插入默认值而不是nulls。

ALTER TABLE deleteme MODIFY COLUMN `date` DEFAULT now()

添加默认值将影响新行,但不会替换现有行中的nulls。

SELECT *
FROM deleteme
LIMIT 1;

┌─number─┬─date─┐
│      0 │ ᴺᵁᴸᴸ │
└────────┴──────┘

要将新的默认值应用于现有行,您可以使用Motitalize。

ALTER TABLE deleteme
MATERIALIZE COLUMN `date`;

SELECT *
FROM deleteme
LIMIT 1;

┌─number─┬────────────────date─┐
│      0 │ 2022-09-23 12:31:14 │
└────────┴─────────────────────┘

避免使用async_insert
Clickhouse最初是为批量插入数据的设计。

对于习惯于其他数据库的工程师,将每秒数百个单独的插入物发送到Clickhouse并获得Too_many_parts错误是一个常见的错误。此错误是Clickhouse告诉我们进行节气门摄入,因为它无法保持。

直到最近,您必须通过缓冲插入并发送更大的批次来自己解决此问题。

但是,ClickHouse V21.11引入了Async_insert,该andnc_insert启用Clickhouse可以为您处理批处理。

注意
默认情况下禁用Async_insert,因此您必须启用其利用此功能。

如果您决定使用它,也应该查看async_insert_threads,async_insert_max_data_size,async_insert_busy_time_time_mms和wait_for_for_async_insert。