首页 > 其他分享 >ClickHouse中select final和optimize table final的区别

ClickHouse中select final和optimize table final的区别

时间:2023-12-13 09:55:25浏览次数:49  
标签:zkm 12 id select ClickHouse table final clickhouse

 

ClickHouse中select final和optimize table final的区别

 

使用 OPTIMIZE TABLE FINAL 该语句会对表的数据部分进行计划外的合并,通常不建议使用。见官档:传送门

而在select中当 FINAL 被指定,ClickHouse会在返回结果之前完全合并数据,从而执行给定表引擎合并期间发生的所有数据转换。见官档:传送门

 

其中,需要特别注意的是:

1.optimize table final会立刻对表数据进行物理合并;select final只针对此次查询生效,并不会对实际物理分区进行合并。

2.optimize table final只会对同个分片同个分区数据进行物理合并;select final则可以对同个分片不同分区的数据也会进行合并,但是不同分片即使满足合并条件也无法合并

 

以下针对上述两个点进行实验。

1.optimize table final会立刻对表数据进行物理合并;select final只针对此次查询生效,并不会对实际物理分区进行合并。

创建单点表并插入测试数据,语句如下:防偷防爬

CREATE TABLE zkm
(
    `id` String DEFAULT 'NULL' COMMENT '用户编号',
    `repo` String DEFAULT 'NULL' COMMENT '仓库编号',
    `CREATE_TIME` DateTime DEFAULT '1971-01-01' COMMENT '数据建立时间'
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMMDD(CREATE_TIME) 
ORDER BY id SETTINGS old_parts_lifetime = 0; 


insert into zkm settings insert_deduplicate=0 values ('id1','repo1','2023-12-11 11:30:11') ; 
insert into zkm settings insert_deduplicate=0 values ('id1','repo1','2023-12-11 12:30:11') ; 
insert into zkm settings insert_deduplicate=0 values ('id2','repo1','2023-12-12 11:30:11') ;

 

此时可以看到对应路径中产生3个文件夹,分别时这3条insert产生的,如下:

其中有两条数据属于同一天即同一个分区。

[root@ck01 zkm]# ll
total 4
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:26 20231211_1_1_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:26 20231211_2_2_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:26 20231212_3_3_0
drwxr-x--- 2 clickhouse clickhouse   6 Dec 12 17:26 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec 12 17:26 format_version.txt

https://www.cnblogs.com/PiscesCanon/p/17898382.html

此时,执行optimize table final,文件夹all_1_1_0和all_2_2_0将被合并为all_1_2_1,

文件夹20231212_3_3_0被合并为20231212_3_3_1(没错,即便只有它自己一个同分区数据)。

ck01 :) optimize table zkm final;

OPTIMIZE TABLE zkm FINAL

Query id: 0aadfe30-c489-45d8-a063-d29f8a72b73d

Ok.

0 rows in set. Elapsed: 0.010 sec. 

[root@ck01 zkm]# ll
total 4
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:27 20231211_1_2_1
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:27 20231212_3_3_1
drwxr-x--- 2 clickhouse clickhouse   6 Dec 12 17:26 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec 12 17:26 format_version.txt

 

如果将上述optimize table final换成select final操作(可删除表zkm且重复执行脚本)。

此时:

[root@ck01 zkm]# ll
total 4
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231211_1_1_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231211_2_2_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231212_3_3_0
drwxr-x--- 2 clickhouse clickhouse   6 Dec 12 17:36 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec 12 17:36 format_version.txt

 

执行select final操作:

可以看到,select final并不会实际发生物理上的合并。

ck01 :) select * from zkm final;

SELECT *
FROM zkm
FINAL

Query id: b28a3986-39a6-4c0b-bf87-5474778317cf

┌─id──┬─repo──┬─────────CREATE_TIME─┐
│ id2 │ repo1 │ 2023-12-12 11:30:11 │
└─────┴───────┴─────────────────────┘
┌─id──┬─repo──┬─────────CREATE_TIME─┐
│ id1 │ repo1 │ 2023-12-11 12:30:11 │
└─────┴───────┴─────────────────────┘

2 rows in set. Elapsed: 0.006 sec. 

