为啥clickhouse写批记录慢?

Posted

技术标签:

【中文标题】为啥clickhouse写批记录慢?【英文标题】:why is clickhouse writing batch records slowly?为什么clickhouse写批记录慢? 【发布时间】:2021-07-06 03:41:52 【问题描述】:

我使用 clickhouse-jdbc 将数据写入 clickhouse 的分布式“全部”表(3 个主机用于 3 个分片 1 个副本)。

使用 PreparedStatement 对 1000000 条记录进行 5000 次批量提交需要 6280 秒。

...
                ps.setString(68, dateTimeStr);
                ps.setDate(69, date);
                
                ps.addBatch();
                System.out.println("i: " + i);
                
                if(i % 5000 == 0 || i == maxRecords) 
                    System.out.println(new java.util.Date());
                    ps.executeBatch();
                    System.out.println(new java.util.Date());
//                  ps.execute();
                    conn.commit();
                    System.out.println("commit: " + new java.util.Date());
                
...

每天插入一亿条记录有没有更好的方法?

【问题讨论】:

【参考方案1】:

是的,插入到 Distributed engine 可能会很慢,因为每次插入操作都需要执行大量逻辑(将数据同步到特定分片等)。

您可以尝试调整一些设置,这些设置在上面的链接中有所描述。

但是,我发现直接写入基础表更加方便快捷。但这需要您关心在所有节点上分片和传播数据,即按照自己的喜好分配数据。

【讨论】:

是的,直接写入本地表效率更高。但是我们必须考虑数据的分布和平衡 分布式表将通过向所有本地表发出读取选择来处理分布式读取。将相同“分片”键的数据尽可能靠近是很好的(您可能会在读取期间获得好处)。尽管使用简单的循环数据分布,这仅意味着您的所有分片都将携带一个“分数”,因此所有分片都会在读取查询期间进行一些提取工作。我认为这取决于数据以及您如何看待它应该是结构化的。这是一个权衡。

以上是关于为啥clickhouse写批记录慢?的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse-尚硅谷(2. 入门-安装)学习笔记

为啥将 OFFSET 添加到 clickhouse 查询会增加执行时间?

火山引擎:ClickHouse增强计划之“多表关联查询”

火山引擎:ClickHouse增强计划之“多表关联查询”

火山引擎:ClickHouse增强计划之“多表关联查询”

如何在带有 ubuntu 的树莓派 4 上安装 Clickhouse? [关闭]