当前位置: 首页 > 科技观察

ClickHouse的查询性能优势

时间:2023-03-16 23:04:10 科技观察

01向量化引擎在存储引擎设计方面,ClickHouse采用了基于列存储的存储结构设计。在很多场景下,列存大大减少了数据分析时的数据读取量。图1显示了列存储与行存储相比减少数据量的原理。显然,在宽表场景下,由于行存在提取某些列时必须读取该行的所有列,因此读取了大量无效数据(图1行存方案中没有▲的深色方块数据为不参与计算的无效列),降低了读取效率。▲图1列存和行存对比在计算引擎的设计上,ClickHouse首次使用了向量化计算引擎。矢量化计算引擎的计算原理如图2所示,借助于CPU提供的SIMD技术,可以充分发挥现代计算机体系结构的优势,最大限度地发挥单机性能。▲图2SIMD加速原理示意图。ClickHouse压榨了单机的性能,使得ClickHouse在单机部署的情况下可以处理非常大量的数据。实际使用中,基本上100亿以内的数据表单机就可以搞定。这种级别的单机处理能力已经可以满足很多企业的需求。这也很大程度上解决了传统大数据仓库带来的效率低、成本高的问题。02高效的数据压缩列存储给ClickHouse带来的另一个非常明显的优势就是数据压缩空间大大提升。列存储的本质是将同一列的数据存储在连续的空间中。与行存储相比,列存储在连续空间中更加规则。并且常规存储带来了更大的压缩比。从而大大减小了压缩数据的大小,大大减少了磁盘I/O时间。在实际项目中,笔者基本可以做到8:1的压缩比,即8T的数据只需要1T的存储空间。这提高了计算效率,同时降低了存储成本。与Hadoop的三副本策略相比,存储成本大大降低。读者可能会有这样的疑问:Hadoop的三副本可以保证数据不丢失,但是ClickHouse的存储不能保证数据不丢失,那么两者可以放在一起比较吗?这个问题有一定的道理。两者的应用场景不同,面临的问题也不同。如果Hadoop需要发挥其能力,就必须有一个庞大的集群来摊销低效带来的额外处理时间,这意味着集群中任何一台机器故障都可能导致集群不可用。从概率的角度,假设一台机器的故障率为1%,那么100台机器出现一次故障的概率接近100%。可见,在一个庞大的Hadoop集群中,必须考虑机器故障。但ClickHouse不同。ClickHouse在设计时倾向于压榨单机的性能,使用单机来解决很多场景下的问题。这种设计使得单个ClickHouse的故障概率只有1%,可以在一定程度上忽略机器故障。当然,读者需要根据业务需求具体场景具体分析。如果确实需要保证数据不丢失,可以使用RAID提供物理层面的保护,或者使用ClickHouse提供的复制表从软件上解决这个问题。简而言之,ClickHouse提供了一种更灵活的机制。03高效的I/O优化ClickHouse的超高压缩率带来了更低的数据存储成本和更低的I/O时间,但也带来了额外的计算开销——解压。数据被压缩存储在磁盘上,意味着压缩后的数据读取后不能直接获取内容,不能参与分析的计算。必须先解压还原成原始数据,才能参与计算分析。那么如何最大限度地减少压缩时间,甚至在数据被程序读取之前过滤掉一些不相关的数据,就成为了具有压缩能力的存储引擎面临的一大挑战。ClickHouse通过基于LSM技术的稀疏索引解决了这一挑战。LSM技术保证数据在写入磁盘之前按要求排序,这意味着数据仓库中非常常见的范围查询场景可以减少非常大量的I/O时间,从而提高查询速度。本文节选自《ClickHouse性能之巅:从架构设计解读性能之谜》,经发布者授权发布。(ISBN:9787111716587)转载请保留文章出处。作者简介:陈峰,资深大数据专家和架构师,ClickHouse技术专家,地扑科技(2B领域独角兽)合伙人兼首席架构师。《ClickHouse性能之巅:从架构设计解读性能之谜》作者。