當對高基數(shù)列進行過濾查詢時,總是希望盡可能跳過更多的行。否則需要處理更多數(shù)據(jù)、需要更多資源。ClickHouse缺省在MergeTree表讀取8192行數(shù)據(jù)塊,但我們可以在創(chuàng)建表時調整該
index_granularity
參數(shù)。本文通過示例說明如何調整該參數(shù)優(yōu)化查詢性能。
index_granularity 參數(shù)默認值
下面示例,創(chuàng)建表并插入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倍數(shù)的行:
SELECT *
FROM deleteme
WHERE number IN (
SELECT number * 10000
FROM numbers(100000)
)
FORMAT `Null`
Query id: 11412bc3-05de-4790-9b65-06b139761e0c
Ok.
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行,意味著讀所有數(shù)據(jù)塊,大小800MB。
計算過程大概為,首先確定數(shù)據(jù)在哪個塊,因為默認8192,因此所有塊都有我們需要的數(shù)據(jù)。進入具體某個塊之后再次采用二分法進行查找,雖然算法選擇正確,但仍需要全表掃描。下面我們看減少index_granularity參數(shù)情況呢。
index_granularity=128
下面通過設置index_granularity=128,縮小處理數(shù)據(jù)量:
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 * 10000
FROM 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大小。極大地降低了查詢時間和計算成本。因為粒度變小,自動跳過了很多數(shù)據(jù)塊,具體到某個快時,數(shù)據(jù)量很小,查找速度自然很快,因此在這種場景下粒度小,查詢速度更快。當然,調整index_granularity也會帶來存儲成本,索引會變大,因此插入變慢。有時讀取較小的數(shù)據(jù)塊并不能提升查詢性能,這取決與查詢方式。盡管如此index_granularity是一個很好的技巧,可以使提升查詢性能。
總結
index_granularity參數(shù)默認為8192,在基數(shù)特別大的場景中,針對單條記錄查詢時,選擇較低的index_granularity參數(shù)值,會有效提升查詢性能。參考文檔:Minimize processed bytes with index granularity | ClickHouse Knowledge Base (tinybird.co)文章來源:http://www.zghlxwxcb.cn/news/detail-511870.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-511870.html
到了這里,關于優(yōu)化索引粒度參數(shù)提升ClickHouse查詢性能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!