专业江西网站建设,聊城企业做网站,网站如何跟域名绑定,用python写一个简单的网页当对高基数列进行过滤查询时#xff0c;总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。ClickHouse缺省在MergeTree表读取8192行数据块#xff0c;但我们可以在创建表时调整该index_granularity 参数。本文通过示例说明如何调整该参数优化查询性能。 inde… 当对高基数列进行过滤查询时总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。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 NullQuery 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_granularity128
下面通过设置index_granularity128缩小处理数据量
CREATE TABLE deleteme
(number UInt64
)
ENGINE MergeTree
PARTITION BY number % 10
ORDER BY number
SETTINGS index_granularity128 AS
SELECT number
FROM numbers(100000000)下面运行上面相同查询
SELECT *
FROM deleteme
WHERE number IN (SELECT number * 10000FROM numbers(100000)
)
FORMAT Null0 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)