优化索引粒度参数提升ClickHouse查询性能

news/2024/10/18 5:49:33/

当对高基数列进行过滤查询时,总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。ClickHouse缺省在MergeTree表读取8192行数据块,但我们可以在创建表时调整该index_granularity 参数。本文通过示例说明如何调整该参数优化查询性能。

index_granularity 参数默认值

下面示例,创建表并插入1亿条记录,从1到100M-1:

CREATE TABLE deleteme
(`number` UInt64
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number AS
SELECT number 
FROM numbers(100000000)

下面过滤行,条件为10000倍数的行:

SELECT *
FROM deleteme
WHERE number IN (SELECT number * 10000FROM numbers(100000)
)
FORMAT `Null`Query id: 11412bc3-05de-4790-9b65-06b139761e0cOk.0 rows in set. Elapsed: 1.211 sec. Processed 100.00 million rows, 800.00 MB (82.56 million rows/s., 660.45 MB/s.)

这里使用 FORMAT Null,我们仅想了解查询性能,无需返回结果。可以看到扫描了全表,这是因为index_granularity 默认为8192,大约10000行,意味着读所有数据块,大小800MB。

计算过程大概为,首先确定数据在哪个块,因为默认8192,因此所有块都有我们需要的数据。进入具体某个块之后再次采用二分法进行查找,虽然算法选择正确,但仍需要全表扫描。下面我们看减少index_granularity参数情况呢。

index_granularity=128

下面通过设置index_granularity=128,缩小处理数据量:

CREATE TABLE deleteme
(`number` UInt64
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number
SETTINGS index_granularity=128 AS
SELECT number
FROM numbers(100000000)

下面运行上面相同查询:

SELECT *
FROM deleteme
WHERE number IN (SELECT number * 10000FROM numbers(100000)
)
FORMAT `Null`0 rows in set. Elapsed: 0.785 sec. Processed 12.84 million rows, 102.73 MB (16.35 million rows/s., 130.81 MB/s.)

可以看到仅扫描了12.84百万行,仅102.73MB大小。极大地降低了查询时间和计算成本。因为粒度变小,自动跳过了很多数据块,具体到某个快时,数据量很小,查找速度自然很快,因此在这种场景下粒度小,查询速度更快。当然,调整index_granularity也会带来存储成本,索引会变大,因此插入变慢。有时读取较小的数据块并不能提升查询性能,这取决与查询方式。尽管如此index_granularity是一个很好的技巧,可以使提升查询性能。

总结

index_granularity参数默认为8192,在基数特别大的场景中,针对单条记录查询时,选择较低的index_granularity参数值,会有效提升查询性能。参考文档:Minimize processed bytes with index granularity | ClickHouse Knowledge Base (tinybird.co)


http://www.ppmy.cn/news/569882.html

相关文章

java game nokia 5233 model,诺基亚S60/^3完美运行GBA游戏教程 重回孩提时代

GameBoy游戏掌机在我们还是孩童时扮演着重要的角色,小编小时候也经常为了玩游戏而躲进被我最终被蒙得满头大汗,可是第二天到学校时依然兴致勃勃得和朋友们讨论游戏,虽然到现今当初的黑白掌机,彩机等已经逐渐落寞,可是那…

基于Nokia手机的移动游戏开发

基于Nokia手机的移动游戏开发(一) 一、游戏开发策略 1. 游戏动作(Action)的使用  MIDP的Canvas类让程序员处理某些按键事件,要么作为特定的低级键控代码事件要么作为抽象的游戏动作。FullCanvas是Nokia的全屏画布(FullCanvas)类,它是从Canvas类继承而…

操作系统——Windows 进程管理

一、实验题目 Windows 进程管理 二、实验目的 (1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟…

电路图中常见符号总结

前辈说不会FPGA电路原理图&#xff0c;就不能知道如何去控制、如何去实现 因此本篇记录看的原理图中见到的符号&#xff0c;虽然都很基础&#xff0c;但我都不会&#xff0c;难受&#xff0c;因此只能看一点记一点 >_< >_< >_< >_< >_&…

cpu的组成

运算器和控制器是组成CPU的两大核心部件。 一.运算器 运算器的基本功能是完成对各种数据的加工处理&#xff0c;例如算术四则运算&#xff0c;与、或、求反等逻辑运算&#xff0c;算术和逻辑移位操作&#xff0c;比较数值&#xff0c;变更符号&#xff0c;计算主存地址等。 …

【cpu概念】物理cpu个数、核数、逻辑cpu数的概念

首先要明确物理cpu个数、核数、逻辑cpu数的概念 1.物理cpu数&#xff1a;主板上实际插入的cpu数量&#xff0c;可以数不重复的 physical id 有几个&#xff08;physical id&#xff09; 2.cpu核数&#xff1a;单块CPU上面能处理数据的芯片组的数量&#xff0c;如双核、四核等 …

计算机里面CPU是什么意思,cpu是什么 cpu是什么意思详细介绍

最近发现有网友在QQ群里问&#xff0c;cpu是什么&#xff1f;得到不少网友的炮轰&#xff0c;在这电脑满地有的年头竟然还有人不知道cpu是什么&#xff1f;不过笔者觉得对于不常接触电脑的朋友&#xff0c;确实很可能不知道cpu是什么意思&#xff0c;如果大家都没接触过电脑&am…

CPU概述

CPU 概述 1. CPU 基础 CPU 的概念 CPU 是最重要的计算机组件&#xff0c;由控制器和运算器组成&#xff0c;通过总线与其它设备连接。 CPU 与南北桥 所谓的桥&#xff0c;都是 cpu 和其它设备连接这样的一个桥梁。分为南北桥。 什么是南桥&#xff1f; 南桥主要是用来连接…