Clickhouse:如何在clickhouse中使用“数据跳过索引”和“数据跳过索引的操作”功能?

Ruj*_*ing 7 minmax secondary-indexes clickhouse

我正在使用Data Skipping Indexesclickhouse 中的该功能,但我对其用法感到困惑。如果我在创建表时添加数据跳过索引,如下所示:

CREATE TABLE MyTable
(
    ...
    INDEX index_time TimeStamp TYPE minmax GRANULARITY 1
)
ENGINE =MergeTree()
...
Run Code Online (Sandbox Code Playgroud)

当我使用TimeStamp过滤条件查询时,“index_time”有效。但是,如果我在创建表时没有添加索引,或者,我添加了具有Manipulations With Data Skipping Indices如下功能的索引:

ALTER TABLEE MyTable ADD INDEX index_time TimeStamp TYPE minmax GRANULARITY 1
Run Code Online (Sandbox Code Playgroud)

那么索引'index_time'不起作用。

我的数据库正在生产中运行,因此我无法重新创建表。我必须使用第二种方法。谁能解释为什么它不起作用或者我以错误的方式使用该功能?

小智 7

您的查询在 ALTER TABLE ADD INDEX 之后不使用索引的原因是因为该索引尚不存在。(!)

任何新数据都将被正确索引,这就是为什么当您将其放入 CREATE TABLE 时索引会起作用。ClickHouse 在加载数据时构建索引。如果您创建了表,运行 ALTER TABLE ADD INDEX 并加载数据,您将看到相同的行为。

当数据已经存在时,情况就不同了。ALTER TABLE 更新表的元数据,但此时所有数据都已写入表中的各个部分。ClickHouse 不会自动重写部分来实现新索引。但是,您应该能够通过运行以下命令强制重写以包含索引:

OPTIMIZE TABLE MyTable FINAL 
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅 Ruijang 引用的Github 问题https://github.com/yandex/ClickHouse/issues/6561 。