clickhouse 表, mergetree引擎, 不断填充 “插入 … “设置csv格式” 查询,开始为空。这个 平均投入率 每秒7000行。插入是成批进行的几千个 排。这会严重影响性能 同时执行select查询时。 如clickhouse文档中所述,系统最多需要10分钟来合并特定表的数据(重新索引)。但是,由于表是不断填充的,所以这种情况不会发生。
这也是显而易见的 在里面 文件系统。table 文件夹中有数千个 子文件夹 索引被过度分割了。如果数据接收停止,几分钟后表就被完全合并,子文件夹的数量就变成12个。
为了遇到上述弱点 缓冲发动机 已使用 缓冲表 数据 摄入10分钟。因此,缓冲区的最大行数平均为4200000。
初始表 剩余的 缓冲区保留最近摄取的行时,最多延迟10分钟。table终于好了 合并,其行为与 这张table已经停下来了 密集的 对于 几分钟。但是缓冲表,对应于缓冲区和初始表的组合, 正在变得 严重地 更慢的。
从上面看来,如果表是连续的 填充,不合并,索引会受到影响。有没有办法避免这种弱点?
1条答案
按热度按时间3zwtqj6y1#
表数据目录中的子文件夹数不是那么具有代表性。
实际上,每个子文件夹都包含一个由排序(索引)行组成的数据部分。如果几个数据部分合并成一个新的更大的部分,则会出现新的子文件夹。
但是,合并后不会立即删除源数据部分。有一个
<merge_tree>
设置old_parts_lifetime
定义一个延迟,在该延迟之后零件将被移除,默认设置为8分钟。此外,还有cleanup_delay_period
设置定义后台清理器检查和删除过期部件的频率,默认为30秒。因此,在摄取开始后的8分30秒内拥有如此多的子文件夹是正常的。如果您不能接受,可以更改这些设置。
只检查表中活动部件的数量是有意义的(即未合并为较大部件的部件)。为此,可以运行以下查询:
SELECT count() FROM system.parts WHERE database='db' AND table='table' AND active
.此外,如果分区中的活动部件数量大于
parts_to_delay_insert=150
,将减慢插入速度,但如果大于parts_to_throw_insert=300
它将中止插入。