Clickhouse:我应该手动优化 MergeTree table 吗?
Clickhouse: Should i optimize MergeTree table manually?
我有一个 table 喜欢:
create table test (id String, timestamp DateTime, somestring String) ENGINE = MergeTree ORDER BY (id, timestamp)
我插入了 100 条记录,然后插入了另外 100 条记录,我 运行 select 查询
select * from test
clickhouse returning 有 2 个部分,它们的长度是 100,并且它们是单独订购的。然后我 运行 查询 optimize table test
并且它开始 return 有 1 个部分并且它的长度是 200 并被排序。那么我应该 运行 在所有插入之后优化查询吗?它是否会像 select count(*) from test where id = 'foo'
那样提高 select 查询性能?
通常不会,你可以依赖Clickhouse后台合并。
此外,Clickhouse 无意将分区中的所有数据合并到一个部分文件中,因为“over-optimization”也会影响性能
合并是最终的,可能永远不会发生。这取决于之后发生的插入次数、分区中的部件数、部件的大小。如果输入部分的总大小大于最大部分大小,那么它们将永远不会被合并。
不断合并到一个部分是很不合理的。
合并没有这样的目标。相反,目标是拥有最少数量的零件和最少数量的合并。合并会消耗大量磁盘和处理器资源。
将两个 300GB 的部分合并为一个 600GB 的部分 3 小时是没有意义的。合并必须读取、解压 600GB、合并、压缩、写回,之后 selects 的性能将根本不会增长或增长微乎其微。
我有一个 table 喜欢:
create table test (id String, timestamp DateTime, somestring String) ENGINE = MergeTree ORDER BY (id, timestamp)
我插入了 100 条记录,然后插入了另外 100 条记录,我 运行 select 查询
select * from test
clickhouse returning 有 2 个部分,它们的长度是 100,并且它们是单独订购的。然后我 运行 查询 optimize table test
并且它开始 return 有 1 个部分并且它的长度是 200 并被排序。那么我应该 运行 在所有插入之后优化查询吗?它是否会像 select count(*) from test where id = 'foo'
那样提高 select 查询性能?
通常不会,你可以依赖Clickhouse后台合并。
此外,Clickhouse 无意将分区中的所有数据合并到一个部分文件中,因为“over-optimization”也会影响性能
合并是最终的,可能永远不会发生。这取决于之后发生的插入次数、分区中的部件数、部件的大小。如果输入部分的总大小大于最大部分大小,那么它们将永远不会被合并。
不断合并到一个部分是很不合理的。 合并没有这样的目标。相反,目标是拥有最少数量的零件和最少数量的合并。合并会消耗大量磁盘和处理器资源。
将两个 300GB 的部分合并为一个 600GB 的部分 3 小时是没有意义的。合并必须读取、解压 600GB、合并、压缩、写回,之后 selects 的性能将根本不会增长或增长微乎其微。