ClickHouse: Release 26.1 Call

Author: Alexey Milovidov, 2026-01-29.

ClickHouse Release 26.1

ClickHouse release 26.1

1. (40 min) What's new in ClickHouse 26.1.

2. (15 min) Guest Talk.

3. (5 min) Q&A.

Release 26.1

ClickHouse New Year Release.

β€” 25 new features 🧀

β€” 43 performance optimizations πŸ›·

β€” 176 bug fixes β›„

Small Gifts

A new system table: zookeeper_info

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 new function: reverseBySeparator

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.

Table function: mergeTreeAnalyzeIndexes

:) 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.

Information on files in system.parts

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.

New syntax for indexing projections

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.

Improvements for data types

Support for Variant in all functions

:) 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.

Tuple can be Nullable

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.

QBit is promoted to Beta

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.

Text index on Arrays

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.

Performance Improvements

Faster DISTINCT over LowCardinality

We already optimize the GROUP BY operator over LowCardinality columns.

Now we optimize the DISTINCT operator as well.

Demo

Developer: Nihal Z. Miaji.

Extended JIT compilation

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.

Adaptive write buffer size

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.

Max-Min Scheduler

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.

Something Interesting

sparseGrams tokenizer in text Index

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.

sparseGrams tokenizer in text Index

:) 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.

sparseGrams tokenizer in text Index

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.

Web UI and HTTP interface for Keeper

$ cat config.d/keeper_api.yaml keeper_server: http_control: port: 9182 # secure_port: 9183

Demo

Developers: Alexander Tolkachev, Artem Brustovetskii.

Deduplication of asynchronous inserts with materialized views

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.

Data Lakes

Data Lakes

Paimon REST Catalog πŸ§ͺ

Developer: Jiaqi Tang.

Deletion vectors in Delta Lake

Developer: Kseniia Sumarokova.

Support for Google Cloud Storage

Developer: Konstantin Vedernikov.

Guest Talk

Bonus

Pandas API in chDB

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.

Open-source Kubernetes operator

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.

BigQuery connector in ClickPipes

Meetups

— πŸ‡§πŸ‡ͺ 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

Reading Corner πŸ“–

https://clickhouse.com/blog/

— 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

Q&A