Clickhouse查询语句执行过程

问题

简述clickhosue中一条select语句的执行过程,使用的引擎是ReplacingMergeTree。例如:

sql 复制代码
select col1,col2 from table final
prewhere col3 > ? and col4 = ? and col5 = ? -- col3为分区键,col4为二级索引,col5为主键字段
where col6 = ? 
order by col7;

回答

  1. 分区过滤。根据col3确定分区,这一步在内存中完成
  2. 一级索引过滤granularity。根据col5字段从分区中过滤出来符合条件的granularity,这个也是在内存中完成
  3. 二级索引过滤granularity。从磁盘上读取col4,对granularity再次进行过滤。这个会进行磁盘的IO操作
  4. prewhere其他条件过滤。如果prewhere还有其他的字段,就从磁盘上读取出来,再次进行granularity的过滤
  5. 读取其他所有需要的字段并进行final合并。读取select中的所有字段和where中要使用的字段,读取主键的所有字段,以及version字段,按version对数据进行merge操作
  6. where过滤数据。使用col6字段进行过滤
  7. 对数据进行order by或者group操作返回数据

注意

  1. 上述只有第一步和第二步,即分区过滤和一级索引过滤,是在内存中完成的,其他均需要进行IO操作
  2. 需要注意final是在prewhere之后,where之前起作用
  3. prewhere之后,final之前会读取当前sql所需要的所有字段
相关推荐
一生有你20204 小时前
powerdesigner使用逆向工程生成物理模型
数据库
zcn1264 小时前
时间条件高效用法
数据库·sql优化改写
zcn1265 小时前
消除无关列
数据库·sql优化改写
哈库纳玛塔塔5 小时前
dbVisitor 利用 queryForPairs 让键值查询一步到位
java·数据库·python
Moshow郑锴5 小时前
pgsql常见查询索引优化(等值条件+范围条件)
数据库·sql·mysql
sa100275 小时前
京东评论接口调用、签名生成与异常处理
开发语言·数据库·python
天竺鼠不该去劝架5 小时前
RPA 平台选型指南(2026):金智维 vs 来也RPA vs 艺赛旗 vs 阿里云 RPA 深度对比
大数据·数据库·人工智能
tod1136 小时前
Redis 持久化机制深度解析(RDB / AOF)
数据库·redis·缓存
❀͜͡傀儡师6 小时前
一个基于PostgreSQL的轻量级消息队列(PGMQ)
数据库·postgresql·pgmq
哈库纳玛塔塔6 小时前
dbVisitor 统一数据库访问库,更新 v6.7.0,面向 AI 支持向量操作
数据库·spring boot·orm