Author: Alexey Milovidov, 2026-01-29.
1. (40 min) What's new in ClickHouse 26.1.
2. (15 min) Guest Talk.
3. (5 min) Q&A.
ClickHouse New Year Release.
β 25 new features π§€
β 43 performance optimizations π·
β 176 bug fixes β
A system table with the status of all Keeper clusters:
:) SELECT * FROM system.zookeeper_info
Row 1:
ββββββ
zookeeper_cluster_name: zookeeper
host: localhost
port: 9181
index: 0
is_connected: 1
is_readonly: 0
version: v26.2.1.90-testing-a44e1bd7dee6266e9b6871a1f38513e1affffd68
avg_latency: 1
max_latency: 100
min_latency: 0
packets_received: 4598
packets_sent: 4738
outstanding_requests: 0
server_state: standalone
is_leader: 0
znode_count: 20284
watch_count: 276
ephemerals_count: 198
approximate_data_size: 5693491 -- 5.69 million
followers: 0
synced_followers: 0
pending_syncs: 0
open_file_descriptor_count: 247
max_file_descriptor_count: 1048576 -- 1.05 million
connections: 3
outstanding: 0
zxid: 423177742 -- 423.18 million
node_count: 20284
snapshot_dir_size: 2391089 -- 2.39 million
log_dir_size: 66881215 -- 66.88 million
first_log_idx: 423011138 -- 423.01 million
first_log_term: 423011138 -- 423.01 million
last_log_idx: 423178091 -- 423.18 million
last_log_term: 61
last_committed_idx: 423178091 -- 423.18 million
leader_committed_log_idx: 423178091 -- 423.18 million
target_committed_log_idx: 423178091 -- 423.18 million
last_snapshot_idx: 423111137 -- 423.11 million
Developer: Smita Kulkarni.
A function to reverse a delimited collection without conversion to an array:
:) SELECT reverseBySeparator('benchmark.clickhouse.com', '.') AS x
βββββββββββββββββββββββββxββ
β com.clickhouse.benchmark β
ββββββββββββββββββββββββββββ
:) SELECT arrayStringConcat(reverse(splitByChar('.',
'benchmark.clickhouse.com')), '.') AS x
βββββββββββββββββββββββββxββ
β com.clickhouse.benchmark β
ββββββββββββββββββββββββββββ
Developer: Xuewei Wang.
:) SELECT * FROM mergeTreeAnalyzeIndexes(
default, github_events, repo_name = 'ClickHouse/ClickHouse')
ββpart_nameβββββββββ¬βrangesββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. β all_0_0_0_288 β [(101,102),(2149,2150),(6938,6940),(81644,81645),(82552,82554),(98109,98110),(98682,98684),(111296,111297),(111463,111464),(113961,113962),(115571,115577),(151317,151318),(152244,152249),(170872,170873),(171030,171031),(173074,173075),(173154,173155),(174256,174257),(178103,178109),(247897,247898),(248501,248506),(259806,259807),(274355,274360),(532740,532741),(532853,532854),(535098,535099),(536530,536532),(571276,571277),(571723,571724),(572095,572096),(572097,572098),(572126,572127),(572374,572377),(576704,576705),(576708,576709),(576710,576711),(576783,576784),(576785,576786)] β
2. β all_1_1_0_288 β [(0,1),(10,11),(12,15),(18,19),(20,22),(27,29),(35,36),(97,99),(102,103)] β
3. β all_2_2_0_288 β [(0,1),(8,9),(32,33),(295,296),(300,301),(364,365),(366,367),(390,392),(394,395),(399,400),(504,505),(506,507),(548,549),(553,555),(561,562),(570,571),(724,726),(754,755),(899,900),(2569,2570),(2583,2584),(2589,2590),(2705,2706),(2708,2709)] β
4. β all_3_3_0_288 β [(0,2),(9,13),(15,18),(21,22),(26,27),(98,100),(103,105)] β
5. β all_4_4_0_288 β [(21,22),(309,310),(1041,1043),(10038,10039),(10139,10140),(12283,12284),(12336,12337),(13150,13151),(13161,13162),(13273,13274),(13437,13440),(16622,16623),(16713,16715),(18145,18146),(18168,18169),(18391,18392),(18414,18415),(18644,18645),(18959,18961),(23993,23994),(24050,24051),(25091,25092),(28968,28970),(69144,69145),(69166,69167),(69555,69556),(69754,69755),(73151,73152),(73260,73261)] β
6. β all_5_5_0_288 β [(55,56),(854,855),(2423,2424),(22336,22337),(22568,22570),(27126,27127),(27235,27236),(29086,29087),(29108,29109),(29340,29341),(29685,29688),(36379,36380),(36534,36535),(38985,38986),(39019,39020),(39377,39378),(39411,39412),(39791,39792),(40633,40636),(54237,54238),(54346,54348),(56193,56194),(61070,61073),(126787,126788),(126821,126822),(127487,127488),(127789,127791),(133695,133696),(133893,133896)] β
7. β all_6_6_0_288 β [(64,65),(893,894),(2721,2723),(24902,24903),(25233,25234),(31163,31164),(31303,31304),(33388,33389),(33413,33414),(33671,33672),(34073,34077),(41345,41346),(41563,41565),(44692,44693),(44744,44745),(45311,45312),(45364,45365),(45906,45907),(46655,46658),(58348,58349),(58477,58479),(60760,60761),(70262,70265),(174990,174991),(175039,175040),(175937,175938),(176483,176485),(185391,185392),(185638,185641)] β
8. β all_7_2820_6_288 β [(12,13),(207,208),(2688,2691),(32469,32470),(32825,32828),(39431,39432),(39612,39613),(42083,42084),(42113,42114),(42408,42409),(42966,42971),(53131,53132),(53548,53550),(61175,61176),(61262,61263),(62000,62001),(62085,62086),(62930,62931),(64059,64063),(81149,81150),(81337,81340),(84816,84817),(98635,98639),(257258,257259),(257337,257338),(258876,258877),(259517,259519),(270277,270278),(270606,270610),(278471,278472)] β
ββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Why do we need this function if we already have EXPLAIN ESTIMATE query?
— for distributed index analysis with parallel replicas!
Developer: Azat Khuzhin.
play-eu :) SELECT name, rows, marks, bytes, files FROM system.parts
WHERE database = 'default' AND table = 'github_events'
ββnameββββββββββββββ¬βββββββrowsββ¬ββmarksββ¬ββββββββbytesββ¬βfilesββ
1. β all_0_0_0_288 β 4430017383 β 576807 β 332974330897 β 145 β
2. β all_1_1_0_288 β 853559 β 108 β 77871986 β 196 β
3. β all_2_2_0_288 β 22523075 β 2783 β 1618742341 β 196 β
4. β all_3_3_0_288 β 855252 β 107 β 42151604 β 202 β
5. β all_4_4_0_288 β 612539497 β 75810 β 45082755883 β 188 β
6. β all_5_5_0_288 β 1082739624 β 138264 β 123406140554 β 145 β
7. β all_6_6_0_288 β 1546160205 β 191296 β 101227190998 β 198 β
8. β all_7_2820_6_288 β 2225987644 β 278473 β 157837202094 β 192 β
ββββββββββββββββββββ΄βββββββββββββ΄βββββββββ΄βββββββββββββββ΄ββββββββ
Developer: Gayan Match.
25.12:
CREATE TABLE pageviews (
CounterID UInt32,
UserID UInt64,
EventTime DateTime,
PROJECTION by_time (
SELECT _part_offset ORDER BY EventTime
)
) ORDER BY (CounterID, UserID, EventTime)
26.1:
CREATE TABLE pageviews (
CounterID UInt32,
UserID UInt64,
EventTime DateTime,
PROJECTION by_time INDEX EventTime TYPE basic,
) ORDER BY (CounterID, UserID, EventTime)
Developer: Amos Bird.
:) SELECT [1, 'hello'] AS x, toTypeName(x)
ββxββββββββββββ¬βtoTypeName(x)ββββββββββββββββββ
β [1,'hello'] β Array(Variant(String, UInt8)) β
βββββββββββββββ΄ββββββββββββββββββββββββββββββββ
:) SELECT number % 2 ? 'Hello' : ['Hello', 'world'] AS x,
length(x) FROM numbers(2)
ββxββββββββββββββββββ¬βlength(x)ββ
β ['Hello','world'] β 2 β
β Hello β 5 β
βββββββββββββββββββββ΄ββββββββββββ
Developer: Bharat Nallan.
We always allowed Tuples to contain Nullable types.
In 26.1, Tuple itself can be Nullable.
:) SET allow_experimental_nullable_tuple_type = 1;
:) CREATE TABLE test (id UInt32, data Nullable(Tuple(String, Int64)));
:) INSERT INTO test VALUES (1, ('hello', 42)), (2, NULL);
:) SELECT * FROM test
ββidββ¬βdataββββββββββ
β 1 β ('hello',42) β
β 2 β α΄Ία΅α΄Έα΄Έ β
ββββββ΄βββββββββββββββ
What for? — for compatibility with external data formats and data lakes.
Developer: Nihal Z. Miaji.
A data type for vector embeddings,
that allows tuning the search precision at runtime.
CREATE TABLE vectors (
id UInt64, name String, ...
vec QBit(BFloat16, 1536)
) ORDER BY ();
SELECT id, name FROM vectors
ORDER BY L2DistanceTransposed(vector, target, 10)
LIMIT 10;
A new function in 26.1: cosineDistanceTransposed.
Developer: Raufs Dunamalijevs.
Use Array(String) / Array(FixedString) columns just as usual:
CREATE TABLE tab
(
key UInt64,
val Array(String),
INDEX idx(val) TYPE text(
tokenizer = 'splitByNonAlpha', preprocessor = lower(val))
);
And search within your Array columns:
SELECT count() FROM tab WHERE hasAllTokens(val, 'clickhouse');
Developer: Jimmy Aguilar Mena.
We already optimize the GROUP BY operator over LowCardinality columns.
Now we optimize the DISTINCT operator as well.
Demo
Developer: Nihal Z. Miaji.
There are two methods for building fast analytical databases:
1. Vectorization. 2. JIT compilation.
ClickHouse uses both.
Now JIT compilation is extended to: aggregate functions over Nullable, Decimal and big integer data types, comparisons, type conversions, and many more functions.
Developers: TaiYang Li, Alexey Milovidov.
Helps with insertion into very wide tables.
Example: 30 times memory reduction when inserting into system.metric_log
— a table with 1592 columns.
Developer: Azat Khuzhin.
The server can be configured with concurrent_threads_scheduler,
which gives better latency distribution on highly concurrent queries:
$ cat config.d/scheduler.yaml
concurrent_threads_scheduler: max_min_fair
Developer: Sergei Trifonov.
CREATE TABLE stackoverflow.posts (
...
Body String,
INDEX idx_body Body TYPE text(
tokenizer = sparseGrams(3, 20, 5),
preprocessor = lower(Body))
)
ORDER BY (PostTypeId, toDate(CreationDate), CreationDate)
Similar to ngrams, but in addition to short n-grams, also adds some of selected longer (n+1, n+2, ...) ngrams.
During the search, it can take the longest ngrams from the search string, and ignore covered shorter ngrams. It will use a less number of more specific, rare tokens for searching.
Developers: Anton Popov, Konstantin Vedernikov.
:) SELECT '"' || arrayJoin(sparseGrams('ClickHouse is a good database!', 3, 20, 5))
|| '"' AS gram
ββgramββββββββββββββββββββββ
1. β "lickHo" β
2. β "House " β
3. β "e is a" β
4. β "House is a" β
5. β "lickHouse is a" β
6. β " good" β
7. β " good " β
8. β " a good " β
9. β "lickHouse is a good " β
10. β "lickHouse is a good da" β
11. β "tabas" β
12. β "atabas" β
13. β "databas" β
ββββββββββββββββββββββββββββ
Developers: Anton Popov, Konstantin Vedernikov.
Example: searching code in 68 GB of StackOverflow posts:
SELECT Tags FROM stackoverflow.posts_ngrams
WHERE Body LIKE '%(*(void(*)())0)()%' AND NOT empty(Tags)
ORDER BY Tags
With ngrams tokenizer: 65 ms.
With sparseGrams tokenizer: 51 ms.
Developers: Anton Popov, Konstantin Vedernikov.
$ cat config.d/keeper_api.yaml
keeper_server:
http_control:
port: 9182
# secure_port: 9183
Demo
Developers: Alexander Tolkachev, Artem Brustovetskii.
Asynchronous inserts (enabled with async_insert) collect data from multiple concurrent clients, and write it as a single batch. This allows serving frequent small inserts.
They also provide idempotency with the async_insert_deduplicate setting. It can use either a hash of the inserted data or a custom idempotency token.
So the INSERTs can be safely retried, and keep exactly-once semantic.
Since version 26.1, the exactly-once semantic extends to all
materialized views attached to a table.
Developer: Sema Checherinda.
Developer: Jiaqi Tang.
Developer: Kseniia Sumarokova.
Developer: Konstantin Vedernikov.
In addition to SQL, chDB now implements Pandas API.
It builds a lazy pipeline from Pandas transformations,
and runs it with the ClickHouse speed!
import datastore as pd # That's it! Use pandas API as usual
Developer: Auxten.
The official ClickHouse Kubernetes operator:
https://github.com/ClickHouse/clickhouse-operator
Automated Cluster Provisioning: multi-node with sharding and replication.
ClickHouse Keeper Support: deploy and manage ClickHouse Keeper.
Vertical & Horizontal Scaling: adjust CPU / Memory resources or shards.
Configuration Management: in a single manifest change.
Seamless Upgrades: rolling updates without dropping queries.
Developer: Grigory Pervakov.
— π§πͺ Iceberg Meetup, Brussels, Jan 30
— π§πͺ FOSDEM 2026, Brussels, Jan 31..Feb 1
— πͺπΈ Barcelona, Feb 5
— π¬π§ London, Feb 10
— πΊπΈ San Francisco AI night, Feb 11
— π¨π¦ Toronto, Feb 19
— π¦πΊ Melbourne, Feb 24
— πΊπΈ Seattle, Feb 26
— Christmas gifts from the ClickHouse team
— Solving Advent Of Code in ClickHouse SQL
— Optimization of Top-N queries: low-level details
— PostgreSQL + ClickHouse as the unified data stack
— Ramp rebuilt its analytics platform on ClickHouse
— ClickPy at 2 Trillion rows
— Technology blogs - a reading list from ClickHouse authors
— LaunchDarkly, Polymarket, Buildkite, Picnic — why everyone use ClickHouse?
— Projections as secondary indices