[root@ck01 zkm]# ll
total 4
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231211_1_1_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231211_2_2_0
drwxr-x--- 2 clickhouse clickhouse 259 Dec 12 17:36 20231212_3_3_0
drwxr-x--- 2 clickhouse clickhouse   6 Dec 12 17:36 detached
-rw-r----- 1 clickhouse clickhouse   1 Dec 12 17:36 format_version.txt

 

2.optimize table final只会对同个分片同个分区数据进行物理合并;select final则可以对同个分片不同分区的数据也会进行合并,但是不同分片即使满足合并条件也无法合并。

不讨论optimize table final,因为此语句因为只涉及物理合并因此只限定在单台ck服务器,讨论集群情况无意义。

这之前先介绍我实验环境的ck集群架构:

共4个节点,其中1,2互为副本(分片1),3,4互为副本(分片2)。

创建分布式表和本地表,并且在不同节点(即控制不同分片插入不同数据)插入数据。

CREATE TABLE zkm on cluster ceb_cluster
(
    `id` String DEFAULT 'NULL' COMMENT '用户编号',
    `repo` String DEFAULT 'NULL' COMMENT '仓库编号',
    `CREATE_TIME` DateTime DEFAULT '1971-01-01' COMMENT '数据建立时间'
)
ENGINE = Distributed('ceb_cluster', 'zkm', 'zkm_local', hiveHash(toYYYYMMDD(CREATE_TIME)));

CREATE TABLE zkm_local on cluster ceb_cluster
(
    `id` String DEFAULT 'NULL' COMMENT '用户编号',
    `repo` String DEFAULT 'NULL' COMMENT '仓库编号',
    `CREATE_TIME` DateTime DEFAULT '1971-01-01' COMMENT '数据建立时间'
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/ceb_cluster-{shard}/ceb/zkm_local', '{replica}')
PARTITION BY toYYYYMMDD(CREATE_TIME) 
ORDER BY id 
SETTINGS old_parts_lifetime = 0; 


行1:分片1(节点1或2执行):insert into zkm_local settings insert_deduplicate=0 values ('id1','jiedian1','2023-12-11 01:01:01'); 
行2:分片1(节点1或2执行):insert into zkm_local settings insert_deduplicate=0 values ('id1','jiedian2','2023-12-12 02:02:02'); 
行3:分片2(节点3或4执行):insert into zkm_local settings insert_deduplicate=0 values ('id1','jiedian3','2023-12-11 03:03:03'); 

 

其中,行1,2属于同一个分片,不同分区

         行1,3属于不同分片,物理上是不同分区,逻辑上则属于同一个分区

现在在节点1或者2执行如下语句,可以看到:

本地表可以看到行1,2,加上final的时候,即使行1,2属于不同分区也进行了合并

szeport-ck01 :) select * from zkm_local;

SELECT *
FROM zkm_local

Query id: 8324bd02-484a-49c9-af0f-b87a9f108d9d

┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian2 │ 2023-12-12 02:02:02 │
└─────┴──────────┴─────────────────────┘
┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian1 │ 2023-12-11 01:01:01 │
└─────┴──────────┴─────────────────────┘

2 rows in set. Elapsed: 0.004 sec. 

szeport-ck01 :) select * from zkm_local final;

SELECT *
FROM zkm_local
FINAL

Query id: a81e2185-ab0f-40ce-84f1-0f27867e4f90

┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian2 │ 2023-12-12 02:02:02 │
└─────┴──────────┴─────────────────────┘

1 row in set. Elapsed: 0.005 sec. 

 

现在在节点1或者2执行如下语句,可以看到:

查询分布式表加上final的时候,即使行2,3属于不同分区也没有合并,而行1,2则还是不同分区但是合并。

szeport-ck01 :) select * from zkm;

SELECT *
FROM zkm

Query id: d5b59807-f8cf-43fc-a6e1-e52095cf7da4

┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian2 │ 2023-12-12 02:02:02 │
└─────┴──────────┴─────────────────────┘
┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian1 │ 2023-12-11 01:01:01 │
└─────┴──────────┴─────────────────────┘
┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian3 │ 2023-12-11 03:03:03 │
└─────┴──────────┴─────────────────────┘

3 rows in set. Elapsed: 0.010 sec. 

szeport-ck01 :) select * from zkm final;

SELECT *
FROM zkm
FINAL

Query id: 45562a30-f11e-484a-867b-67b90ac7093a

┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian2 │ 2023-12-12 02:02:02 │
└─────┴──────────┴─────────────────────┘
┌─id──┬─repo─────┬─────────CREATE_TIME─┐
│ id1 │ jiedian3 │ 2023-12-11 03:03:03 │
└─────┴──────────┴─────────────────────┘

2 rows in set. Elapsed: 0.011 sec. 

 

从现象看原因,由于分布式查询select * from zkm final实际上是被拆分为select * from zkm_local final分到各个分片服务器上执行,最终在合并各个服务器的结果。

结合select final官方的说明:“而在select中当 FINAL 被指定,ClickHouse会在返回结果之前完全合并数据,从而执行给定表引擎合并期间发生的所有数据转换。”

select * from zkm_local在各自的分片查询后的返回结果的之前完全合并了数据,再合并汇总返回到执行select * from zkm final的节点(合并汇总则不会进行数据合并)。

因此,只有同个分片即便不同分区的数据能够合并,而不同分片即便从数值上看满足合并条件,但是依旧不会合并的原因。

 

至此。(头有点涨)

标签:zkm,12,id,select,ClickHouse,table,final,clickhouse
From: https://www.cnblogs.com/PiscesCanon/p/17898382.html

相关文章

  • CompletableFuture
    目录常用API创建异步任务获取任务结果异步回调处理【回调方法】有入参,有返回值有入参,无返回值无入参,无返回值异常可传递【有参、无返回】异常可传递【有参、有返回】多任务组合处理A、B任务均执行完才能执行CA、B任意一个执行完立马执行CN个任务执行完毕执行某个任务常用API创建......
  • 【flink番外篇】3、fflink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(2
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • 【flink番外篇】3、flink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(3)-
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • 异常关机clickhouse无法启动
    [169492]{}<Error>Application:DB::Exception:Suspiciouslymany(1416parts,0.00Bintotal)brokenpartstoremovewhilemaximumallowedbrokenpartscountis100.Youcanchangethemaximumvaluewithmergetreesetting'max_suspicious_b......
  • 如何将 sap.ui.Table 控件的背景设置成透明
    笔者曾经写过一篇文章,介绍了如何在SAPUI5应用里设置背景图片:下图1是背景图片,图2是把这个背景图片加到SAPUI5应用之后的效果。后来有朋友追问:如果我的SAPUI5应用里使用的表格控件,没有用响应式表格sap.m.Table,而是sap.ui.table.Table,那又该如何实现?其实思路和我本文的思......
  • ClickHouse(17)ClickHouse集成JDBC表引擎详细解析
    目录JDBC建表用法示例JDBC表函数资料分享参考文章JDBC允许CH通过JDBC连接到外部数据库。要实现JDBC连接,CH需要使用以后台进程运行的程序clickhouse-jdbc-bridge。该引擎支持Nullable数据类型。建表CREATETABLE[IFNOTEXISTS][db.]table_name(columnslist...)E......
  • 实验三:JFinal极速开发框架实验
    实验三:JFinal极速开发框架实验 (2023.12.13日完成)    根据参考资料,学习JFinal极速开发框架的使用并如下任务:    任务一:了解Maven及其使用方法,总结其功能作用(占20%)    任务二:学习JFinal框架,基于Maven建立JFinal工程,并对JFinal框架功能进行总结介绍(占30%)    任......
  • Confluence7.4.6突然爆事务隔离级别问题-解决方案-MySQL session isolation level 'RE
    MySQLsessionisolationlevel'REPEATABLE-READ'isnolongersupported.Sessionisolationlevelmustbe'READ-COMMITTED'.Seehttp://confluence.atlassian.com/x/GAtmDg  成功解决方案:查看http://confluence.atlassian.com/x/GAtmDgFORMYSQL8.X......
  • Oracle多层子查询无法识别外层table
    selectsomething,somthingelse,(select*from(selectQUOTE_PRICEasold_pricefromprice_historywhereprice_history.part_no=article_table.part_noorderbyvalid_fromdesc)whererownum=1)fromarticle_tab......
  • AT_cf17_final_j Tree MST 题解
    题意:给定一颗\(n\)个点的树,点\(i\)有权值\(a_{i}\),边有边权。现在有另外一个完全图,两点之间的边权为树上两点之间的距离加上树上两点的点权,求这张完全图的最小生成树。首先有一个很显然的暴力,把完全图中每两点之间的边权算出来,然后跑一边最小生成树,时间复杂度\(O(n^{2}\lo......