From 337509560cb23cadb6fbe2dae7b7815f798478e3 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:55:04 +0200 Subject: [PATCH 01/29] add new section for POC onboarding --- docs/cloud/onboard/01_Discover/01_what_is.md | 46 ++++++++++++++++++ .../use_cases/01_real-time-analytics.md | 46 ++++++++++++++++++ .../01_Discover/use_cases/02_observability.md | 6 +++ .../use_cases/03_data_lake_and_warehouse.md | 6 +++ .../04_machine_learning_and_genAI.md | 6 +++ sidebars.js | 16 ++++++ .../onboard/discover/use_cases/0_rta.png | Bin 0 -> 17549 bytes .../onboard/discover/use_cases/1_rta.png | Bin 0 -> 14785 bytes .../onboard/discover/use_cases/2_rta.png | Bin 0 -> 87856 bytes .../onboard/discover/use_cases/3_rta.png | Bin 0 -> 60351 bytes .../onboard/discover/use_cases/4_rta.png | Bin 0 -> 88011 bytes 11 files changed, 126 insertions(+) create mode 100644 docs/cloud/onboard/01_Discover/01_what_is.md create mode 100644 docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md create mode 100644 docs/cloud/onboard/01_Discover/use_cases/02_observability.md create mode 100644 docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md create mode 100644 docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md create mode 100644 static/images/cloud/onboard/discover/use_cases/0_rta.png create mode 100644 static/images/cloud/onboard/discover/use_cases/1_rta.png create mode 100644 static/images/cloud/onboard/discover/use_cases/2_rta.png create mode 100644 static/images/cloud/onboard/discover/use_cases/3_rta.png create mode 100644 static/images/cloud/onboard/discover/use_cases/4_rta.png diff --git a/docs/cloud/onboard/01_Discover/01_what_is.md b/docs/cloud/onboard/01_Discover/01_what_is.md new file mode 100644 index 00000000000..7ee8a59cd7d --- /dev/null +++ b/docs/cloud/onboard/01_Discover/01_what_is.md @@ -0,0 +1,46 @@ +--- +slug: /cloud/get-started/cloud/what-is-clickhouse-cloud +title: 'Overview' +keywords: ['clickhouse cloud', 'what is clickhouse cloud', 'clickhouse cloud overview', 'clickhouse cloud features'] +hide_title: true +--- + +## What is ClickHouse Cloud? + +ClickHouse Cloud is a fully managed cloud service created by the original creators +of ClickHouse, the fastest and most popular open-source columnar online analytical +processing database. + +With Cloud, infrastructure, maintenance, scaling, and operations are taken care of +for you, so that you can focus on what matters most to you, which is building value +for your organization and your customers faster. + +## Benefits of ClickHouse Cloud + +ClickHouse Cloud offers several major benefits over the open-source version: + +- **Fast time to value**: Start building instantly without having to size and scale your cluster. +- **Seamless scaling**: Automatic scaling adjusts to variable workloads so you don't have to over-provision for peak usage. +- **Serverless operations**: Sit back while we take care of sizing, scaling, security, reliability, and upgrades. +- **Transparent pricing**: Pay only for what you use, with resource reservations and scaling controls. +- **Total cost of ownership**: Best price / performance ratio and low administrative overhead. +- **Broad ecosystem**: Bring your favorite data connectors, visualization tools, SQL and language clients with you. + +## OSS vs ClickHouse Cloud comparison {#oss-vs-clickhouse-cloud} + +| Feature | Benefits | OSS ClickHouse | ClickHouse Cloud | +|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|-------------------| +| **Deployment modes** | ClickHouse provides the flexibility to self-manage with open-source or deploy in the cloud. Use ClickHouse local for local files without a server or chDB to embed ClickHouse directly into your application. | ✅ | ✅ | +| **Storage** | As an open-source and cloud-hosted product, ClickHouse can be deployed in both shared-disk and shared-nothing architectures. | ✅ | ✅ | +| **Monitoring and alerting** | Monitoring and alerting about the status of your services is critical to ensuring optimal performance and a proactive approach to detect and triage potential issues. | ✅ | ✅ | +| **ClickPipes** | ClickPipes is ClickHouse's managed ingestion pipeline that allows you to seamlessly connect your external data sources like databases, APIs, and streaming services into ClickHouse Cloud, eliminating the need for managing pipelines, custom jobs, or ETL processes. It supports workloads of all sizes. | ❌ | ✅ | +| **Pre-built integrations** | ClickHouse provides pre-built integrations that connect ClickHouse to popular tools and services such as data lakes, SQL and language clients, visualization libraries, and more. | ❌ | ✅ | +| **SQL console** | The SQL console offers a fast, intuitive way to connect, explore, and query ClickHouse databases, featuring a slick caption, query interface, data import tools, visualizations, collaboration features, and GenAI-powered SQL assistance. | ❌ | ✅ | +| **Compliance** | ClickHouse Cloud compliance includes CCPA, EU-US DPF, GDPR, HIPAA, ISO 27001, ISO 27001 SoA, PCI DSS, SOC2. ClickHouse Cloud's security, availability, processing integrity, and confidentiality processes are all independently audited. Details: trust.clickhouse.com. | ❌ | ✅ | +| **Enterprise-grade security** | Support for advanced security features such as SSO, multi-factor authentication, role-based access control (RBAC), private and secure connections with support for Private Link and Private Service Connect, IP filtering, customer-managed encryption keys (CMEK), and more. | ❌ | ✅ | +| **Scaling and optimization** | Seamlessly scales up or down based on workload, supporting both horizontal and vertical scaling. With automated backups, replication, and high availability, ClickHouse, it provides users with optimal resource allocation. | ❌ | ✅ | +| **Support services** | Our best-in-class support services and open-source community resources provide coverage for whichever deployment model you choose. | ❌ | ✅ | +| **Database upgrades** | Regular database upgrades are essential to establish a strong security posture and access the latest features and performance improvements. | ❌ | ✅ | +| **Backups** | Backups and restore functionality ensures data durability and supports graceful recovery in the event of outages or other disruptions. | ❌ | ✅ | +| **Compute-compute separation** | Users can scale compute resources independently of storage, so teams and workloads can share the same storage and maintain dedicated compute resources. This ensures that the performance of one workload doesn't interfere with another, enhancing flexibility, performance, and cost-efficiency. | ❌ | ✅ | +| **Managed services** | With a cloud-managed service, teams can focus on business outcomes and accelerate time-to-market without having to worry about the operational overhead of sizing, setup, and maintenance of ClickHouse. | ❌ | ✅ | diff --git a/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md new file mode 100644 index 00000000000..896fc27b7ac --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md @@ -0,0 +1,46 @@ +--- +slug: /cloud/get-started/cloud/use-cases/real-time-analytics +title: 'Real-time analytics' +keywords: [] +sidebar_label: 'Real-time analytics' +--- + +import Image from '@theme/IdealImage'; + +## What is real-time analytics? + +Real-time analytics refers to data processing that delivers insights to end users +and customers as soon as the data is generated. It differs from traditional or +batch analytics, where data is collected in batches and processed, often a long +time after it was generated. + +Real-time analytics systems are built on top of event streams, which consist of +a series of events ordered in time. An event is something that’s already happened. +It could be the addition of an item to the shopping cart on an e-commerce website, +the emission of a reading from an Internet of Things (IoT) sensor, or a shot on +goal in a football (soccer) match. + +An event (from an imaginary IoT sensor) is shown below, as an example: + +```json +{ + "deviceId": "sensor-001", + "timestamp": "2023-10-05T14:30:00Z", + "eventType": "temperatureAlert", + "data": { + "temperature": 28.5, + "unit": "Celsius", + "thresholdExceeded": true + } +} +``` + +Organizations can discover insights about their customers by aggregating and +analyzing events like this. This has traditionally been done using batch analytics, +and in the next section, we’ll compare batch and real-time analytics. + +## Real-Time analytics vs batch analytics + +The diagram below shows what a typical batch analytics system would look like +from the perspective of an individual event: + diff --git a/docs/cloud/onboard/01_Discover/use_cases/02_observability.md b/docs/cloud/onboard/01_Discover/use_cases/02_observability.md new file mode 100644 index 00000000000..421d302963d --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/02_observability.md @@ -0,0 +1,6 @@ +--- +slug: /cloud/get-started/cloud/use-cases/observability +title: 'Observability' +keywords: [] +sidebar_label: 'Observability' +--- \ No newline at end of file diff --git a/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md new file mode 100644 index 00000000000..1c06bc82b02 --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md @@ -0,0 +1,6 @@ +--- +slug: /cloud/get-started/cloud/use-cases/data_lake_and_warehouse +title: 'Data Lake and Warehousing' +keywords: [] +sidebar_label: 'Data lake and warehousing' +--- \ No newline at end of file diff --git a/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md b/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md new file mode 100644 index 00000000000..9bb65f9b2fb --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md @@ -0,0 +1,6 @@ +--- +slug: /cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai +title: 'Machine learning and generative AI' +keywords: [] +sidebar_label: 'Machine learning and generative AI' +--- \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index efaf1030cc9..d421ce9a2f7 100644 --- a/sidebars.js +++ b/sidebars.js @@ -257,6 +257,22 @@ const sidebars = { ], cloud: [ + { + type: "category", + label: "Get Started", + collapsed: false, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "cloud/onboard/01_Discover", + }, + { + type: "autogenerated", + dirName: "cloud/onboard/02_migrate", + } + ] + }, { type: "category", label: "Get Started", diff --git a/static/images/cloud/onboard/discover/use_cases/0_rta.png b/static/images/cloud/onboard/discover/use_cases/0_rta.png new file mode 100644 index 0000000000000000000000000000000000000000..d294c84d49da4dab697ec609009de2ad168d74e3 GIT binary patch literal 17549 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 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/1_rta.png b/static/images/cloud/onboard/discover/use_cases/1_rta.png new file mode 100644 index 0000000000000000000000000000000000000000..524a35b5ae3ad855eb3422c3435cbbf7da5f1d4a GIT binary patch literal 14785 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 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/2_rta.png b/static/images/cloud/onboard/discover/use_cases/2_rta.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5c7e2e1f91498274562ac31039477c634eadcb GIT binary patch literal 87856 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 Fe*u#a>(l@M literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/3_rta.png b/static/images/cloud/onboard/discover/use_cases/3_rta.png new file mode 100644 index 0000000000000000000000000000000000000000..6c31e82a3cc92d4e6f64f2597846fcc0138db3e7 GIT binary patch literal 60351 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 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/4_rta.png b/static/images/cloud/onboard/discover/use_cases/4_rta.png new file mode 100644 index 0000000000000000000000000000000000000000..78baae8cfb1c13817613b1db6f71f2702a8e1988 GIT binary patch literal 88011 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�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 AC;$Ke literal 0 HcmV?d00001 From 6f130f32887636ea79bb6d228565384b299e14a1 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:12:25 +0200 Subject: [PATCH 02/29] add more to discover section --- .../01_Discover/use_cases/00_overview.md | 25 ++++++++ .../use_cases/01_real-time-analytics.md | 64 ++++++++++++++++++- .../01_Discover/use_cases/02_observability.md | 2 +- .../use_cases/03_data_lake_and_warehouse.md | 2 +- .../04_machine_learning_and_genAI.md | 2 +- .../01_Discover/use_cases/_category_.json | 6 ++ docs/cloud/onboard/index.md | 37 +++++++++++ sidebars.js | 1 + 8 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 docs/cloud/onboard/01_Discover/use_cases/00_overview.md create mode 100644 docs/cloud/onboard/01_Discover/use_cases/_category_.json create mode 100644 docs/cloud/onboard/index.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/00_overview.md b/docs/cloud/onboard/01_Discover/use_cases/00_overview.md new file mode 100644 index 00000000000..24903149206 --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/00_overview.md @@ -0,0 +1,25 @@ +--- +slug: /cloud/get-started/cloud/use-cases/overview +title: 'Building on ClickHouse Cloud' +keywords: ['use cases', 'Cloud'] +sidebar_label: 'Overview' +--- + +ClickHouse Cloud is suitable for use as both a **primary data store** and as an **analytics +layer**. + +ClickHouse's columnar architecture, vectorized processing, and cloud-native design +make it uniquely suited for analytical workloads that require both speed and scale. +Broadly, the most common use cases for ClickHouse Cloud are: + +| Use case | Description | +|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Real-Time analytics](/cloud/get-started/cloud/use-cases/real-time-analytics) | ClickHouse Cloud excels at real-time analytics by delivering sub-second query responses on billions of rows through its columnar storage architecture and vectorized execution engine. The platform handles high-throughput data ingestion of millions of events per second while enabling direct queries on raw data without requiring pre-aggregation. Materialized Views provide real-time aggregations and pre-computed results, while approximate functions for quantiles and counts deliver instant insights perfect for interactive dashboards and real-time decision making.| +| [Data Lake and Warehouse](/cloud/get-started/cloud/use-cases/data_lake_and_warehouse) | As a modern data warehouse solution, ClickHouse Cloud combines native cloud storage integration with S3, GCS, and Azure Blob for cost-effective storage with schema-on-read flexibility that supports semi-structured data like JSON and nested types. The platform achieves massive compression ratios of 10:1 or better, significantly reducing storage costs, while its compute-storage separation architecture allows independent scaling and cost optimization. Users benefit from a standard SQL interface enhanced with advanced analytics functions, making it easy to query and analyze data at any scale.| +| [Observability](/cloud/get-started/cloud/use-cases/observability) | ClickHouse Cloud is purpose-built for observability workloads, featuring specialized engines and functions optimized for time-series data that can ingest and query terabytes of logs, metrics, and traces with ease. Through ClickStack, ClickHouse's comprehensive observability solution, organizations can break down the traditional three silos of logs, metrics, and traces by unifying all observability data in a single platform, enabling correlated analysis and eliminating the complexity of managing separate systems. This unified approach makes it ideal for application performance monitoring, infrastructure monitoring, and security event analysis at enterprise scale, with ClickStack providing the tools and integrations needed for complete observability workflows without data silos.| +| [Machine Learning and GenAI](/cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai) | ClickHouse Cloud powers modern AI applications through four key capabilities: native vector similarity search for RAG applications and embedding storage, comprehensive feature store functionality for real-time ML feature engineering and serving, specialized LLM observability for tracking model performance and usage patterns, and integrated MCP (Model Context Protocol) server support that enables AI agents and LLMs to directly query and analyze data. This unified platform eliminates the complexity of managing separate systems for vector databases, feature stores, and observability tools, providing a single solution for the entire AI/ML data pipeline with ClickHouse's signature performance and scalability.| + + + + + diff --git a/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md index 896fc27b7ac..25fc13fcbf7 100644 --- a/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md +++ b/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md @@ -1,11 +1,13 @@ --- slug: /cloud/get-started/cloud/use-cases/real-time-analytics title: 'Real-time analytics' -keywords: [] +keywords: ['use cases', 'real-time analytics'] sidebar_label: 'Real-time analytics' --- import Image from '@theme/IdealImage'; +import rta_0 from '@site/static/images/cloud/onboard/discover/use_cases/0_rta.png'; +import rta_1 from '@site/static/images/cloud/onboard/discover/use_cases/1_rta.png'; ## What is real-time analytics? @@ -44,3 +46,63 @@ and in the next section, we’ll compare batch and real-time analytics. The diagram below shows what a typical batch analytics system would look like from the perspective of an individual event: +batch analytics diagram + +You can see that there’s quite a big gap from when the event happens until we +process and gain some insight from it. Traditionally, this was the only means of +data analysis, and we’d need to create artificial time boundaries to process +the data in batches. For example, we might process all the data collected at the +end of a day. This worked for many use cases, but for others, it’s sub-optimal +because we’re working with stale data, and it doesn’t allow us to react to the +data quickly enough. + +By contrast, in real-time analytics systems, we react to an event as soon as it +happens, as shown in the following diagram: + +Real-time analytics diagram + +We can now derive insights from events almost as soon as they’re generated. But +why is this useful? + +## Benefits of real-time analytics {#benefits-of-real-time-analytics} + +In today's fast-paced world, organizations rely on real-time analytics to stay +agile and responsive to ever-changing conditions. A real-time analytics system +can benefit a business in many ways. + +### Better decision-making {#better-decision-making} + +Decision-making can be improved by having access to actionable insights via +real-time analytics. When business operators can see events as they’re happening, +it makes it much easier to make timely interventions. + +For example, if we make changes to an application and want to know whether it’s +having a detrimental effect on the user experience, we want to know this as +quickly as possible so that we can revert the changes if necessary. With a less +real-time approach, we might have to wait until the next day to do this +analysis, by which type we’ll have a lot of unhappy users. + +### New products and revenue streams {#new-products-and-revenue-streams} + +Real-time analytics can help businesses generate new revenue streams. Organizations +can develop new data-centered products and services that give users access to +analytical querying capabilities. These products are often compelling enough for +users to pay for access. + +In addition, existing applications can be made stickier, increasing user +engagement and retention. This will result in more application use, creating more +revenue for the organization. + +### Improved customer experience {#improved-customer-experience} + +With real-time analytics, businesses can gain instant insights into customer +behavior, preferences, and needs. This lets businesses offer timely assistance, +personalize interactions, and create more engaging experiences that keep +customers returning. + + + + + + + diff --git a/docs/cloud/onboard/01_Discover/use_cases/02_observability.md b/docs/cloud/onboard/01_Discover/use_cases/02_observability.md index 421d302963d..723b92440f6 100644 --- a/docs/cloud/onboard/01_Discover/use_cases/02_observability.md +++ b/docs/cloud/onboard/01_Discover/use_cases/02_observability.md @@ -1,6 +1,6 @@ --- slug: /cloud/get-started/cloud/use-cases/observability title: 'Observability' -keywords: [] +keywords: ['use cases', 'observability'] sidebar_label: 'Observability' --- \ No newline at end of file diff --git a/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md index 1c06bc82b02..80a562b47eb 100644 --- a/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md +++ b/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md @@ -1,6 +1,6 @@ --- slug: /cloud/get-started/cloud/use-cases/data_lake_and_warehouse title: 'Data Lake and Warehousing' -keywords: [] +keywords: ['use cases', 'data lake and warehouse'] sidebar_label: 'Data lake and warehousing' --- \ No newline at end of file diff --git a/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md b/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md index 9bb65f9b2fb..0179ad89157 100644 --- a/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md +++ b/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md @@ -1,6 +1,6 @@ --- slug: /cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai title: 'Machine learning and generative AI' -keywords: [] +keywords: ['use cases', 'Machine Learning', 'Generative AI'] sidebar_label: 'Machine learning and generative AI' --- \ No newline at end of file diff --git a/docs/cloud/onboard/01_Discover/use_cases/_category_.json b/docs/cloud/onboard/01_Discover/use_cases/_category_.json new file mode 100644 index 00000000000..c066b9c4fdc --- /dev/null +++ b/docs/cloud/onboard/01_Discover/use_cases/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 2.5, + "label": "Use cases", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/index.md b/docs/cloud/onboard/index.md new file mode 100644 index 00000000000..a8766682dea --- /dev/null +++ b/docs/cloud/onboard/index.md @@ -0,0 +1,37 @@ +--- +slug: /cloud/get-started/cloud/onboard +title: 'Get started with ClickHouse Cloud' +hide_title: true +--- + +# Get started with ClickHouse Cloud + +In this section of the docs you will find all the information you may need +as a user wishing to evaluate the suitability of ClickHouse Cloud for your use +case. + +This section of our docs is arranged into three subsections to help guide you +through each step of the process as you evaluate ClickHouse Cloud for your +particular use case. + + + +## Discover ClickHouse Cloud {#discover-clickhouse-cloud} + +In this section, you'll discover what ClickHouse Cloud is, how it differs from open-source +ClickHouse, what the major use cases for ClickHouse Cloud are, and why you might +want to consider using it for your use case. + +## Get set up with ClickHouse Cloud {#get-set-up-with-clickhouse-cloud} + +In this section, you will find articles that will help you get set up with ClickHouse +Cloud, migrate your existing data to ClickHouse Cloud from other platforms, along with some general +best practices and answers to common issues that new users face. + +## Evaluate ClickHouse Cloud {#evaluate-clickhouse-cloud} + +In this section, you will find a series of articles with the aim of assisting you +to evaluate the success of your trial. Topics covered include how to monitor query +performance, storage, and cost. + + \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index d421ce9a2f7..2e36b4abc9c 100644 --- a/sidebars.js +++ b/sidebars.js @@ -262,6 +262,7 @@ const sidebars = { label: "Get Started", collapsed: false, collapsible: true, + link: { type: "doc", id: "cloud/onboard/index" }, items: [ { type: "autogenerated", From 9fb8dd78c1c61e2e3f0248a51cd3aec61d0e484b Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 22 Jul 2025 17:26:29 +0200 Subject: [PATCH 03/29] more changes --- .../01_what_is.md | 2 +- .../use_cases/00_overview.md | 0 .../use_cases/01_real-time-analytics.md | 0 .../use_cases/02_observability.md | 0 .../use_cases/03_data_lake_and_warehouse.md | 0 .../04_machine_learning_and_genAI.md | 0 .../use_cases/_category_.json | 0 .../01_postgres/01_comparison.md} | 5 +- .../01_postgres}/appendix.md | 0 .../01_migration_guides/01_postgres}/index.md | 0 .../migration_guide/01_migration_guide.md} | 1 + .../migration_guide/02_migration_guide.md} | 1 + .../migration_guide/03_migration_guide.md} | 3 +- .../migration_guide/_category_.json | 5 + .../02_bigquery/01_comparison.md} | 3 +- .../02_migrating-to-clickhouse-cloud.md} | 0 .../02_bigquery/03_loading-data.md} | 10 +- .../01_migration_guides/02_bigquery}/index.md | 0 .../03_snowflake/01_comparison.md | 11 + .../03_snowflake/02_snowflake.md} | 22 +- ...wflake_clickhouse_translation_reference.md | 8 + .../03_snowflake/_category_.json | 5 + .../04_elastic/01_comparison.md | 11 + .../04_elastic/_category_.json | 5 + .../05_redshift/01_comparison.md | 12 + .../05_redshift/02_migrate.md | 14 ++ .../05_redshift/_category_.json | 5 + .../06_third_party_etl_tools/_category_.json | 5 + .../01_migration_guides/_category_.json | 5 + .../02_migrate/02_features/01_sql-console.md} | 0 .../02_features/02_query-insights.md} | 0 .../02_features/03_query-endpoints.md} | 0 .../02_migrate/02_features/04_dashboards.md} | 0 .../02_migrate/02_features/_category_.json | 5 + docs/cloud/onboard/index.md | 42 ++-- .../redshift/_snippets/_migration_guide.md | 237 +++++++++++++++++ .../data-ingestion/redshift/index.md | 238 +----------------- docs/migrations/index.md | 17 -- sidebars.js | 83 ++---- 39 files changed, 408 insertions(+), 347 deletions(-) rename docs/cloud/onboard/{01_Discover => 01_discover}/01_what_is.md (99%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/00_overview.md (100%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/01_real-time-analytics.md (100%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/02_observability.md (100%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/03_data_lake_and_warehouse.md (100%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/04_machine_learning_and_genAI.md (100%) rename docs/cloud/onboard/{01_Discover => 01_discover}/use_cases/_category_.json (100%) rename docs/{migrations/postgres/overview.md => cloud/onboard/02_migrate/01_migration_guides/01_postgres/01_comparison.md} (97%) rename docs/{migrations/postgres => cloud/onboard/02_migrate/01_migration_guides/01_postgres}/appendix.md (100%) rename docs/{migrations/postgres => cloud/onboard/02_migrate/01_migration_guides/01_postgres}/index.md (100%) rename docs/{migrations/postgres/dataset.md => cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md} (99%) rename docs/{migrations/postgres/rewriting-queries.md => cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md} (99%) rename docs/{migrations/postgres/data-modeling-techniques.md => cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md} (99%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/_category_.json rename docs/{migrations/bigquery/equivalent-concepts.md => cloud/onboard/02_migrate/01_migration_guides/02_bigquery/01_comparison.md} (99%) rename docs/{migrations/bigquery/migrating-to-clickhouse-cloud.md => cloud/onboard/02_migrate/01_migration_guides/02_bigquery/02_migrating-to-clickhouse-cloud.md} (100%) rename docs/{migrations/bigquery/loading-data.md => cloud/onboard/02_migrate/01_migration_guides/02_bigquery/03_loading-data.md} (96%) rename docs/{migrations/bigquery => cloud/onboard/02_migrate/01_migration_guides/02_bigquery}/index.md (100%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/01_comparison.md rename docs/{migrations/snowflake.md => cloud/onboard/02_migrate/01_migration_guides/03_snowflake/02_snowflake.md} (88%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_03_snowflake_clickhouse_translation_reference.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_category_.json create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/01_comparison.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/_category_.json create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/01_comparison.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/02_migrate.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/_category_.json create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/06_third_party_etl_tools/_category_.json create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/_category_.json rename docs/cloud/{get-started/sql-console.md => onboard/02_migrate/02_features/01_sql-console.md} (100%) rename docs/cloud/{get-started/query-insights.md => onboard/02_migrate/02_features/02_query-insights.md} (100%) rename docs/cloud/{get-started/query-endpoints.md => onboard/02_migrate/02_features/03_query-endpoints.md} (100%) rename docs/cloud/{manage/dashboards.md => onboard/02_migrate/02_features/04_dashboards.md} (100%) create mode 100644 docs/cloud/onboard/02_migrate/02_features/_category_.json create mode 100644 docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md delete mode 100644 docs/migrations/index.md diff --git a/docs/cloud/onboard/01_Discover/01_what_is.md b/docs/cloud/onboard/01_discover/01_what_is.md similarity index 99% rename from docs/cloud/onboard/01_Discover/01_what_is.md rename to docs/cloud/onboard/01_discover/01_what_is.md index 7ee8a59cd7d..66f9a05c829 100644 --- a/docs/cloud/onboard/01_Discover/01_what_is.md +++ b/docs/cloud/onboard/01_discover/01_what_is.md @@ -1,6 +1,6 @@ --- slug: /cloud/get-started/cloud/what-is-clickhouse-cloud -title: 'Overview' +title: 'Introduction' keywords: ['clickhouse cloud', 'what is clickhouse cloud', 'clickhouse cloud overview', 'clickhouse cloud features'] hide_title: true --- diff --git a/docs/cloud/onboard/01_Discover/use_cases/00_overview.md b/docs/cloud/onboard/01_discover/use_cases/00_overview.md similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/00_overview.md rename to docs/cloud/onboard/01_discover/use_cases/00_overview.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/01_real-time-analytics.md rename to docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/02_observability.md b/docs/cloud/onboard/01_discover/use_cases/02_observability.md similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/02_observability.md rename to docs/cloud/onboard/01_discover/use_cases/02_observability.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_discover/use_cases/03_data_lake_and_warehouse.md similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/03_data_lake_and_warehouse.md rename to docs/cloud/onboard/01_discover/use_cases/03_data_lake_and_warehouse.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md b/docs/cloud/onboard/01_discover/use_cases/04_machine_learning_and_genAI.md similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/04_machine_learning_and_genAI.md rename to docs/cloud/onboard/01_discover/use_cases/04_machine_learning_and_genAI.md diff --git a/docs/cloud/onboard/01_Discover/use_cases/_category_.json b/docs/cloud/onboard/01_discover/use_cases/_category_.json similarity index 100% rename from docs/cloud/onboard/01_Discover/use_cases/_category_.json rename to docs/cloud/onboard/01_discover/use_cases/_category_.json diff --git a/docs/migrations/postgres/overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/01_comparison.md similarity index 97% rename from docs/migrations/postgres/overview.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/01_comparison.md index ed3173ef9ee..063b9dd0779 100644 --- a/docs/migrations/postgres/overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/01_comparison.md @@ -1,10 +1,13 @@ --- slug: /migrations/postgresql/overview -title: 'Migrating from PostgreSQL to ClickHouse' +title: 'Comparing PostgreSQL and ClickHouse' description: 'A guide to migrating from PostgreSQL to ClickHouse' keywords: ['postgres', 'postgresql', 'migrate', 'migration'] +sidebar_label: 'Overview' --- +# Comparing ClickHouse and PostgreSQL + ## Why use ClickHouse over Postgres? {#why-use-clickhouse-over-postgres} TLDR: Because ClickHouse is designed for fast analytics, specifically `GROUP BY` queries, as an OLAP database whereas Postgres is an OLTP database designed for transactional workloads. diff --git a/docs/migrations/postgres/appendix.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/appendix.md similarity index 100% rename from docs/migrations/postgres/appendix.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/appendix.md diff --git a/docs/migrations/postgres/index.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/index.md similarity index 100% rename from docs/migrations/postgres/index.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/index.md diff --git a/docs/migrations/postgres/dataset.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md similarity index 99% rename from docs/migrations/postgres/dataset.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md index 2574252e1da..fc97c8a76dc 100644 --- a/docs/migrations/postgres/dataset.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md @@ -4,6 +4,7 @@ title: 'Migrating data' description: 'Dataset example to migrate from PostgreSQL to ClickHouse' keywords: ['Postgres'] show_related_blogs: true +sidebar_label: 'Part 1' --- import postgres_stackoverflow_schema from '@site/static/images/migrations/postgres-stackoverflow-schema.png'; diff --git a/docs/migrations/postgres/rewriting-queries.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md similarity index 99% rename from docs/migrations/postgres/rewriting-queries.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md index 451d1b37d9a..a77b38ed5e5 100644 --- a/docs/migrations/postgres/rewriting-queries.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md @@ -3,6 +3,7 @@ slug: /migrations/postgresql/rewriting-queries title: 'Rewriting PostgreSQL Queries' keywords: ['postgres', 'postgresql', 'rewriting queries'] description: 'Part 2 of a guide on migrating from PostgreSQL to ClickHouse' +sidebar_label: 'Part 2' --- > This is **Part 2** of a guide on migrating from PostgreSQL to ClickHouse. Using a practical example, it demonstrates how to efficiently carry out the migration with a real-time replication (CDC) approach. Many of the concepts covered are also applicable to manual bulk data transfers from PostgreSQL to ClickHouse. diff --git a/docs/migrations/postgres/data-modeling-techniques.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md similarity index 99% rename from docs/migrations/postgres/data-modeling-techniques.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md index 3e34f294cf1..4c6bd90984a 100644 --- a/docs/migrations/postgres/data-modeling-techniques.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md @@ -1,9 +1,10 @@ --- slug: /migrations/postgresql/data-modeling-techniques title: 'Data modeling techniques' -description: 'Data modeling for migrating from PostgreSQL to ClickHouse' +description: 'Part 3 of a guide on migrating from PostgreSQL to ClickHouse' keywords: ['postgres', 'postgresql'] show_related_blogs: true +sidebar_label: 'Part 3' --- import postgres_b_tree from '@site/static/images/migrations/postgres-b-tree.png'; diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/_category_.json new file mode 100644 index 00000000000..ad514aeb890 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Migration guide", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/migrations/bigquery/equivalent-concepts.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/01_comparison.md similarity index 99% rename from docs/migrations/bigquery/equivalent-concepts.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/01_comparison.md index f12bab2bb28..fca4a3fa33d 100644 --- a/docs/migrations/bigquery/equivalent-concepts.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/01_comparison.md @@ -4,12 +4,13 @@ slug: /migrations/bigquery/biquery-vs-clickhouse-cloud description: 'How BigQuery differs from ClickHouse Cloud' keywords: ['BigQuery'] show_related_blogs: true +sidebar_label: 'Overview' --- import bigquery_1 from '@site/static/images/migrations/bigquery-1.png'; import Image from '@theme/IdealImage'; -# BigQuery vs ClickHouse Cloud: Equivalent and different concepts +# Comparing ClickHouse Cloud and BigQuery ## Resource organization {#resource-organization} diff --git a/docs/migrations/bigquery/migrating-to-clickhouse-cloud.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/02_migrating-to-clickhouse-cloud.md similarity index 100% rename from docs/migrations/bigquery/migrating-to-clickhouse-cloud.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/02_migrating-to-clickhouse-cloud.md diff --git a/docs/migrations/bigquery/loading-data.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/03_loading-data.md similarity index 96% rename from docs/migrations/bigquery/loading-data.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/03_loading-data.md index 8e2558fe073..0bfdff8b2eb 100644 --- a/docs/migrations/bigquery/loading-data.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/03_loading-data.md @@ -24,7 +24,9 @@ Exporting data from BigQuery to ClickHouse is dependent on the size of your data | [contracts](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/contracts.md) | 57,225,837 | 350 | 45.35GB | 16 sec | 1 hr 51 min | 39.4 secs | | Total | 8.26 billion | 23,577 | 3.982TB | 8 min 3 sec | \> 6 days 5 hrs | 53 mins 45 secs | -## 1. Export table data to GCS {#1-export-table-data-to-gcs} + + +## Export table data to GCS {#1-export-table-data-to-gcs} In this step, we utilize the [BigQuery SQL workspace](https://cloud.google.com/bigquery/docs/bigquery-web-ui) to execute our SQL commands. Below, we export a BigQuery table named `mytable` to a GCS bucket using the [`EXPORT DATA`](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements) statement. @@ -60,7 +62,7 @@ This approach has a number of advantages: - Exports produce multiple files automatically, limiting each to a maximum of 1GB of table data. This is beneficial to ClickHouse since it allows imports to be parallelized. - Parquet, as a column-oriented format, represents a better interchange format since it is inherently compressed and faster for BigQuery to export and ClickHouse to query -## 2. Importing data into ClickHouse from GCS {#2-importing-data-into-clickhouse-from-gcs} +## Importing data into ClickHouse from GCS {#2-importing-data-into-clickhouse-from-gcs} Once the export is complete, we can import this data into a ClickHouse table. You can use the [ClickHouse SQL console](/integrations/sql-clients/sql-console) or [`clickhouse-client`](/interfaces/cli) to execute the commands below. @@ -111,7 +113,7 @@ In the above query, we use the [`ifNull` function](/sql-reference/functions/func Alternatively, you can `SET input_format_null_as_default=1` and any missing or NULL values will be replaced by default values for their respective columns, if those defaults are specified. ::: -## 3. Testing successful data export {#3-testing-successful-data-export} +## Testing successful data export {#3-testing-successful-data-export} To test whether your data was properly inserted, simply run a `SELECT` query on your new table: @@ -121,6 +123,8 @@ SELECT * FROM mytable LIMIT 10; To export more BigQuery tables, simply redo the steps above for each additional table. + + ## Further reading and support {#further-reading-and-support} In addition to this guide, we also recommend reading our blog post that shows [how to use ClickHouse to speed up BigQuery and how to handle incremental imports](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries). diff --git a/docs/migrations/bigquery/index.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/index.md similarity index 100% rename from docs/migrations/bigquery/index.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/02_bigquery/index.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/01_comparison.md new file mode 100644 index 00000000000..12c2e593b04 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/01_comparison.md @@ -0,0 +1,11 @@ +--- +sidebar_label: 'Overview' +slug: /migrations/snowflake-overview +description: 'Migrating from Snowflake to ClickHouse' +keywords: ['Snowflake'] +title: 'Migrate from Snowflake to ClickHouse' +show_related_blogs: true +--- + +# Comparing ClickHouse Cloud and Snowflake + diff --git a/docs/migrations/snowflake.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/02_snowflake.md similarity index 88% rename from docs/migrations/snowflake.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/02_snowflake.md index 38d3b8dfac1..ae9e9107cdd 100644 --- a/docs/migrations/snowflake.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/02_snowflake.md @@ -1,23 +1,27 @@ --- sidebar_label: 'Snowflake' -sidebar_position: 20 slug: /migrations/snowflake description: 'Migrating from Snowflake to ClickHouse' keywords: ['Snowflake'] title: 'Migrating from Snowflake to ClickHouse' -show_related_blogs: true +show_related_blogs: false --- import migrate_snowflake_clickhouse from '@site/static/images/migrations/migrate_snowflake_clickhouse.png'; import Image from '@theme/IdealImage'; -# Migrating from Snowflake to ClickHouse +# Migrate from Snowflake to ClickHouse -This guide shows how to migrate data from Snowflake to ClickHouse. +> This guide shows you how to migrate data from Snowflake to ClickHouse. -Migrating data between Snowflake and ClickHouse requires the use of an object store, such as S3, as an intermediate storage for transfer. The migration process also relies on using the commands `COPY INTO` from Snowflake and `INSERT INTO SELECT` of ClickHouse. +Migrating data between Snowflake and ClickHouse requires the use of an object store, +such as S3, as an intermediate storage for transfer. The migration process also +relies on using the commands `COPY INTO` from Snowflake and `INSERT INTO SELECT` +of ClickHouse. -## 1. Exporting data from Snowflake {#1-exporting-data-from-snowflake} + + +## Export data from Snowflake {#1-exporting-data-from-snowflake} Migrating from Snowflake to ClickHouse @@ -54,7 +58,7 @@ COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 heade For a dataset around 5TB of data with a maximum file size of 150MB, and using a 2X-Large Snowflake warehouse located in the same AWS `us-east-1` region, copying data to the S3 bucket will take around 30 minutes. -## 2. Importing to ClickHouse {#2-importing-to-clickhouse} +## Import to ClickHouse {#2-importing-to-clickhouse} Once the data is staged in intermediary object storage, ClickHouse functions such as the [s3 table function](/sql-reference/table-functions/s3) can be used to insert the data into a table, as shown below. @@ -100,10 +104,12 @@ The `VARIANT` and `OBJECT` columns in the original Snowflake table schema will b Nested structures such as `some_file` are converted to JSON strings on copy by Snowflake. Importing this data requires us to transform these structures to Tuples at insert time in ClickHouse, using the [JSONExtract function](/sql-reference/functions/json-functions#jsonextract) as shown above. ::: -## 3. Testing successful data export {#3-testing-successful-data-export} +## Test successful data export {#3-testing-successful-data-export} To test whether your data was properly inserted, simply run a `SELECT` query on your new table: ```sql SELECT * FROM mydataset LIMIT 10; ``` + + \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_03_snowflake_clickhouse_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_03_snowflake_clickhouse_translation_reference.md new file mode 100644 index 00000000000..ec4e2d19ecb --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_03_snowflake_clickhouse_translation_reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 'SQL translation reference' +slug: /migrations/snowflake-translation-reference +description: 'SQL translation reference' +keywords: ['Snowflake'] +title: 'Migrating from Snowflake to ClickHouse' +show_related_blogs: true +--- \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_category_.json new file mode 100644 index 00000000000..50b05cb45a0 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_snowflake/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Snowflake", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/01_comparison.md new file mode 100644 index 00000000000..907c8c9e0a2 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/01_comparison.md @@ -0,0 +1,11 @@ +--- +sidebar_label: 'Overview' +slug: /migrations/elastic-overview +description: 'Migrating from Snowflake to ClickHouse' +keywords: ['Snowflake'] +title: 'Migrate from Snowflake to ClickHouse' +show_related_blogs: true +--- + +# Comparing ClickHouse Cloud and Elasticsearch + diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/_category_.json new file mode 100644 index 00000000000..4f49621cf3d --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_elastic/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Elasticsearch", + "collapsible": true, + "collapsed": true +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/01_comparison.md new file mode 100644 index 00000000000..78f15e446fe --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/01_comparison.md @@ -0,0 +1,12 @@ +--- +sidebar_label: 'Overview' +slug: /migrations/redshift-overview +description: 'Migrating from Amazon Redshift to ClickHouse' +keywords: ['Redshift'] +title: 'Comparing ClickHouse Cloud and Amazon Redshift' +show_related_blogs: true +--- + +# Comparing ClickHouse Cloud and Amazon Redshift + + diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/02_migrate.md b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/02_migrate.md new file mode 100644 index 00000000000..4a7d698e9cf --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/02_migrate.md @@ -0,0 +1,14 @@ +--- +sidebar_label: 'Migration guide' +slug: /migrations/redshift/migration-guide +description: 'Migrating from Amazon Redshift to ClickHouse' +keywords: ['Redshift'] +title: 'Amazon Redshift to ClickHouse migration guide' +show_related_blogs: true +--- + +import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' + +# Amazon Redshift to ClickHouse migration guide + + \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/_category_.json new file mode 100644 index 00000000000..95419dcb41c --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_redshift/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Redshift", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_third_party_etl_tools/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/06_third_party_etl_tools/_category_.json new file mode 100644 index 00000000000..061628841e3 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/06_third_party_etl_tools/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Third-party ETL tools", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/_category_.json new file mode 100644 index 00000000000..aca0c529bce --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Migration guides", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/get-started/sql-console.md b/docs/cloud/onboard/02_migrate/02_features/01_sql-console.md similarity index 100% rename from docs/cloud/get-started/sql-console.md rename to docs/cloud/onboard/02_migrate/02_features/01_sql-console.md diff --git a/docs/cloud/get-started/query-insights.md b/docs/cloud/onboard/02_migrate/02_features/02_query-insights.md similarity index 100% rename from docs/cloud/get-started/query-insights.md rename to docs/cloud/onboard/02_migrate/02_features/02_query-insights.md diff --git a/docs/cloud/get-started/query-endpoints.md b/docs/cloud/onboard/02_migrate/02_features/03_query-endpoints.md similarity index 100% rename from docs/cloud/get-started/query-endpoints.md rename to docs/cloud/onboard/02_migrate/02_features/03_query-endpoints.md diff --git a/docs/cloud/manage/dashboards.md b/docs/cloud/onboard/02_migrate/02_features/04_dashboards.md similarity index 100% rename from docs/cloud/manage/dashboards.md rename to docs/cloud/onboard/02_migrate/02_features/04_dashboards.md diff --git a/docs/cloud/onboard/02_migrate/02_features/_category_.json b/docs/cloud/onboard/02_migrate/02_features/_category_.json new file mode 100644 index 00000000000..383c8150644 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/02_features/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Features", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/index.md b/docs/cloud/onboard/index.md index a8766682dea..5f570d2f2b8 100644 --- a/docs/cloud/onboard/index.md +++ b/docs/cloud/onboard/index.md @@ -6,32 +6,42 @@ hide_title: true # Get started with ClickHouse Cloud -In this section of the docs you will find all the information you may need -as a user wishing to evaluate the suitability of ClickHouse Cloud for your use -case. +New to ClickHouse Cloud and not sure where to begin? In this section of the docs, +we'll walk you through everything you need to get up and running quickly. -This section of our docs is arranged into three subsections to help guide you -through each step of the process as you evaluate ClickHouse Cloud for your -particular use case. +We've arranged this getting started section into three subsections to help guide +you through each step of the process as you explore ClickHouse Cloud. ## Discover ClickHouse Cloud {#discover-clickhouse-cloud} -In this section, you'll discover what ClickHouse Cloud is, how it differs from open-source -ClickHouse, what the major use cases for ClickHouse Cloud are, and why you might -want to consider using it for your use case. +- Learn about what ClickHouse Cloud is, and how it differs from the open-source version +- Discover the main use-cases of ClickHouse Cloud ## Get set up with ClickHouse Cloud {#get-set-up-with-clickhouse-cloud} -In this section, you will find articles that will help you get set up with ClickHouse -Cloud, migrate your existing data to ClickHouse Cloud from other platforms, along with some general -best practices and answers to common issues that new users face. +Now that you know what ClickHouse Cloud is, we'll walk you through the process +of getting your data into ClickHouse Cloud, show you the main features available +and point you towards some general best practices you should know. -## Evaluate ClickHouse Cloud {#evaluate-clickhouse-cloud} +Topics include: -In this section, you will find a series of articles with the aim of assisting you -to evaluate the success of your trial. Topics covered include how to monitor query -performance, storage, and cost. +- Migration guides from various platforms +- Architectures +- Cloud features + +## Explore ClickHouse Cloud {#evaluate-clickhouse-cloud} + +Now that your data is in ClickHouse Cloud, we'll walk you through some more advanced +topics to help you get the most out of your ClickHouse Cloud experience and explore +what the platform has to offer. + +Topics include: + +- Query performance +- Monitoring +- Security considerations +- Troubleshooting tips \ No newline at end of file diff --git a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md new file mode 100644 index 00000000000..353c2f197b9 --- /dev/null +++ b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md @@ -0,0 +1,237 @@ +import redshiftToClickhouse from '@site/static/images/integrations/data-ingestion/redshift/redshift-to-clickhouse.png'; +import push from '@site/static/images/integrations/data-ingestion/redshift/push.png'; +import pull from '@site/static/images/integrations/data-ingestion/redshift/pull.png'; +import pivot from '@site/static/images/integrations/data-ingestion/redshift/pivot.png'; +import s3_1 from '@site/static/images/integrations/data-ingestion/redshift/s3-1.png'; +import s3_2 from '@site/static/images/integrations/data-ingestion/redshift/s3-2.png'; +import Image from '@theme/IdealImage'; + +## Introduction {#introduction} + +[Amazon Redshift](https://aws.amazon.com/redshift/) is a popular cloud data warehousing solution that is part of the Amazon Web Services offerings. This guide presents different approaches to migrating data from a Redshift instance to ClickHouse. We will cover three options: + +Redshift to ClickHouse Migration Options + +From the ClickHouse instance standpoint, you can either: + +1. **[PUSH](#push-data-from-redshift-to-clickhouse)** data to ClickHouse using a third party ETL/ELT tool or service + +2. **[PULL](#pull-data-from-redshift-to-clickhouse)** data from Redshift leveraging the ClickHouse JDBC Bridge + +3. **[PIVOT](#pivot-data-from-redshift-to-clickhouse-using-s3)** using S3 object storage using an "Unload then load" logic + +:::note +We used Redshift as a data source in this tutorial. However, the migration approaches presented here are not exclusive to Redshift, and similar steps can be derived for any compatible data source. +::: + + +## Push Data from Redshift to ClickHouse {#push-data-from-redshift-to-clickhouse} + +In the push scenario, the idea is to leverage a third-party tool or service (either custom code or an [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)) to send your data to your ClickHouse instance. For example, you can use a software like [Airbyte](https://www.airbyte.com/) to move data between your Redshift instance (as a source) and ClickHouse as a destination ([see our integration guide for Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)) + +PUSH Redshift to ClickHouse + +### Pros {#pros} + +* It can leverage the existing catalog of connectors from the ETL/ELT software. +* Built-in capabilities to keep data in sync (append/overwrite/increment logic). +* Enable data transformation scenarios (for example, see our [integration guide for dbt](/integrations/data-ingestion/etl-tools/dbt/index.md)). + +### Cons {#cons} + +* Users need to set up and maintain an ETL/ELT infrastructure. +* Introduces a third-party element in the architecture which can turn into a potential scalability bottleneck. + + +## Pull Data from Redshift to ClickHouse {#pull-data-from-redshift-to-clickhouse} + +In the pull scenario, the idea is to leverage the ClickHouse JDBC Bridge to connect to a Redshift cluster directly from a ClickHouse instance and perform `INSERT INTO ... SELECT` queries: + +PULL from Redshift to ClickHouse + +### Pros {#pros-1} + +* Generic to all JDBC compatible tools +* Elegant solution to allow querying multiple external data sources from within ClickHouse + +### Cons {#cons-1} + +* Requires a ClickHouse JDBC Bridge instance which can turn into a potential scalability bottleneck + + +:::note +Even though Redshift is based on PostgreSQL, using the ClickHouse PostgreSQL table function or table engine is not possible since ClickHouse requires PostgreSQL version 9 or above and the Redshift API is based on an earlier version (8.x). +::: + +### Tutorial {#tutorial} + +To use this option, you need to set up a ClickHouse JDBC Bridge. ClickHouse JDBC Bridge is a standalone Java application that handles JDBC connectivity and acts as a proxy between the ClickHouse instance and the data sources. For this tutorial, we used a pre-populated Redshift instance with a [sample database](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). + + +1. Deploy the ClickHouse JDBC Bridge. For more details, see our user guide on [JDBC for External Data sources](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) + +:::note +If you are using ClickHouse Cloud, you will need to run your ClickHouse JDBC Bridge on a separate environment and connect to ClickHouse Cloud using the [remoteSecure](/sql-reference/table-functions/remote/) function +::: + +2. Configure your Redshift datasource for ClickHouse JDBC Bridge. For example, `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` + + ```json + { + "redshift-server": { + "aliases": [ + "redshift" + ], + "driverUrls": [ + "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" + ], + "driverClassName": "com.amazon.redshift.jdbc.Driver", + "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", + "username": "awsuser", + "password": "", + "maximumPoolSize": 5 + } + } + ``` + +3. Once ClickHouse JDBC Bridge deployed and running, you can start querying your Redshift instance from ClickHouse + + ```sql + SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') + ``` + + ```response + Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 + + ┌─username─┬─firstname─┬─lastname─┐ + │ PGL08LJI │ Vladimir │ Humphrey │ + │ XDZ38RDD │ Barry │ Roy │ + │ AEB55QTM │ Reagan │ Hodge │ + │ OWY35QYB │ Tamekah │ Juarez │ + │ MSD36KVR │ Mufutau │ Watkins │ + └──────────┴───────────┴──────────┘ + + 5 rows in set. Elapsed: 0.438 sec. + ``` + + ```sql + SELECT * + FROM jdbc('redshift', 'select count(*) from sales') + ``` + + ```response + Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b + + ┌──count─┐ + │ 172456 │ + └────────┘ + + 1 rows in set. Elapsed: 0.304 sec. + ``` + + +4. In the following, we display importing data using an `INSERT INTO ... SELECT` statement + + ```sql + # TABLE CREATION with 3 columns + CREATE TABLE users_imported + ( + `username` String, + `firstname` String, + `lastname` String + ) + ENGINE = MergeTree + ORDER BY firstname + ``` + + ```response + Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 + + Ok. + + 0 rows in set. Elapsed: 0.233 sec. + ``` + + ```sql + # IMPORTING DATA + INSERT INTO users_imported (*) SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users') + ``` + + ```response + Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 + + Ok. + + 0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) + ``` + +## Pivot Data from Redshift to ClickHouse using S3 {#pivot-data-from-redshift-to-clickhouse-using-s3} + +In this scenario, we export data to S3 in an intermediary pivot format and, in a second step, load the data from S3 into ClickHouse. + +PIVOT from Redshift using S3 + +### Pros {#pros-2} + +* Both Redshift and ClickHouse have powerful S3 integration features. +* Leverages the existing features such as the Redshift `UNLOAD` command and ClickHouse S3 table function / table engine. +* Scales seamlessly thanks to parallel reads and high throughput capabilities from/to S3 in ClickHouse. +* Can leverage sophisticated and compressed formats like Apache Parquet. + +### Cons {#cons-2} + +* Two steps in the process (unload from Redshift then load into ClickHouse). + +### Tutorial {#tutorial-1} + +1. Using Redshift's [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) feature, export the data into a an existing private S3 bucket: + + UNLOAD from Redshift to S3 + + It will generate part files containing the raw data in S3 + + Data in S3 + +2. Create the table in ClickHouse: + + ```sql + CREATE TABLE users + ( + username String, + firstname String, + lastname String + ) + ENGINE = MergeTree + ORDER BY username + ``` + + Alternatively, ClickHouse can try to infer the table structure using `CREATE TABLE ... EMPTY AS SELECT`: + + ```sql + CREATE TABLE users + ENGINE = MergeTree ORDER BY username + EMPTY AS + SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + This works especially well when the data is in a format that contains information about data types, like Parquet. + +3. Load the S3 files into ClickHouse using an `INSERT INTO ... SELECT` statement: + ```sql + INSERT INTO users SELECT * + FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + ```response + Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 + + Ok. + + 0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) + ``` + +:::note +This example used CSV as the pivot format. However, for production workloads we recommend Apache Parquet as the best option for large migrations since it comes with compression and can save some storage costs while reducing transfer times. (By default, each row group is compressed using SNAPPY). ClickHouse also leverages Parquet's column orientation to speed up data ingestion. +::: \ No newline at end of file diff --git a/docs/integrations/data-ingestion/redshift/index.md b/docs/integrations/data-ingestion/redshift/index.md index 27bdd455c7f..217609acecd 100644 --- a/docs/integrations/data-ingestion/redshift/index.md +++ b/docs/integrations/data-ingestion/redshift/index.md @@ -7,13 +7,7 @@ keywords: ['Redshift'] show_related_blogs: true --- -import redshiftToClickhouse from '@site/static/images/integrations/data-ingestion/redshift/redshift-to-clickhouse.png'; -import push from '@site/static/images/integrations/data-ingestion/redshift/push.png'; -import pull from '@site/static/images/integrations/data-ingestion/redshift/pull.png'; -import pivot from '@site/static/images/integrations/data-ingestion/redshift/pivot.png'; -import s3_1 from '@site/static/images/integrations/data-ingestion/redshift/s3-1.png'; -import s3_2 from '@site/static/images/integrations/data-ingestion/redshift/s3-2.png'; -import Image from '@theme/IdealImage'; +import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md'; # Migrating Data from Redshift to ClickHouse @@ -31,232 +25,4 @@ import Image from '@theme/IdealImage'; -## Introduction {#introduction} - -[Amazon Redshift](https://aws.amazon.com/redshift/) is a popular cloud data warehousing solution that is part of the Amazon Web Services offerings. This guide presents different approaches to migrating data from a Redshift instance to ClickHouse. We will cover three options: - -Redshift to ClickHouse Migration Options - -From the ClickHouse instance standpoint, you can either: - -1. **[PUSH](#push-data-from-redshift-to-clickhouse)** data to ClickHouse using a third party ETL/ELT tool or service - -2. **[PULL](#pull-data-from-redshift-to-clickhouse)** data from Redshift leveraging the ClickHouse JDBC Bridge - -3. **[PIVOT](#pivot-data-from-redshift-to-clickhouse-using-s3)** using S3 object storage using an "Unload then load" logic - -:::note -We used Redshift as a data source in this tutorial. However, the migration approaches presented here are not exclusive to Redshift, and similar steps can be derived for any compatible data source. -::: - - -## Push Data from Redshift to ClickHouse {#push-data-from-redshift-to-clickhouse} - -In the push scenario, the idea is to leverage a third-party tool or service (either custom code or an [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)) to send your data to your ClickHouse instance. For example, you can use a software like [Airbyte](https://www.airbyte.com/) to move data between your Redshift instance (as a source) and ClickHouse as a destination ([see our integration guide for Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)) - -PUSH Redshift to ClickHouse - -### Pros {#pros} - -* It can leverage the existing catalog of connectors from the ETL/ELT software. -* Built-in capabilities to keep data in sync (append/overwrite/increment logic). -* Enable data transformation scenarios (for example, see our [integration guide for dbt](/integrations/data-ingestion/etl-tools/dbt/index.md)). - -### Cons {#cons} - -* Users need to set up and maintain an ETL/ELT infrastructure. -* Introduces a third-party element in the architecture which can turn into a potential scalability bottleneck. - - -## Pull Data from Redshift to ClickHouse {#pull-data-from-redshift-to-clickhouse} - -In the pull scenario, the idea is to leverage the ClickHouse JDBC Bridge to connect to a Redshift cluster directly from a ClickHouse instance and perform `INSERT INTO ... SELECT` queries: - -PULL from Redshift to ClickHouse - -### Pros {#pros-1} - -* Generic to all JDBC compatible tools -* Elegant solution to allow querying multiple external data sources from within ClickHouse - -### Cons {#cons-1} - -* Requires a ClickHouse JDBC Bridge instance which can turn into a potential scalability bottleneck - - -:::note -Even though Redshift is based on PostgreSQL, using the ClickHouse PostgreSQL table function or table engine is not possible since ClickHouse requires PostgreSQL version 9 or above and the Redshift API is based on an earlier version (8.x). -::: - -### Tutorial {#tutorial} - -To use this option, you need to set up a ClickHouse JDBC Bridge. ClickHouse JDBC Bridge is a standalone Java application that handles JDBC connectivity and acts as a proxy between the ClickHouse instance and the data sources. For this tutorial, we used a pre-populated Redshift instance with a [sample database](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). - - -1. Deploy the ClickHouse JDBC Bridge. For more details, see our user guide on [JDBC for External Data sources](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) - -:::note -If you are using ClickHouse Cloud, you will need to run your ClickHouse JDBC Bridge on a separate environment and connect to ClickHouse Cloud using the [remoteSecure](/sql-reference/table-functions/remote/) function -::: - -2. Configure your Redshift datasource for ClickHouse JDBC Bridge. For example, `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` - - ```json - { - "redshift-server": { - "aliases": [ - "redshift" - ], - "driverUrls": [ - "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" - ], - "driverClassName": "com.amazon.redshift.jdbc.Driver", - "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", - "username": "awsuser", - "password": "", - "maximumPoolSize": 5 - } - } - ``` - -3. Once ClickHouse JDBC Bridge deployed and running, you can start querying your Redshift instance from ClickHouse - - ```sql - SELECT * - FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') - ``` - - ```response - Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 - - ┌─username─┬─firstname─┬─lastname─┐ - │ PGL08LJI │ Vladimir │ Humphrey │ - │ XDZ38RDD │ Barry │ Roy │ - │ AEB55QTM │ Reagan │ Hodge │ - │ OWY35QYB │ Tamekah │ Juarez │ - │ MSD36KVR │ Mufutau │ Watkins │ - └──────────┴───────────┴──────────┘ - - 5 rows in set. Elapsed: 0.438 sec. - ``` - - ```sql - SELECT * - FROM jdbc('redshift', 'select count(*) from sales') - ``` - - ```response - Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b - - ┌──count─┐ - │ 172456 │ - └────────┘ - - 1 rows in set. Elapsed: 0.304 sec. - ``` - - -4. In the following, we display importing data using an `INSERT INTO ... SELECT` statement - - ```sql - # TABLE CREATION with 3 columns - CREATE TABLE users_imported - ( - `username` String, - `firstname` String, - `lastname` String - ) - ENGINE = MergeTree - ORDER BY firstname - ``` - - ```response - Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 - - Ok. - - 0 rows in set. Elapsed: 0.233 sec. - ``` - - ```sql - # IMPORTING DATA - INSERT INTO users_imported (*) SELECT * - FROM jdbc('redshift', 'select username, firstname, lastname from users') - ``` - - ```response - Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 - - Ok. - - 0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) - ``` - -## Pivot Data from Redshift to ClickHouse using S3 {#pivot-data-from-redshift-to-clickhouse-using-s3} - -In this scenario, we export data to S3 in an intermediary pivot format and, in a second step, load the data from S3 into ClickHouse. - -PIVOT from Redshift using S3 - -### Pros {#pros-2} - -* Both Redshift and ClickHouse have powerful S3 integration features. -* Leverages the existing features such as the Redshift `UNLOAD` command and ClickHouse S3 table function / table engine. -* Scales seamlessly thanks to parallel reads and high throughput capabilities from/to S3 in ClickHouse. -* Can leverage sophisticated and compressed formats like Apache Parquet. - -### Cons {#cons-2} - -* Two steps in the process (unload from Redshift then load into ClickHouse). - -### Tutorial {#tutorial-1} - -1. Using Redshift's [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) feature, export the data into a an existing private S3 bucket: - - UNLOAD from Redshift to S3 - - It will generate part files containing the raw data in S3 - - Data in S3 - -2. Create the table in ClickHouse: - - ```sql - CREATE TABLE users - ( - username String, - firstname String, - lastname String - ) - ENGINE = MergeTree - ORDER BY username - ``` - - Alternatively, ClickHouse can try to infer the table structure using `CREATE TABLE ... EMPTY AS SELECT`: - - ```sql - CREATE TABLE users - ENGINE = MergeTree ORDER BY username - EMPTY AS - SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') - ``` - - This works especially well when the data is in a format that contains information about data types, like Parquet. - -3. Load the S3 files into ClickHouse using an `INSERT INTO ... SELECT` statement: - ```sql - INSERT INTO users SELECT * - FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') - ``` - - ```response - Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 - - Ok. - - 0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) - ``` - -:::note -This example used CSV as the pivot format. However, for production workloads we recommend Apache Parquet as the best option for large migrations since it comes with compression and can save some storage costs while reducing transfer times. (By default, each row group is compressed using SNAPPY). ClickHouse also leverages Parquet's column orientation to speed up data ingestion. -::: + diff --git a/docs/migrations/index.md b/docs/migrations/index.md deleted file mode 100644 index 3404415cac1..00000000000 --- a/docs/migrations/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -slug: migrations -title: 'Migrations' -pagination_prev: null -pagination_next: null -description: 'Landing page for the migrations section' ---- - -| Page | Description | -|------------------------------------------------------------------------|-------------------------------------------------| -| [BigQuery](bigquery/index.md) | Migration guide for BigQuery | -| [Snowflake](./snowflake.md) | Migration guide for Snowflake | -| [PostgreSQL](postgres/index.md) | Migration guide for PostgreSQL | -| [MySQL](../integrations/data-ingestion/dbms/mysql/index.md) | Migration guide for MySQL | -| [Redshift](../integrations/data-ingestion/redshift/index.md) | Migration guide for Redshift | -| [DynamoDB](../integrations/data-ingestion/dbms/dynamodb/index.md) | Migration guide for DynamoDB | -| [Elasticsearch](/use-cases/observability/clickstack/migration/elastic) | Migration guide for Elasticsearch to ClickStack | diff --git a/sidebars.js b/sidebars.js index 2e36b4abc9c..118b70f822e 100644 --- a/sidebars.js +++ b/sidebars.js @@ -185,61 +185,6 @@ const sidebars = { }, ] }, - { - type: "category", - label: "Migration Guides", - collapsed: false, - collapsible: false, - link: { type: "doc", id: "migrations/index" }, - items: [ - { - type: "category", - label: "BigQuery", - link: { type: "doc", id: "migrations/bigquery/index" }, - items: [ - { - type: "doc", - id: "migrations/bigquery/equivalent-concepts", - }, - { - type: "doc", - id: "migrations/bigquery/migrating-to-clickhouse-cloud", - }, - { - type: "doc", - id: "migrations/bigquery/loading-data", - }, - ] - }, - "migrations/snowflake", - { - type: "category", - label: "PostgreSQL", - collapsed: true, - collapsible: true, - link: { type: "doc", id: "migrations/postgres/index" }, - items: [ - { - type: "doc", - id: "migrations/postgres/overview", - label: "Overview", - }, - "migrations/postgres/dataset", - "migrations/postgres/rewriting-queries", - "migrations/postgres/data-modeling-techniques", - "migrations/postgres/appendix" - ], - }, - "integrations/data-ingestion/dbms/mysql/index", - "integrations/data-ingestion/redshift/index", - "integrations/data-ingestion/dbms/dynamodb/index", - { - label: "Elasticsearch", - type: "doc", - id: "use-cases/observability/clickstack/migration/elastic/index", - }, - ], - }, { type: "category", label: "Example Datasets", @@ -265,12 +210,28 @@ const sidebars = { link: { type: "doc", id: "cloud/onboard/index" }, items: [ { - type: "autogenerated", - dirName: "cloud/onboard/01_Discover", + type: "category", + label: "Discover", + collapsed: false, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "cloud/onboard/01_discover" + } + ] }, { - type: "autogenerated", - dirName: "cloud/onboard/02_migrate", + type: "category", + label: "Setup", + collapsed: false, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "cloud/onboard/02_migrate", + } + ] } ] }, @@ -283,10 +244,6 @@ const sidebars = { link: { type: "doc", id: "cloud/get-started/index" }, items: [ "cloud-index", - "cloud/get-started/sql-console", - "cloud/get-started/query-insights", - "cloud/get-started/query-endpoints", - "cloud/manage/dashboards", "cloud/support", ], }, From d21b863a86f291826e0d34e5f4b50eac8c07c0f8 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:32:55 +0200 Subject: [PATCH 04/29] more edits --- .../use_cases/01_real-time-analytics.md | 61 ++++++++++++++ .../01_discover/use_cases/02_observability.md | 79 ++++++++++++++++++- 2 files changed, 139 insertions(+), 1 deletion(-) diff --git a/docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md index 25fc13fcbf7..92dd00da847 100644 --- a/docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md +++ b/docs/cloud/onboard/01_discover/use_cases/01_real-time-analytics.md @@ -8,6 +8,8 @@ sidebar_label: 'Real-time analytics' import Image from '@theme/IdealImage'; import rta_0 from '@site/static/images/cloud/onboard/discover/use_cases/0_rta.png'; import rta_1 from '@site/static/images/cloud/onboard/discover/use_cases/1_rta.png'; +import rta_2 from '@site/static/images/cloud/onboard/discover/use_cases/2_rta.png'; +import rta_3 from '@site/static/images/cloud/onboard/discover/use_cases/3_rta.png'; ## What is real-time analytics? @@ -100,6 +102,65 @@ behavior, preferences, and needs. This lets businesses offer timely assistance, personalize interactions, and create more engaging experiences that keep customers returning. +## Real-time analytics use cases {#real-time-analytics-use-cases} + +The actual value of real-time analytics becomes evident when we consider its +practical applications. Let’s examine some of them. + +### Fraud detection {#fraud-detection} + +Fraud detection is about detecting fraudulent patterns, ranging from fake accounts +to payment fraud. We want to detect this fraud as quickly as possible, flagging +suspicious activities, blocking transactions, and disabling accounts when necessary. + +This use case stretches across industries: healthcare, digital banking, financial +services, retail, and more. + +[Instacart](https://www.instacart.com/) is North America's leading online grocery +company, with millions of active customers and shoppers. It uses ClickHouse as +part of Yoda, its fraud detection platform. In addition to the general types of +fraud described above, it also tries to detect collusion between customers and +shoppers. + +Real-time analytics for fraud detection + +They identified the following characteristics of ClickHouse that enable real-time +fraud detection: + +> ClickHouse supports LSM-tree based MergeTree family engines. +> These are optimized for writing which is suitable for ingesting large amounts +> of data in real-time. + +> ClickHouse is designed and optimized explicitly for analytical queries. This +> fits perfectly with the needs of applications where data is continuously +> analyzed for patterns that might indicate fraud. + +### Time-sensitive decision making {#ftime-sensitive-decision-making} + +Time-sensitive decision-making refers to situations where users or organizations +need to make informed choices quickly based on the most current information +available. Real-time analytics empowers users to make informed choices in +dynamic environments, whether they're traders reacting to market fluctuations, +consumers making purchasing decisions, or professionals adapting to real-time +operational changes. + +Coinhall provides its users with real-time insights into price movements over +time via a candlestick chart, which shows the open, high, low, and close prices +for each trading period. They needed to be able to run these types of queries +quickly and with a large number of concurrent users. + +Real-time analutics for time-sensitive decision making + +> In terms of performance, ClickHouse was the clear winner, executing candlestick queries in 20 milliseconds, compared +> to 400 milliseconds or more for the other databases. It ran latest-price queries in 8 milliseconds, outpacing the +> next-best performance (SingleStore) which came in at 45 milliseconds. Finally, it handled ASOF JOIN queries in +> 50 milliseconds, while Snowflake took 20 minutes and Rockset timed out. + + + + + + diff --git a/docs/cloud/onboard/01_discover/use_cases/02_observability.md b/docs/cloud/onboard/01_discover/use_cases/02_observability.md index 723b92440f6..12d3d841b9f 100644 --- a/docs/cloud/onboard/01_discover/use_cases/02_observability.md +++ b/docs/cloud/onboard/01_discover/use_cases/02_observability.md @@ -3,4 +3,81 @@ slug: /cloud/get-started/cloud/use-cases/observability title: 'Observability' keywords: ['use cases', 'observability'] sidebar_label: 'Observability' ---- \ No newline at end of file +--- + +Modern software systems are complex. Microservices, cloud infrastructure, and +distributed systems have made it increasingly difficult to understand what's +happening inside our applications. When something goes wrong, teams need to know +where and why quickly. + +This is where observability comes in. It's evolved from simple system monitoring +into a comprehensive approach to understanding system behavior. However, +implementing effective observability isn't straightforward - it requires +understanding technical concepts and organizational challenges. + +## What is Observability? + +Observability is understanding a system's internal state by examining its outputs. +In software systems, this means understanding what's happening inside your +applications and infrastructure through the data they generate. + +This field has evolved significantly and can be understood through two distinct +generations of observability approaches. + +The first generation, often called Observability 1.0, was built around the +traditional "three pillars" approach of metrics, logs, and traces. This approach +required multiple tools and data stores for different types of telemetry. It +often forced engineers to pre-define what they wanted to measure, making it +costly and complex to maintain multiple systems. + +Modern observability, or Observability 2.0, takes a fundamentally different +approach. It's based on collecting wide, structured events for each unit of work +(e.g., an HTTP request and response) in our system. This approach captures +high-cardinality data, such as user IDs, request IDs, Git commit hashes, +instance IDs, Kubernetes pod names, specific route parameters, and vendor +transaction IDs. A rule of thumb is adding a piece of metadata if it could help +us understand how the system behaves. + +This rich data collection enables dynamic slicing and dicing of data without +pre-defining metrics. Teams can derive metrics, traces, and other visualizations +from this base data, allowing them to answer complex questions about system +behavior that weren't anticipated when the instrumentation was first added. + +However, implementing modern observability capabilities presents its challenges. +Organizations need reliable ways to collect, process, and export this rich +telemetry data across diverse systems and technologies. While modern approaches +have evolved beyond traditional boundaries, understanding the fundamental +building blocks of observability remains crucial. + +## The three pillars of observability {#three-pillars-of-observability} + +To better understand how observability has evolved and works in practice, let's +examine the three pillars of observability - logs, metrics, and traces. + +While modern observability has moved beyond treating these as separate concerns, +they remain fundamental concepts for understanding different aspects of system +behavior. + + +## Observability use cases {#observability-use-cases} + +LangChain is a popular software framework that helps users build applications +that use large language models. They have built a commercial product called +LangSmith, a unified developer platform for LLM application observability and +evaluation that uses ClickHouse under the hood. LangSmith lets users understand +what’s going on in their LLM applications and allows them to debug agentic +workflows. It also helps developers detect excessive token use, a costly problem +they want to detect as soon as possible. When working with LLM applications, +there are invariably many moving pieces with chained API calls and decision +flows. This makes it challenging to understand what's going on under the hood, +with users needing to debug infinite agent loops or cases with excessive token +use. Seeing an obvious need here, LangSmith started as an observability tool to +help developers diagnose and resolve these issues by giving clear visibility and +debugging information at each step of an LLM sequence. + +> We wanted something that was architecturally simple to deploy and didn’t make +> our infrastructure more complicated. We looked at Druid and Pinot, but these +> required dedicated services for ingestion, connected to queuing services such +> as Kafka, rather than simply accepting `INSERT` statements. We were keen to avoid +> this architectural complexity, + From f4fddd0beb72a185bd839b7bfa4da8fe481573a3 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Wed, 23 Jul 2025 20:09:08 +0200 Subject: [PATCH 05/29] add resource tour --- .../_snippets/_table_of_contents.md | 12 ++ docs/best-practices/index.md | 15 +- docs/cloud/bestpractices/index.md | 15 +- docs/cloud/manage/{ => api}/postman.md | 0 .../01_discover/use_cases/02_observability.md | 187 ++++++++++++++++-- ...n_guide.md => 01_migration_guide_part1.md} | 0 ...n_guide.md => 02_migration_guide_part2.md} | 0 ...n_guide.md => 03_migration_guide_part3.md} | 0 .../_monitoring_table_of_contents.md | 3 + docs/cloud/onboard/03_tune/resource_tour.md | 46 +++++ docs/cloud/onboard/index.md | 2 +- ...ormance_optimizations_table_of_contents.md | 17 ++ docs/guides/best-practices/index.md | 20 +- sidebars.js | 18 +- 14 files changed, 269 insertions(+), 66 deletions(-) create mode 100644 docs/best-practices/_snippets/_table_of_contents.md rename docs/cloud/manage/{ => api}/postman.md (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/{01_migration_guide.md => 01_migration_guide_part1.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/{02_migration_guide.md => 02_migration_guide_part2.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/{03_migration_guide.md => 03_migration_guide_part3.md} (100%) create mode 100644 docs/cloud/onboard/03_tune/_snippets/_monitoring_table_of_contents.md create mode 100644 docs/cloud/onboard/03_tune/resource_tour.md create mode 100644 docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md diff --git a/docs/best-practices/_snippets/_table_of_contents.md b/docs/best-practices/_snippets/_table_of_contents.md new file mode 100644 index 00000000000..9e0d34ef2d1 --- /dev/null +++ b/docs/best-practices/_snippets/_table_of_contents.md @@ -0,0 +1,12 @@ +| Page | Description | +|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------| +| [Choosing a Primary Key](/best-practices/choosing-a-primary-key) | How to select primary keys that maximize query performance and minimize storage overhead. | +| [Select Data Types](/best-practices/select-data-types) | Choose optimal data types to reduce memory usage, improve compression, and accelerate queries. | +| [Use Materialized Views](/best-practices/use-materialized-views) | Leverage materialized views to pre-aggregate data and dramatically speed up analytical queries. | +| [Minimize and Optimize JOINs](/best-practices/minimize-optimize-joins) | Best practices for using ClickHouse's `JOIN` capabilities efficiently. | +| [Choosing a Partitioning Key](/best-practices/choosing-a-partitioning-key) | Select partitioning strategies that enable efficient data pruning and faster query execution. | +| [Selecting an Insert Strategy](/best-practices/selecting-an-insert-strategy) | Optimize data ingestion throughput and reduce resource consumption with proper insert patterns. | +| [Data Skipping Indices](/best-practices/use-data-skipping-indices-where-appropriate) | Apply secondary indices strategically to skip irrelevant data blocks and accelerate filtered queries. | +| [Avoid Mutations](/best-practices/avoid-mutations) | Design schemas and workflows that eliminate costly `UPDATE`/`DELETE` operations for better performance. | +| [Avoid OPTIMIZE FINAL](/best-practices/avoid-optimize-final) | Prevent performance bottlenecks by understanding when `OPTIMIZE FINAL` hurts more than it helps. | +| [Use JSON where appropriate](/best-practices/use-json-where-appropriate) | Balance flexibility and performance when working with semi-structured JSON data in ClickHouse. | \ No newline at end of file diff --git a/docs/best-practices/index.md b/docs/best-practices/index.md index 4f672250e63..a14aecc937e 100644 --- a/docs/best-practices/index.md +++ b/docs/best-practices/index.md @@ -6,19 +6,10 @@ hide_title: true description: 'Landing page for Best Practices section in ClickHouse' --- +import TableOfContents from '@site/docs/best-practices/_snippets/_table_of_contents.md'; + # Best Practices in ClickHouse {#best-practices-in-clickhouse} This section provides the best practices you will want to follow to get the most out of ClickHouse. -| Page | Description | -|----------------------------------------------------------------------|--------------------------------------------------------------------------| -| [Choosing a Primary Key](/best-practices/choosing-a-primary-key) | Guidance on selecting an effective Primary Key in ClickHouse. | -| [Select Data Types](/best-practices/select-data-types) | Recommendations for choosing appropriate data types. | -| [Use Materialized Views](/best-practices/use-materialized-views) | When and how to benefit from materialized views. | -| [Minimize and Optimize JOINs](/best-practices/minimize-optimize-joins)| Best practices for minimizing and optimizing JOIN operations. | -| [Choosing a Partitioning Key](/best-practices/choosing-a-partitioning-key) | How to choose and apply partitioning keys effectively. | -| [Selecting an Insert Strategy](/best-practices/selecting-an-insert-strategy) | Strategies for efficient data insertion in ClickHouse. | -| [Data Skipping Indices](/best-practices/use-data-skipping-indices-where-appropriate) | When to apply data skipping indices for performance gains. | -| [Avoid Mutations](/best-practices/avoid-mutations) | Reasons to avoid mutations and how to design without them. | -| [Avoid OPTIMIZE FINAL](/best-practices/avoid-optimize-final) | Why `OPTIMIZE FINAL` can be costly and how to work around it. | -| [Use JSON where appropriate](/best-practices/use-json-where-appropriate) | Considerations for using JSON columns in ClickHouse. | + \ No newline at end of file diff --git a/docs/cloud/bestpractices/index.md b/docs/cloud/bestpractices/index.md index c1d00a2b712..4719ea2750a 100644 --- a/docs/cloud/bestpractices/index.md +++ b/docs/cloud/bestpractices/index.md @@ -6,6 +6,8 @@ hide_title: true description: 'Landing page for Best Practices section in ClickHouse Cloud' --- +import TableOfContents from '@site/docs/best-practices/_snippets/_table_of_contents.md'; + # Best Practices in ClickHouse Cloud {#best-practices-in-clickhouse-cloud} This section provides best practices you will want to follow to get the most out of ClickHouse Cloud. @@ -17,15 +19,4 @@ This section provides best practices you will want to follow to get the most out These are in addition to the standard best practices which apply to all deployments of ClickHouse. -| Page | Description | -|----------------------------------------------------------------------|--------------------------------------------------------------------------| -| [Choosing a Primary Key](/best-practices/choosing-a-primary-key) | Guidance on selecting an effective Primary Key in ClickHouse. | -| [Select Data Types](/best-practices/select-data-types) | Recommendations for choosing appropriate data types. | -| [Use Materialized Views](/best-practices/use-materialized-views) | When and how to benefit from materialized views. | -| [Minimize and Optimize JOINs](/best-practices/minimize-optimize-joins)| Best practices for minimizing and optimizing JOIN operations. | -| [Choosing a Partitioning Key](/best-practices/choosing-a-partitioning-key) | How to choose and apply partitioning keys effectively. | -| [Selecting an Insert Strategy](/best-practices/selecting-an-insert-strategy) | Strategies for efficient data insertion in ClickHouse. | -| [Data Skipping Indices](/best-practices/use-data-skipping-indices-where-appropriate) | When to apply data skipping indices for performance gains. | -| [Avoid Mutations](/best-practices/avoid-mutations) | Reasons to avoid mutations and how to design without them. | -| [Avoid OPTIMIZE FINAL](/best-practices/avoid-optimize-final) | Why `OPTIMIZE FINAL` can be costly and how to work around it. | -| [Use JSON where appropriate](/best-practices/use-json-where-appropriate) | Considerations for using JSON columns in ClickHouse. | + \ No newline at end of file diff --git a/docs/cloud/manage/postman.md b/docs/cloud/manage/api/postman.md similarity index 100% rename from docs/cloud/manage/postman.md rename to docs/cloud/manage/api/postman.md diff --git a/docs/cloud/onboard/01_discover/use_cases/02_observability.md b/docs/cloud/onboard/01_discover/use_cases/02_observability.md index 12d3d841b9f..1d5e42a11ba 100644 --- a/docs/cloud/onboard/01_discover/use_cases/02_observability.md +++ b/docs/cloud/onboard/01_discover/use_cases/02_observability.md @@ -58,26 +58,171 @@ While modern observability has moved beyond treating these as separate concerns, they remain fundamental concepts for understanding different aspects of system behavior. +1. **Logs** - Text-based records of discrete events that occur within a system. +These provide detailed context about specific occurrences, errors, and state changes. +2. **Metrics** - Numerical measurements collected over time. These include counters, +gauges, and histograms that help track system performance, resource usage, and business KPIs. +3. **Traces** - Records that track the journey of requests as they flow through distributed systems. +These help understand the relationships between services and identify performance bottlenecks. -## Observability use cases {#observability-use-cases} - -LangChain is a popular software framework that helps users build applications -that use large language models. They have built a commercial product called -LangSmith, a unified developer platform for LLM application observability and -evaluation that uses ClickHouse under the hood. LangSmith lets users understand -what’s going on in their LLM applications and allows them to debug agentic -workflows. It also helps developers detect excessive token use, a costly problem -they want to detect as soon as possible. When working with LLM applications, -there are invariably many moving pieces with chained API calls and decision -flows. This makes it challenging to understand what's going on under the hood, -with users needing to debug infinite agent loops or cases with excessive token -use. Seeing an obvious need here, LangSmith started as an observability tool to -help developers diagnose and resolve these issues by giving clear visibility and -debugging information at each step of an LLM sequence. - -> We wanted something that was architecturally simple to deploy and didn’t make -> our infrastructure more complicated. We looked at Druid and Pinot, but these -> required dedicated services for ingestion, connected to queuing services such -> as Kafka, rather than simply accepting `INSERT` statements. We were keen to avoid -> this architectural complexity, +These pillars enable teams to monitor, troubleshoot, and optimize their systems. +However, the real power comes from understanding how to effectively collect, +analyze, and correlate data across all three pillars to gain meaningful insights +into system behavior. + +## The benefits of observability {#the-benefits-of-observability} + +While the technical aspects of observability - logs, metrics, and traces - are +well understood, the business benefits are equally important to consider. + +In their book ["Observability Engineering"](https://clickhouse.com/engineering-resources/observability#:~:text=Observability%20Engineering) +(O'Reilly, 2022), Charity Majors, Liz Fong-Jones, and George Miranda draw from +industry research and anecdotal feedback to identify four key business benefits +that organizations can expect from implementing proper observability practices. +Let's examine these benefits: + +### Higher incremental revenue {#higher-incremental-revenue} + +The authors note that observability tools that help teams improve uptime and +performance can lead to increased incremental revenue through improved code quality. +This manifests in several ways: + +1. Improved customer experience: Fast problem resolution and prevention of service +degradation leads to higher customer satisfaction and retention +2. Increased system reliability: Better uptime means more successful transactions +and fewer lost business opportunities +3. Enhanced performance: The ability to identify and optimize performance bottlenecks +helps maintain responsive services that keep customers engaged +4. Competitive advantage: Organizations that can maintain high service quality +through comprehensive monitoring and quick issue resolution often gain an edge +over competitors + +### Cost Savings from faster incident response {#cost-savings-from-faster-incident-response} + +One of the most immediate benefits of observability is reduced labor costs +through faster detection and resolution of issues. This comes from: + +* Reduced Mean Time to Detect (MTTD) and Mean Time to Resolve (MTTR) +* Improved query response times, enabling faster investigation +* Quicker identification of performance bottlenecks +* Reduced time spent on-call +* Fewer resources wasted on unnecessary rollbacks + +We see this in practice - [trip.com built their observability system with ClickHouse](trip.com built their observability system with ClickHouse) +and achieved query speeds 4-30x faster than their previous solution, with 90% of +queries completing in under 300ms, enabling rapid issue investigation. + +### Cost savings from incidents avoided {#cost-savings-from-incidents-avoided} + +Observability doesn't just help resolve issues faster - it helps prevent them entirely. +The authors emphasize how teams can prevent critical issues by: + +* Identifying potential problems before they become critical +* Analyzing patterns to prevent recurring issues +* Understanding system behavior under different conditions +* Proactively addressing performance bottlenecks +* Making data-driven decisions about system improvements + +ClickHouse's [own observability platform, LogHouse](https://clickhouse.com/blog/building-a-logging-platform-with-clickhouse-and-saving-millions-over-datadog), +demonstrates this. It enables our core engineers to search historical patterns across all clusters, helping prevent +recurring issues. + +### Cost savings from decreased employee churn {#cost-savings-from-decreased-employee-churn} + +One of the most overlooked benefits is the impact on team satisfaction and retention. +The authors highlight how observability leads to: + +* Improved job satisfaction through better tooling +* Decreased developer burnout from fewer unresolved issues +* Reduced alert fatigue through better signal-to-noise ratio +* Lower on-call stress due to better incident management +* Increased team confidence in system reliability + +We see this in practice - when [Fastly migrated to ClickHouse](https://clickhouse.com/videos/scaling-graphite-with-clickhouse), +their engineers were amazed by the improvement in query performance, noting: + +> "I couldn't believe it. I actually had to go back a couple of times just to +> make sure that I was querying it properly... this is coming back too fast. +> This doesn't make sense." + +As the authors emphasize, while the specific measures of these benefits may vary +depending on the tools and implementation, these fundamental improvements can be +expected across organizations that adopt robust observability practices. The key +is choosing and implementing the right tools effectively to maximize these benefits. + +Achieving these benefits requires overcoming several significant hurdles. Even +organizations that understand the value of observability often find that +implementation presents unexpected complexities and challenges that must be +carefully navigated. + +## Challenges in implementing observability {#challenges-in-implementing-observability} + +Implementing observability within an organization is a transformative step toward +gaining deeper insights into system performance and reliability. However, this +journey is not without its challenges. As organizations strive to harness the +full potential of observability, they encounter various obstacles that can impede +progress. Let’s go through some of them. + +### Data volume and scalability {#data-volume-and-scalability} + +One of the primary hurdles in implementing observability is managing the sheer +volume and scalability of telemetry data generated by modern systems. As +organizations grow, so does the data they need to monitor, necessitating +solutions that efficiently handle large-scale data ingestion and +real-time analytics. + +### Integration with existing systems {#integration-with-existing-systems} + +Integration with existing systems poses another significant challenge. Many +organizations operate in heterogeneous environments with diverse technologies, +making it essential for observability tools to seamlessly integrate with current +infrastructure. Open standards are crucial in facilitating this integration, +ensuring interoperability and reducing the complexity of deploying observability +solutions across varied tech stacks. + +### Skill gaps {#skill-gaps} + +Skill gaps can also impede the successful implementation of observability. The +transition to advanced observability solutions often requires specialized +knowledge of data analytics and specific tools. Teams may need to invest in +training or hiring to bridge these gaps and fully leverage the capabilities of +their observability platforms. + +### Cost management {#cost-management} + +Cost management is critical, as observability solutions can become expensive, +particularly at scale. Organizations must balance the costs of these tools with +the value they provide, seeking cost-effective solutions that offer significant +savings compared to traditional approaches. + +### Data retention and storage {#data-retention-and-storage} + +Data retention and storage management present additional challenges. Deciding +how long to retain observability data without compromising performance or +insights requires careful planning and efficient storage solutions that reduce +storage requirements while maintaining data accessibility. + +### Standardization and vendor lock-in {#standardization-and-vendor-lock-in} + +Ensuring standardization and avoiding vendor lock-in are vital for maintaining +flexibility and adaptability in observability solutions. By adhering to open +standards, organizations can prevent being tied to specific vendors and ensure +their observability stack can evolve with their needs. + +### Security and compliance {#security-and-compliance} + +Security and compliance considerations remain crucial, especially when handling +sensitive data within observability systems. Organizations must ensure that their +observability solutions adhere to relevant regulations and effectively protect +sensitive information. + +These challenges underscore the importance of strategic planning and informed +decision-making in implementing observability solutions that effectively meet +organizational needs. + +To address these challenges, organizations need a well-structured approach to +implementing observability. The standard observability pipeline has evolved to +provide a framework for effectively collecting, processing, and analyzing +telemetry data. One of the earliest and most influential examples of this +evolution comes from Twitter's experience in 2013. diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide_part1.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/01_migration_guide_part1.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide_part2.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/02_migration_guide_part2.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide_part3.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/01_postgres/migration_guide/03_migration_guide_part3.md diff --git a/docs/cloud/onboard/03_tune/_snippets/_monitoring_table_of_contents.md b/docs/cloud/onboard/03_tune/_snippets/_monitoring_table_of_contents.md new file mode 100644 index 00000000000..e5d813d8226 --- /dev/null +++ b/docs/cloud/onboard/03_tune/_snippets/_monitoring_table_of_contents.md @@ -0,0 +1,3 @@ +| Page | Description | +|------|-------------| +| | | diff --git a/docs/cloud/onboard/03_tune/resource_tour.md b/docs/cloud/onboard/03_tune/resource_tour.md new file mode 100644 index 00000000000..07a83b51d01 --- /dev/null +++ b/docs/cloud/onboard/03_tune/resource_tour.md @@ -0,0 +1,46 @@ +--- +slug: /cloud/get-started/cloud/resource-tour +title: 'Resource tour' +keywords: ['clickhouse cloud'] +hide_title: true +--- + +import TableOfContents from '@site/docs/best-practices/_snippets/_table_of_contents.md'; +import TableOfContentsOptimizationAndPerformance from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; + +# Resource tour + +This article is intended to provide you with an overview of the resources available +to you in the docs to learn how to get the most out of your ClickHouse Cloud deployment. +We've broken down the resources available to you into the following categories: + +- Query optimization techniques and performance tuning +- Scaling strategies and resource management +- Monitoring +- Security best practices and compliance features +- Cost optimization strategies +- Troubleshooting common issues +- Production readiness checklist (coming soon) + +Before diving into more specific tipics, we recommend you start with our general +ClickHouse best practice guides which cover general best practices to follow when +using ClickHouse: + +
+ClickHouse general best practices + +
+ +
+Query optimization techniques and performance tuning + +
+ +
+Monitoring + +| Page | Description | +|----------------------------------------------------|------------------------------------------| +| [Prometheus integration](/integrations/prometheus) | Use Prometheus to monitor Cloud services | +
+ diff --git a/docs/cloud/onboard/index.md b/docs/cloud/onboard/index.md index 5f570d2f2b8..4170d898998 100644 --- a/docs/cloud/onboard/index.md +++ b/docs/cloud/onboard/index.md @@ -31,7 +31,7 @@ Topics include: - Architectures - Cloud features -## Explore ClickHouse Cloud {#evaluate-clickhouse-cloud} +## Scale and Optimize with ClickHouse Cloud {#evaluate-clickhouse-cloud} Now that your data is in ClickHouse Cloud, we'll walk you through some more advanced topics to help you get the most out of your ClickHouse Cloud experience and explore diff --git a/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md b/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md new file mode 100644 index 00000000000..9877a841c44 --- /dev/null +++ b/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md @@ -0,0 +1,17 @@ +| Topic | Description | +|---------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Query optimization guide](/optimize/query-optimization) | Start here for query optimization fundamentals, covering common scenarios and performance techniques to improve query execution speed. | +| [Primary indexes advanced guide](/guides/best-practices/sparse-primary-indexes) | Deep dive into ClickHouse's unique sparse primary indexing system, how it differs from traditional databases, and best practices for optimal indexing strategies. | +| [Query parallelism](/optimize/query-parallelism) | Learn how ClickHouse parallelizes query execution using processing lanes and `max_threads` settings, including how to inspect and optimize parallel execution. | +| [Partitioning key](/optimize/partitioning-key) | Master partition key selection to dramatically improve query performance by enabling efficient data segment pruning and avoiding common partitioning pitfalls. | +| [Data skipping indexes](/optimize/skipping-indexes) | Apply secondary indexes strategically to skip irrelevant data blocks and accelerate filtered queries on non-primary key columns. | +| [`PREWHERE` optimization](/optimize/prewhere) | Understand how `PREWHERE` automatically reduces I/O by filtering data before reading unnecessary columns, plus how to monitor its effectiveness. | +| [Bulk inserts](/optimize/bulk-inserts) | Maximize ingestion throughput and reduce resource overhead by batching data insertions effectively. | +| [Asynchronous inserts](/optimize/asynchronous-inserts) | Improve insert performance by leveraging server-side batching to reduce client-side complexity and increase throughput for high-frequency insertions. | +| [Avoid mutations](/optimize/avoid-mutations) | Design append-only workflows that eliminate costly `UPDATE` and `DELETE` operations while maintaining data accuracy and performance. | +| [Avoid nullable columns](/optimize/avoid-nullable-columns) | Reduce storage overhead and improve query performance by using default values instead of nullable columns where possible. | +| [Avoid `OPTIMIZE FINAL`](/optimize/avoidoptimizefinal) | Understand when you should and should not use `OPTIMIZE TABLE FINAL` | +| [Analyzer](/operations/analyzer) | Leverage ClickHouse's new query analyzer to identify performance bottlenecks and optimize query execution plans for better efficiency. | +| [Query profiling](/operations/optimizing-performance/sampling-query-profiler) | Use the sampling query profiler to analyze query execution patterns, identify performance hotspots, and optimize resource usage. | +| [Query cache](/operations/query-cache) | Accelerate frequently executed `SELECT` queries by enabling and configuring ClickHouse's built-in query result caching. | +| [Testing hardware](/operations/performance-test) | Run ClickHouse performance benchmarks on any server without installation to evaluate hardware capabilities. (Not applicable to ClickHouse Cloud) | \ No newline at end of file diff --git a/docs/guides/best-practices/index.md b/docs/guides/best-practices/index.md index 1b7acbac54a..ef320eaf03c 100644 --- a/docs/guides/best-practices/index.md +++ b/docs/guides/best-practices/index.md @@ -5,26 +5,12 @@ description: 'Overview page of Performance and Optimizations' title: 'Performance and Optimizations' --- +import TableOfContents from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; + # Performance and Optimizations This section contains tips and best practices for improving performance with ClickHouse. We recommend users read [Core Concepts](/parts) as a precursor to this section, which covers the main concepts required to improve performance. -| Topic | Description | -|---------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Query Optimization Guide](/optimize/query-optimization) | A good place to start for query optimization, this simple guide describes common scenarios of how to use different performance and optimization techniques to improve query performance. | -| [Primary Indexes Advanced Guide](/guides/best-practices/sparse-primary-indexes) | A deep dive into ClickHouse indexing including how it differs from other DB systems, how ClickHouse builds and uses a table's spare primary index and what some of the best practices are for indexing in ClickHouse. | -| [Query Parallelism](/optimize/query-parallelism) | Explains how ClickHouse parallelizes query execution using processing lanes and the max_threads setting. Covers how data is distributed across lanes, how max_threads is applied, when it isn't fully used, and how to inspect execution with tools like EXPLAIN and trace logs. | -| [Partitioning Key](/optimize/partitioning-key) | Delves into ClickHouse partition key optimization. Explains how choosing the right partition key can significantly improve query performance by allowing ClickHouse to quickly locate relevant data segments. Covers best practices for selecting efficient partition keys and potential pitfalls to avoid. | -| [Data Skipping Indexes](/optimize/skipping-indexes) | Explains data skipping indexes as a way to optimize performance. | -| [PREWHERE Optimization](/optimize/prewhere) | Explains how PREWHERE reduces I/O by avoiding reading unnecessary column data. Shows how it's applied automatically, how the filtering order is chosen, and how to monitor it using EXPLAIN and logs. | -| [Bulk Inserts](/optimize/bulk-inserts) | Explains the benefits of using bulk inserts in ClickHouse. | -| [Asynchronous Inserts](/optimize/asynchronous-inserts) | Focuses on ClickHouse's asynchronous inserts feature. It likely explains how asynchronous inserts work (batching data on the server for efficient insertion) and their benefits (improved performance by offloading insert processing). It might also cover enabling asynchronous inserts and considerations for using them effectively in your ClickHouse environment. | -| [Avoid Mutations](/optimize/avoid-mutations) | Discusses the importance of avoiding mutations (updates and deletes) in ClickHouse. It recommends using append-only inserts for optimal performance and suggests alternative approaches for handling data changes. | -| [Avoid Nullable Columns](/optimize/avoid-nullable-columns) | Discusses why you may want to avoid Nullable columns to save space and increase performance. Demonstrates how to set a default value for a column. | -| [Avoid Optimize Final](/optimize/avoidoptimizefinal) | Explains how the `OPTIMIZE TABLE ... FINAL` query is resource-intensive and suggests alternative approaches to optimize ClickHouse performance. | -| [Analyzer](/operations/analyzer) | Looks at the ClickHouse Analyzer, a tool for analyzing and optimizing queries. Discusses how the Analyzer works, its benefits (e.g., identifying performance bottlenecks), and how to use it to improve your ClickHouse queries' efficiency. | -| [Query Profiling](/operations/optimizing-performance/sampling-query-profiler) | Explains ClickHouse's Sampling Query Profiler, a tool that helps analyze query execution. | -| [Query Cache](/operations/query-cache) | Details ClickHouse's Query Cache, a feature that aims to improve performance by caching the results of frequently executed `SELECT` queries. | -| [Testing Hardware](/operations/performance-test) | How to run a basic ClickHouse performance test on any server without installation of ClickHouse packages. (Not applicable to ClickHouse Cloud) | + \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 118b70f822e..950e1116794 100644 --- a/sidebars.js +++ b/sidebars.js @@ -212,7 +212,7 @@ const sidebars = { { type: "category", label: "Discover", - collapsed: false, + collapsed: true, collapsible: true, items: [ { @@ -224,7 +224,7 @@ const sidebars = { { type: "category", label: "Setup", - collapsed: false, + collapsed: true, collapsible: true, items: [ { @@ -232,6 +232,18 @@ const sidebars = { dirName: "cloud/onboard/02_migrate", } ] + }, + { + type: "category", + label: "Tune", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "cloud/onboard/03_tune", + } + ] } ] }, @@ -323,7 +335,6 @@ const sidebars = { "cloud/manage/notifications", "cloud/manage/upgrades", "cloud/manage/account-close", - "cloud/manage/postman", "faq/troubleshooting", "cloud/manage/network-data-transfer", { @@ -354,6 +365,7 @@ const sidebars = { items: [ "cloud/manage/api/api-overview", "cloud/manage/openapi", + "cloud/manage/api/postman", { type: 'link', label: "API Reference", From c70eda42148d069c5d52ad5d25a87b2c1c1b3fdd Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 29 Jul 2025 16:58:19 +0200 Subject: [PATCH 06/29] more Cloud structure changes, Snowflake and Redshift migration guides --- docs/cloud/{manage => }/api/api-overview.md | 0 docs/cloud/{manage => }/api/index.md | 0 docs/cloud/{manage => }/api/openapi.md | 0 docs/cloud/{manage => }/api/postman.md | 0 docs/cloud/manage/_category_.yml | 6 - docs/cloud/manage/index.md | 30 --- .../02_use_cases/01_real-time-analytics.md | 2 + .../02_use_cases/02_observability.md | 3 + .../03_data_lake_and_warehouse.md | 118 ++++++++- .../04_machine_learning_and_genAI.md | 6 - .../01_overview.md | 100 +++++++ .../02_data_prep_feature_engineering.md | 246 ++++++++++++++++++ .../03_agent_facing_analytics.md | 175 +++++++++++++ .../_category_.json | 6 + .../{01_comparison.md => 01_overview.md} | 0 .../{01_comparison.md => 01_overview.md} | 0 .../02_migrating-to-clickhouse-cloud.md | 1 + .../_04_sql_translation_reference.md | 0 .../04_snowflake/01_comparison.md | 11 - .../04_snowflake/01_overview.md | 192 ++++++++++++++ ...{02_snowflake.md => 02_migration_guide.md} | 30 +-- .../03_sql_translation_reference.md | 114 ++++++++ ...wflake_clickhouse_translation_reference.md | 8 - .../{01_comparison.md => 01_overview.md} | 6 +- .../06_redshift/01_comparison.md | 12 - .../06_redshift/01_overview.md | 69 +++++ .../{02_migrate.md => 02_migration_guide.md} | 1 - .../03_sql_translation_reference.md | 95 +++++++ .../{changelog.md => 01_changelog.md} | 0 .../01_changelog/02_release_notes}/24_02.md | 0 .../01_changelog/02_release_notes}/24_05.md | 0 .../01_changelog/02_release_notes}/24_06.md | 0 .../01_changelog/02_release_notes}/24_08.md | 0 .../01_changelog/02_release_notes}/24_10.md | 0 .../01_changelog/02_release_notes}/24_12.md | 0 .../01_changelog/02_release_notes}/25_04.md | 0 .../01_changelog/02_release_notes}/25_06.md | 0 .../02_release_notes/_category_.json | 6 + .../02_release_notes/index.md} | 0 .../reference/01_changelog/_category_.json | 6 + .../{changelogs-index.md => index.md} | 2 +- ...{05_architecture.md => 02_architecture.md} | 2 +- .../03_billing/01_billing_overview.md} | 2 +- .../aws-marketplace-committed.md | 0 .../02_marketplace}/aws-marketplace-payg.md | 0 .../azure-marketplace-committed.md | 0 .../02_marketplace}/azure-marketplace-payg.md | 0 .../gcp-marketplace-committed.md | 0 .../02_marketplace}/gcp-marketplace-payg.md | 0 .../02_marketplace}/index.md | 0 .../02_marketplace}/overview.md | 0 .../03_payment-thresholds.md} | 2 +- .../04_network-data-transfer.mdx | 2 +- .../05_billing_compliance.md} | 2 +- .../{02_billing => 03_billing}/index.md | 0 ...atibility.md => 04_cloud-compatibility.md} | 2 +- ...ted-regions.md => 05_supported-regions.md} | 2 +- ...service-uptime.md => 06_service-uptime.md} | 2 +- .../settings.md => reference/08_settings.md} | 4 +- .../_snippets/_clickpipes_faq.md | 0 .../09_jan2025_faq}/backup.md | 0 .../09_jan2025_faq}/billing.md | 0 .../09_jan2025_faq}/dimensions.md | 4 +- .../09_jan2025_faq}/index.md | 0 .../09_jan2025_faq}/new_tiers.md | 2 +- .../09_jan2025_faq}/plan_migrations.md | 2 +- .../09_jan2025_faq}/scaling.md | 0 .../09_jan2025_faq}/summary.md | 0 .../{account-close.md => 10_account-close.md} | 5 +- .../_snippets/_network_transfer_rates.md | 0 .../redshift/_snippets/_migration_guide.md | 8 +- docs/whats-new/changelog/cloud.md | 2 +- .../unable-to-access-cloud-service.mdx | 13 +- sidebars.js | 78 ++---- .../discover/use_cases/cloud_architecture.png | Bin 0 -> 83486 bytes .../discover/use_cases/datalakehouse_01.png | Bin 0 -> 93124 bytes .../onboard/discover/use_cases/ml_ai_01.png | Bin 0 -> 53816 bytes .../onboard/discover/use_cases/ml_ai_02.png | Bin 0 -> 67405 bytes .../onboard/discover/use_cases/ml_ai_03.png | Bin 0 -> 56048 bytes .../onboard/discover/use_cases/ml_ai_04.png | Bin 0 -> 90820 bytes .../onboard/discover/use_cases/ml_ai_05.png | Bin 0 -> 5187 bytes .../onboard/discover/use_cases/ml_ai_06.png | Bin 0 -> 74529 bytes .../onboard/discover/use_cases/ml_ai_07.png | Bin 0 -> 16272 bytes .../onboard/discover/use_cases/ml_ai_08.png | Bin 0 -> 24407 bytes .../onboard/discover/use_cases/ml_ai_09.png | Bin 0 -> 54196 bytes .../use_cases/snowflake_architecture.png | Bin 0 -> 16004 bytes vercel.json | 5 + 87 files changed, 1205 insertions(+), 179 deletions(-) rename docs/cloud/{manage => }/api/api-overview.md (100%) rename docs/cloud/{manage => }/api/index.md (100%) rename docs/cloud/{manage => }/api/openapi.md (100%) rename docs/cloud/{manage => }/api/postman.md (100%) delete mode 100644 docs/cloud/manage/_category_.yml delete mode 100644 docs/cloud/manage/index.md delete mode 100644 docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI.md create mode 100644 docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md create mode 100644 docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md create mode 100644 docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md create mode 100644 docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/_category_.json rename docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/{01_comparison.md => 01_overview.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/{01_comparison.md => 01_overview.md} (100%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/_04_sql_translation_reference.md delete mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_comparison.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md rename docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/{02_snowflake.md => 02_migration_guide.md} (89%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md delete mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/_03_snowflake_clickhouse_translation_reference.md rename docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/{01_comparison.md => 01_overview.md} (62%) delete mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_comparison.md create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md rename docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/{02_migrate.md => 02_migration_guide.md} (94%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md rename docs/cloud/reference/01_changelog/{changelog.md => 01_changelog.md} (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_02.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_05.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_06.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_08.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_10.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/24_12.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/25_04.md (100%) rename docs/cloud/{changelogs => reference/01_changelog/02_release_notes}/25_06.md (100%) create mode 100644 docs/cloud/reference/01_changelog/02_release_notes/_category_.json rename docs/cloud/reference/{release-notes-index.md => 01_changelog/02_release_notes/index.md} (100%) create mode 100644 docs/cloud/reference/01_changelog/_category_.json rename docs/cloud/reference/01_changelog/{changelogs-index.md => index.md} (91%) rename docs/cloud/reference/{05_architecture.md => 02_architecture.md} (98%) rename docs/cloud/{manage/billing.md => reference/03_billing/01_billing_overview.md} (99%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/aws-marketplace-committed.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/aws-marketplace-payg.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/azure-marketplace-committed.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/azure-marketplace-payg.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/gcp-marketplace-committed.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/gcp-marketplace-payg.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/index.md (100%) rename docs/cloud/reference/{02_billing/marketplace => 03_billing/02_marketplace}/overview.md (100%) rename docs/cloud/reference/{02_billing/payment-thresholds.md => 03_billing/03_payment-thresholds.md} (97%) rename docs/cloud/reference/{ => 03_billing}/04_network-data-transfer.mdx (96%) rename docs/cloud/reference/{02_billing/troubleshooting-billing-issues.md => 03_billing/05_billing_compliance.md} (99%) rename docs/cloud/reference/{02_billing => 03_billing}/index.md (100%) rename docs/cloud/reference/{03_cloud-compatibility.md => 04_cloud-compatibility.md} (99%) rename docs/cloud/reference/{supported-regions.md => 05_supported-regions.md} (98%) rename docs/cloud/reference/{service-uptime.md => 06_service-uptime.md} (95%) rename docs/cloud/{manage/settings.md => reference/08_settings.md} (94%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/_snippets/_clickpipes_faq.md (100%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/backup.md (100%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/billing.md (100%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/dimensions.md (94%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/index.md (100%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/new_tiers.md (99%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/plan_migrations.md (99%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/scaling.md (100%) rename docs/cloud/{manage/jan2025_faq => reference/09_jan2025_faq}/summary.md (100%) rename docs/cloud/reference/{account-close.md => 10_account-close.md} (98%) rename docs/cloud/{manage => reference}/_snippets/_network_transfer_rates.md (100%) rename docs/faq/troubleshooting.md => knowledgebase/unable-to-access-cloud-service.mdx (63%) create mode 100644 static/images/cloud/onboard/discover/use_cases/cloud_architecture.png create mode 100644 static/images/cloud/onboard/discover/use_cases/datalakehouse_01.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_01.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_02.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_03.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_04.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_05.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_06.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_07.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_08.png create mode 100644 static/images/cloud/onboard/discover/use_cases/ml_ai_09.png create mode 100644 static/images/cloud/onboard/discover/use_cases/snowflake_architecture.png diff --git a/docs/cloud/manage/api/api-overview.md b/docs/cloud/api/api-overview.md similarity index 100% rename from docs/cloud/manage/api/api-overview.md rename to docs/cloud/api/api-overview.md diff --git a/docs/cloud/manage/api/index.md b/docs/cloud/api/index.md similarity index 100% rename from docs/cloud/manage/api/index.md rename to docs/cloud/api/index.md diff --git a/docs/cloud/manage/api/openapi.md b/docs/cloud/api/openapi.md similarity index 100% rename from docs/cloud/manage/api/openapi.md rename to docs/cloud/api/openapi.md diff --git a/docs/cloud/manage/api/postman.md b/docs/cloud/api/postman.md similarity index 100% rename from docs/cloud/manage/api/postman.md rename to docs/cloud/api/postman.md diff --git a/docs/cloud/manage/_category_.yml b/docs/cloud/manage/_category_.yml deleted file mode 100644 index 59089856c86..00000000000 --- a/docs/cloud/manage/_category_.yml +++ /dev/null @@ -1,6 +0,0 @@ -label: 'Manage Cloud' -collapsible: true -collapsed: true -link: - type: generated-index - title: Manage ClickHouse Cloud diff --git a/docs/cloud/manage/index.md b/docs/cloud/manage/index.md deleted file mode 100644 index 46c407d0c6b..00000000000 --- a/docs/cloud/manage/index.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -slug: /cloud/manage -keywords: ['AWS', 'Cloud', 'serverless', 'management'] -title: 'Overview' -hide_title: true -description: 'Overview page for Managing Cloud' ---- - -# Managing Cloud - -In this section of the docs you will find all the information you may need about managing ClickHouse cloud. This section contains the following pages: - -| Page | Description | -|-----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------| -| [ClickHouse Cloud Tiers](/cloud/manage/cloud-tiers) | Describes the different cloud tiers, their features, and considerations for choosing the right one. | -| [Integrations](/manage/integrations) | Covers ClickHouse Cloud's built-in integrations, custom integrations, and integrations that are not supported. | -| [Backups](/cloud/manage/backups) | Describes how backups work in ClickHouse Cloud, what options you have to configure backups for your service, and how to restore from a backup. | -| [Monitoring](/integrations/prometheus) | How to integrate Prometheus as a way to monitor ClickHouse cloud. | -| [Billing](/cloud/manage/billing/overview) | Explains the pricing model for ClickHouse Cloud, including the factors that affect the cost of your service. | -| [Configuring Settings](/manage/settings) | Describes how to configure settings for ClickHouse Cloud. | -| [Replica-aware Routing](/manage/replica-aware-routing) | Explains what Replica-aware Routing in ClickHouse Cloud is, its limitations, and how to configure it. | -| [Automatic Scaling](/manage/scaling) | Explains how ClickHouse Cloud services can be scaled manually or automatically based on your resource needs. | -| [Service Uptime and SLA](/cloud/manage/service-uptime) | Information about service uptime and Service Level Agreements offered for production instances. | -| [Notifications](/cloud/notifications) | Shows how ClickHouse Cloud notifications are received and how they can be customized. | -| [Upgrades](/manage/updates) | Information on how upgrades are rolled out in ClickHouse Cloud. | -| [Delete Account](/cloud/manage/close_account) | Information on how to close or delete your account when necessary. | -| [Programmatic API Access with Postman](/cloud/manage/postman) | A guide to help you test the ClickHouse API using Postman. | -| [Troubleshooting](/faq/troubleshooting) | A collection of commonly encountered issues and how to troubleshoot them. | -| [Data Transfer](./network-data-transfer.mdx) | Learn more about how ClickHouse Cloud meters data transferred ingress and egress. | -| [Jan 2025 Changes FAQ](./jan2025_faq/index.md) | Learn more about changes to Cloud introduced in Jan 2025. | diff --git a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md index 92dd00da847..96f18161229 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md @@ -11,6 +11,8 @@ import rta_1 from '@site/static/images/cloud/onboard/discover/use_cases/1_rta.pn import rta_2 from '@site/static/images/cloud/onboard/discover/use_cases/2_rta.png'; import rta_3 from '@site/static/images/cloud/onboard/discover/use_cases/3_rta.png'; + + ## What is real-time analytics? Real-time analytics refers to data processing that delivers insights to end users diff --git a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md index 1d5e42a11ba..e88c7f77638 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md @@ -5,6 +5,8 @@ keywords: ['use cases', 'observability'] sidebar_label: 'Observability' --- + + Modern software systems are complex. Microservices, cloud infrastructure, and distributed systems have made it increasingly difficult to understand what's happening inside our applications. When something goes wrong, teams need to know @@ -15,6 +17,7 @@ into a comprehensive approach to understanding system behavior. However, implementing effective observability isn't straightforward - it requires understanding technical concepts and organizational challenges. + ## What is Observability? Observability is understanding a system's internal state by examining its outputs. diff --git a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md index 80a562b47eb..173e0de4751 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md @@ -1,6 +1,118 @@ --- slug: /cloud/get-started/cloud/use-cases/data_lake_and_warehouse -title: 'Data Lake and Warehousing' +title: 'Data Lakehouse' keywords: ['use cases', 'data lake and warehouse'] -sidebar_label: 'Data lake and warehousing' ---- \ No newline at end of file +sidebar_label: 'Data Lakehouse' +--- + +import Image from '@theme/IdealImage'; +import datalakehouse_01 from '@site/static/images/cloud/onboard/discover/use_cases/datalakehouse_01.png'; + + + +The data lakehouse is a convergent architecture that applies database principles +to data lake infrastructure while maintaining the flexibility and scale of cloud storage systems. + +The lakehouse is not just taking a database apart but building database-like +capabilities onto a fundamentally different foundation (cloud object storage) +that focuses on supporting traditional analytics and modern AI/ML workloads in +a unified platform. + +## What are the components of the data lakehouse? {#components-of-the-data-lakehouse} + +The modern data lakehouse architecture represents a convergence of data warehouse +and data lake technologies, combining the best aspects of both approaches. This +architecture comprises several distinct but interconnected layers providing a +flexible, robust data storage, management, and analysis platform. + +Understanding these components is essential for organizations looking to +implement or optimize their data lakehouse strategy. The layered approach allows +for component substitution and independent evolution of each layer, providing +architectural flexibility and future-proofing. + +Let's explore the core building blocks of a typical data lakehouse architecture +and how they interact to create a cohesive data management platform. + +Components of the data lakehouse + +| Component | Description | +|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Data sources** | The lakehouse's data sources include operational databases, streaming platforms, IoT devices, application logs, and external providers. | +| **Query engine** | Processes analytical queries against the data stored in the object storage, leveraging the metadata and optimizations provided by the table format layer. Supports SQL and potentially other query languages to analyze large volumes of data efficiently. | +| **Metadata catalog** | The [data catalog](https://clickhouse.com/engineering-resources/data-catalog) acts as a central repository for metadata, storing and managing table definitions and schemas, partitioning information, and access control policies. Enables data discovery, lineage tracking, and governance across the lakehouse. | +| **Table format layer** | The [table format layer](https://clickhouse.com/engineering-resources/open-table-formats) manages the logical organization of data files into tables, providing database-like features such as ACID transactions, schema enforcement and evolution, time travel capabilities, and performance optimizations like data skipping and clustering. | +| **Object storage** | This layer provides scalable, durable, cost-effective storage for all data files and metadata. It handles the physical persistence of data in an open format, enabling direct access from multiple tools and systems. | +| **Client applications** | Various tools and applications that connect to the lakehouse to query data, visualize insights, or build data products. These can include BI tools, data science notebooks, custom applications, and ETL/ELT tools. | + +## What are the benefits of the data lakehouse? {#benefits-of-the-data-lakehouse} + +The data lakehouse architecture offers several significant advantages when compared +directly to both traditional data warehouses and data lakes: + +### Compared to traditional data warehouses {#compared-to-traditional-data-warehouses} + +| # | Benefit | Description | +|---|--------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1 | **Cost efficiency** | Lakehouses leverage inexpensive object storage rather than proprietary storage formats, significantly reducing storage costs compared to data warehouses that charge premium prices for their integrated storage. | +| 2 | **Component flexibility and interchangeability** | The lakehouse architecture allows organizations to substitute different components. Traditional systems require wholesale replacement when requirements change or technology advances, while lakehouses enable incremental evolution by swapping out individual components like query engines or table formats. This flexibility reduces vendor lock-in and allows organizations to adapt to changing needs without disruptive migrations. | +| 3 | **Open format support** | Lakehouses store data in open file formats like Parquet, allowing direct access from various tools without vendor lock-in, unlike proprietary data warehouse formats that restrict access to their ecosystem. | +| 4 | **AI/ML integration** | Lakehouses provide direct access to data for machine learning frameworks and Python/R libraries, whereas data warehouses typically require extracting data before using it for advanced analytics. | +| 5 | **Independent scaling** | Lakehouses separate storage from compute, allowing each to scale independently based on actual needs, unlike many data warehouses, where they scale together. | + +### Compared to data lakes {#compared-to-data-lakes} + +| # | Benefit | Description | +|---|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1 | **Query performance** | Lakehouses implement indexing, statistics, and data layout optimizations that enable SQL queries to run at speeds comparable to data warehouses, overcoming the poor performance of raw data lakes. | +| 2 | **Data consistency** | Through ACID transaction support, lakehouses ensure consistency during concurrent operations, solving a major limitation of traditional data lakes, where file conflicts can corrupt data. | +| 3 | **Schema management** | Lakehouses enforce schema validation and track schema evolution, preventing the "data swamp" problem common in data lakes where data becomes unusable due to schema inconsistencies. | +| 4 | **Governance capabilities** | Lakehouses provide fine-grained access control and auditing features at row/column levels, addressing the limited security controls in basic data lakes. | +| 5 | **BI Tool support** | Lakehouses offer SQL interfaces and optimizations that make them compatible with standard BI tools, unlike raw data lakes that require additional processing layers before visualization. | + +## Where does ClickHouse fit in the data lakehouse architecture? {#where-does-clickhouse-fit-in-the-data-lakehouse-architecture} + +ClickHouse is a powerful analytical query engine within the modern data lakehouse +ecosystem. It offers organizations a high-performance option for analyzing data +at scale. ClickHouse is a compelling choice due to its exceptional query speed and +efficiency. + +Within the lakehouse architecture, ClickHouse functions as a specialized +processing layer that can flexibly interact with the underlying data. It can +directly query Parquet files stored in cloud object storage systems like S3, +Azure Blob Storage, or Google Cloud Storage, leveraging its optimized columnar +processing capabilities to deliver rapid results even on massive datasets. +This direct query capability allows organizations to analyze their lake data +without complex data movement or transformation processes. + +ClickHouse integrates with open table formats such as Apache Iceberg, Delta Lake, +or Apache Hudi for more sophisticated data management needs. This integration +enables ClickHouse to take advantage of these formats' advanced features, while +still delivering the exceptional query performance it's known for. Organizations +can integrate these table formats directly or connect through metadata catalogs +like AWS Glue, Unity, or other catalog services. + +By incorporating ClickHouse as a query engine in their lakehouse architecture, +organizations can run lightning-fast analytical queries against their data lake +while maintaining the flexibility and openness that define the lakehouse approach. +This combination delivers the performance characteristics of a specialized +analytical database without sacrificing the core benefits of the lakehouse model, +including component interchangeability, open formats, and unified data management. + +## Hybrid architecture: The best of both worlds {#hybrid-architecture-the-best-of-both-worlds} + +While ClickHouse excels at querying lakehouse components, its highly optimized +storage engine offers an additional advantage. For use cases demanding ultra-low +latency queries - such as real-time dashboards, operational analytics, or +interactive user experiences - organizations can selectively store +performance-critical data directly in ClickHouse's native format. This hybrid +approach delivers the best of both worlds: the unmatched query speed of +ClickHouse's specialized storage for time-sensitive analytics and the flexibility +to query the broader data lakehouse when needed. + +This dual capability allows organizations to implement tiered data strategies +where hot, frequently accessed data resides in ClickHouse's optimized storage +for sub-second query responses, while maintaining seamless access to the complete +data history in the lakehouse. Teams can make architectural decisions based on +performance requirements rather than technical limitations, using ClickHouse as +a lightning-fast analytical database for critical workloads and a flexible query +engine for the broader data ecosystem. diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI.md deleted file mode 100644 index 0179ad89157..00000000000 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -slug: /cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai -title: 'Machine learning and generative AI' -keywords: ['use cases', 'Machine Learning', 'Generative AI'] -sidebar_label: 'Machine learning and generative AI' ---- \ No newline at end of file diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md new file mode 100644 index 00000000000..3fede8379fd --- /dev/null +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md @@ -0,0 +1,100 @@ +--- +slug: /cloud/get-started/cloud/use-cases/AI_ML +title: 'Machine learning and generative AI' +keywords: ['use cases', 'Machine Learning', 'Generative AI'] +sidebar_label: 'Overview' +--- + + + +## The rapidly evolving data landscape for Machine Learning and Generative AI {#the-rapidly-evolving-data-landscape-for-machine-learning-and-generative-ai} + +Rapid advancements in Machine Learning and Generative AI are completely reshaping +how business and society operate, driving an ever-increasing demand for data on +an unparalleled scale. +At the time of writing, language training dataset size is growing on average 3.7x +per year, while it is projected that the largest training run will use all +public human-generated text by 2028. At the same time, users of these applications +increasingly expect real-time performance and the success of AI and ML-driven +insights, like personalized recommendations, accurate forecasting, or chatbots, +hinge on the ability to handle massive datasets in real-time. Against the backdrop +of these changes, traditional data architectures often face significant challenges +when it comes to meeting the scale and real-time requirements that modern AI/ML +workloads demand. + +## Challenges of traditional data stacks for AI/ML workloads {#challenges-of-traditional-data-stacks} + +Traditional database systems are often not designed for the massive analytical +workloads and complex queries inherent in modern ML and GenAI applications. +They frequently become bottlenecks as data volume grows and query complexity +increases, hindering the rapid processing required for AI. In addition to this, +machine learning architectures can become fragmented and challenging to handle +due to a proliferation of specialized tools and components which often leads to +higher learning curves, increased points of failure, and escalating expenses. +Real-time processing for ML faces significant challenges, including dealing with +the sheer volume and velocity of incoming data, minimizing latency and response +times, and continuously addressing issues like model drift and ensuring data +quality. These systems, designed for structured data at much smaller scales, often +take days or weeks when faced with terabytes or petabytes of data. Not only do +they become a performance bottleneck, but also a cost bottleneck, often relying +on expensive, close-coupled storage that does not scale cost effectively. + +## ClickHouse as a foundation for real-time AI/ML {#clickhouse-for-real-time-ai-ml} + +ClickHouse was designed and built from the ground upto tackle data at scale in +real-time. As such it is ideally positioned for handling the requirements of +today’s AI and ML applications. Several core features enable it to ingest, +process and query datasets on the petabyte scale with real-time performance: + +| Feature | Description | +|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Columnar Storage** | ClickHouse utilizes a columnar storage model. This means that data from each column of an inserted row is stored together on disk, which enables significantly more efficient compression and boosts query speed by allowing the system to read only the relevant columns required for a query, which drastically reduces disk I/O. This is particularly advantageous for analytical queries common in ML/GenAI that often involve aggregations or filtering on a subset of columns. | +| **High Performance** | ClickHouse offers for its lightning-fast query processing, capable of querying billions of rows in milliseconds. It achieves this through a fully parallelized query pipeline and vectorized query execution engine, which processes multiple rows simultaneously at the CPU level, maximizing efficiency. | +| **Scalability** | Designed for horizontal scalability, ClickHouse allows users to add more servers (nodes) to a cluster to handle increasing data volumes and query loads, distributing data and queries across them. Performance scales linearly with the addition of each new server, enabling it to easily handle petabytes of data. | +| **Real-time data ingestion** | It is built for continuous data ingestion, supporting high rates of inserts and merges (billions of rows per second, gigabytes per second) without disrupting ongoing queries or analytics. This capability is crucial for environments where data arrives in a constant stream, such as from IoT devices or application logs, ensuring that ML models are fueled with the most up-to-date information. | +| **Specialized data types & functions** | In addition to standard SQL data types, syntax and functions, ClickHouse offers a host of additional specialised data typesand functions suited for ML use cases. Some of these include Array functions which natively support vector operations, distance calculations, array manipulations; Native JSON support for efficient processing of semi-structured data common to ML feature stores; Approximate algorithms like HyperLogLog, quantiles, and sampling functions for large-scale statistical analysis or numeric indexed vectors for vector aggregation and pointwise operations. | +| **Extensive integration ecosystem** | ClickHouse's extensive integration ecosystem makes it exceptionally valuable for AI/ML applications by seamlessly connecting with every critical component of the ML toolchain—from Python/pandas and Jupyter for data science workflows, to Spark and Kafka for large-scale data processing, to Airflow for pipeline orchestration, and Grafana for model monitoring—eliminating the typical friction and data movement bottlenecks that plague multi-tool ML environments. | + +## How ClickHouse helps simplify the AI/ML Data Stack {#simplify-the-ai-ml-data-stack} + +ClickHouse streamlines the traditionally fragmented AI/ML data infrastructure +by serving as a unified platform that handles multiple data management +functions within a single high-performance system. Rather than maintaining +separate specialized datastores for different ML tasks, ClickHouse provides +a consolidated foundation for analytics, machine learning workloads, and +data preparation and exploration. + +ClickHouse natively integrates with object storage like S3, GCP and Azure. It +integrates with data lakes, enabling direct querying of data in popular formats +like Iceberg, Delta Lake, and Hudi, positioning it as a comprehensive access and +computation layer for ML operations. This unified approach tackles challenges +faced in MLOps by reducing the complexity that typically stems from managing +multiple systems. + +Data fragmentation across separate stores creates many operational pain +points such as escalating costs, increased failure risks, and the need for +duplicate transformation logic between training and inference pipelines. +ClickHouse addresses these issues by consolidating all of this functionality +into a single system, particularly for feature engineering where consistency +between offline training and online serving is critical. + +Through its integration with data catalogs including Unity, AWS Glue, Polaris, +and Hive Metastore, ClickHouse minimizes data movement and duplication. This +architectural approach ensures that feature definitions remain consistent +across models and experiments, reducing the risk of discrepancies that can +undermine model performance. For MLOps teams, this +translates to less time managing infrastructure complexity and more focus on +core activities like model development and deployment, ultimately accelerating +the ML lifecycle while improving the economic viability of AI initiatives at +scale. + +## ClickHouse across the AI/ML Lifecycle {#clickhouse-across-the-ai-ml-lifecycle} + +ClickHouse's capabilities span the entire AI/ML lifecycle, providing a robust and +efficient platform from the very first stages of data preparation all the way to +model deployment and monitoring. + +| Area | Description | +|----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| +| [Data preparation and feature engineering](/get-started/cloud/use-cases/AI_ML/feature_engineering) | Learn how ClickHouse is used in the data preparation and feature engineering stages of the AI/ML pipeline | +| [Agent-facing analytics](/cloud/get-started/cloud/use-cases/AI_ML/agent_facing_analytics) | Learn how ClickHouse enables agentic facing analytics | diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md new file mode 100644 index 00000000000..dfe0283a179 --- /dev/null +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md @@ -0,0 +1,246 @@ +--- +slug: /cloud/get-started/cloud/use-cases/AI_ML/feature_engineering +title: 'Data preparation and feature engineering' +keywords: ['use cases', 'Machine Learning', 'Generative AI'] +sidebar_label: 'Data preparation and feature engineering' +--- + +import Image from '@theme/IdealImage'; +import ml_ai_01 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_01.png'; +import ml_ai_02 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_02.png'; +import ml_ai_03 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_03.png'; +import ml_ai_04 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_04.png'; + +## Data preparation and feature engineering {#data-preparation-and-feature-engineering} + +Data preparation bridges raw data and effective machine learning or AI +models, typically consuming the majority of time in AI/ML projects and +directly determining model success. It sits between initial data collection +and model development in the lifecycle, transforming messy, inconsistent +real-world data into clean, structured formats that algorithms can +effectively learn from. `clickhouse-local`, `chDB` (an in-process version +of ClickHouse for Python), open-source ClickHouse server or ClickHouse Cloud +allow developers and data scientists to work with ever-growing amounts of +data interactively and efficiently for ad-hoc querying, data cleaning, and +feature engineering. + +### What is a feature store? {#what-is-a-feature-store} + +In its simplest form, a feature store is a centralized repository for storing +and managing feature data and acting as the source of truth. By providing +APIs that allow the storage, versioning, and retrieval of features, feature +stores aim to provide a consistent view of features for training and +inference from development to production environments. Whether a custom-built +in-house solution or off-the-shelf product, actual product-level features +provided by a feature store will vary, with some providing a complete data +platform capable of aggregating data into features and even providing a +compute engine for the training of models. + +Irrespective of how many capabilities are inherent to the feature store, all +provide abstractions to the underlying data with which data scientists and +engineers will be familiar. As well as delivering data as versioned +entities, features, and classes, most expose concepts of feature groups, +training sets, batching, streaming, and point-in-time queries (such as the +ability to identify the values for a feature at either a specific point, +e.g. the latest value). + +Feature store + +### Why might you use one? {#why-use-one} + +In theory, a feature store ties disparate systems and capabilities together to +form a complete ML data layer, capable of both acting as the source of truth for +training data and also being used to provide context when predictions are being +made. + +While the exact capabilities they provide vary, the objectives remain the same: + +- **improve collaboration and reusability** between data scientists and data +engineers by centralizing features and their transformation logic +- **reduce model iteration time** during both experimentation and deployment by +allowing feature re-use at both training and inference time +- **governance and compliance** through rules and versioning which can restrict +model access to sensitive data (and features) +- **improve model performance and reliability** by abstracting the complexity of +data engineering from data scientists and ensuring they work with only quality +consistent features delivered through an API. + +While these represent a very high-level overview of some of the problems a +feature store solves, the predominant benefit here is the ability to share +features across teams and utilize the same data for training and inference. + +Feature stores also address a number of other challenges present in MLOps, +such as how to backfill feature data, handle incremental updates to the +source data (to update features), or monitor new data for drift. More +recently, they have also integrated vector databases to act as the +orchestration layer for RAG pipelines or to help find similar features +using embeddings - a useful capability during some model training. + +### Components of a feature store {#components-of-a-feature-store} + +Before we explore how ClickHouse might fit into a feature store, understanding +the common components is helpful for context. Typically, a feature store will +consist of up to 4 main components: + +Components of a feature store + +- **Data source** - While this can be as simple as a CSV file, it is often a +database or data lake with files in a format like Iceberg and accessible +through a query engine. + +- **Transformation engine (optional)** - Raw data needs to be transformed into +features. In a simple case, a feature can be correlated with a column's +values. More likely, it is the result of a transformation process involving +joins, aggregations, and expressions changing the structure and/or type of +column values. Some feature stores (see Types of Feature Store) might +provide built-in capabilities to achieve this; others may offload the work +to local Python functions or, for larger datasets, the database (maybe even +using dbt under the hood) via materializations, or a processing engine such +as Spark. With ClickHouse, this is achievable through Materialized Views. +Features that are continuously subject to update often require some form of +streaming pipeline, typically implemented with tooling such as Flink or +Spark Streaming. Normally, some form of directed acyclic graph (DAG) is +required, if these transformations are chained, and dependencies need to be +tracked. + +- **Offline (Training) Store** - The offline store holds the features +resulting from the previous transformation pipeline. These features are +typically grouped as entities and associated with a label (the target +prediction). Usually, models need to consume these features selectively, +either iteratively or through aggregations, potentially multiple times and +in random order. Models often require more than one feature, requiring +features to be grouped together in a "feature group" - usually by an entity +ID and time dimension. This requires the offline store to be able to deliver +the correct version of a feature and label for a specific point in time. +This "point-in-time correctness" is often fundamental to models, which need +to be trained incrementally. + +- **Online (Interference) Store** - Once a model has been trained, it can be +deployed and used for making predictions. This inference process requires +information that is only available at the moment of prediction, e.g. the +user's ID for a transaction. However, it can also require features for the +prediction, which may be precomputed, e.g. features representing historical +purchases. These are often too expensive to compute at inference time, even +for ClickHouse. These features need to be served in latency-sensitive +situations, based on the most recent version of the data, especially in +scenarios, where predictions need to be made in real-time, such as fraud +detection. Features may be materialized from the offline store to the online +store for serving. + +### Feature stores and ClickHouse {#feature-stores-and-clickhouse} + +As a real-time data warehouse, ClickHouse can fulfill the role of a number +of the components - potentially significantly simplifying the feature store +architecture. + +Feature stores and ClickHouse + +Specifically, ClickHouse can act as a: + +- **Data source** - With the ability to query or ingest data in over 70 +different file formats, including data lake formats such as Iceberg and +Delta Lake, ClickHouse makes an ideal long-term store holding or querying +data. By separating storage and compute using object storage, ClickHouse +Cloud additionally allows data to be held indefinitely - with compute scaled +down or made completely idle to minimize costs. Flexible codecs, coupled +with column-oriented storage and ordering of data on disk, maximize +compression rates, thus minimizing the required storage. Users can easily +combine ClickHouse with data lakes, with built-in functions to query data in +place on object storage. + +- **Transformation engine** - SQL provides a natural means of declaring data + transformations. When extended with ClickHouse's analytical and statistical + functions, these transformations become succinct and optimized. As well as + applying to either ClickHouse tables, in cases where ClickHouse is used as a + data store, table functions allow SQL queries to be written against data + stored in formats such as Parquet, on-disk or object storage, or even other + data stores such as Postgres and MySQL. A completely parallelization query + execution engine, combined with a column-oriented storage format, allows + ClickHouse to perform aggregations over PBs of data in seconds - unlike + transformations on in memory dataframes, users are not memory-bound. + Furthermore, materialized views allow data to be transformed at insert time, + thus overloading compute to data load time from query time. These views can + exploit the same range of analytical and statistical functions ideal for + data analysis and summarization. Should any of ClickHouse's existing + analytical functions be insufficient or custom libraries need to be + integrated, users can also utilize User Defined Functions (UDFs). + + While users can transform data directly in ClickHouse or prior to insertion + using SQL queries, ClickHouse can also be used in programming environments + such as Python via chDB. This allows embedded ClickHouse to be exposed as a + Python module and used to transform and manipulate large data frames within + notebooks. This allows transformation work to be performed client-side by + data engineers, with results potentially materialized as feature tables in + a centralized ClickHouse instance. + +- **Offline store** - With the above capabilities to read data from multiple + sources and apply transformations via SQL, the results of these queries can + also be persisted in ClickHouse via `INSERT INTO SELECT` statements. With + transformations often grouped by an entity ID and returning a number of + columns as results, ClickHouse's schema inference can automatically detect + the required types from these results and produce an appropriate table + schema to store them. Functions for generating random numbers and + statistical sampling allow data to be efficiently iterated and scaled at + millions or rows per second for feeding to model training pipelines. + + Often, features are represented in tables with a timestamp indicating the + value for an entity and feature at a specific point in time. As described + earlier, training pipelines often need the state of features at specific + points in time and in groups. ClickHouse's sparse indices allow fast + filtering of data to satisfy point-in-time queries and feature selection + filters. While other technologies such as Spark, Redshift, and BigQuery + rely on slow stateful windowed approaches to identify the state of features + at a specific point in time, ClickHouse supports the `ASOF` (as-of-this-time) + `LEFT JOIN` query and `argMax` function. As well as simplifying syntax, this + approach is highly performant on large datasets through the use of a sort + and merge algorithm. This allows feature groups to be built quickly, + reducing data preparation time prior to training. + + ClickHouse as an offline store + +- **Online store** - As a real-time analytics database, ClickHouse can serve highly + concurrent query workloads at low latency. While this requires data to be typically + denormalized, this aligns with the storage of feature groups used at both training + and inference time. Importantly, ClickHouse is able to deliver this query + performance while being subject to high write workloads thanks to its log-structured + merge tree. These properties are required in an online store to keep features + up-to-date. Since the features are already available within the offline store, + they can easily be materialized to new tables within either the same ClickHouse + cluster or a different instance via existing capabilities, e.g., [`remoteSecure`](/sql-reference/table-functions/remote#parameters). + + :::note + For use cases requiring very high request concurrency i.e., thousands per second, + and very low latency, we recommend users still consider a dedicated data store, + e.g., Redis, designed for these workloads. + ::: + +- **Vector database** - ClickHouse has built-in support for vector embeddings + through floating point arrays. These can be searched and compared through + [distance functions](https://clickhouse.com/docs/en/sql-reference/functions/distance-functions#cosinedistance), + allowing ClickHouse to be used as a vector database. This linear comparison can + be easily scaled and parallelized for larger datasets. Additionally, ClickHouse + has maturing support for [Approximate Nearest Neighbour (ANN)](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/annindexes) + indices, as well as [hyperplane indexes using pure-SQL](https://clickhouse.com/blog/approximate-nearest-neighbour-ann-with-sql-powered-local-sensitive-hashing-lsh-random-projections), + as required for larger vector datasets. + +By satisfying each of the above roles, ClickHouse can dramatically simplify +the feature store architecture. Aside from the simplification of operations, +this architecture allows features to be built and deployed faster. A single +instance of ClickHouse can be scaled vertically to handle PBs of data, with +additional instances simply added for high availability. This minimizes the +movement of data between data stores, minimizing the typical network +bottlenecks. ClickHouse Cloud expands on this further by storing only a +single copy of the data in object storage and allowing nodes to be scaled +vertically or horizontally dynamically in response to load as required. + +The above architecture still requires several key components not satisfied +by ClickHouse: a streaming engine such as Kafka + Flink and a framework to +provide compute for model training. A means of hosting models is also +required. For simplicity, we assume the use of a cloud-hosted solution to +these, such as Confluent and Amazon SageMaker. + + + + + + diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md new file mode 100644 index 00000000000..5bb42053fe9 --- /dev/null +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md @@ -0,0 +1,175 @@ +--- +slug: /cloud/get-started/cloud/use-cases/AI_ML/agent_facing_analytics +title: 'Agent facing analytics' +keywords: ['use cases', 'Machine Learning', 'Generative AI', 'agent facing analytics', 'agents'] +sidebar_label: 'Agent facing analytics' +--- + +import Image from '@theme/IdealImage'; +import ml_ai_05 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_05.png'; +import ml_ai_06 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_06.png'; +import ml_ai_07 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_07.png'; +import ml_ai_08 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_08.png'; +import ml_ai_09 from '@site/static/images/cloud/onboard/discover/use_cases/ml_ai_09.png'; + +## Agent-facing analytics concepts {#agent-facing-analytics} + +### What are "agents"? {#agents} + +One can think of AI agents as digital assistants that have evolved beyond +simple task execution (or function calling): they can understand context, +make decisions, and take meaningful actions toward specific goals. They +operate in a "sense-think-act" loop (see ReAct agents), processing various +inputs (text, media, data), analyzing situations, and then doing something +useful with that information. Most importantly, depending on the application +domain, they can theoretically operate at various levels of autonomy, +requiring or not human supervision. + +The game changer here has been the advent of Large Language Models (LLMs). +While we had the notion of AI agents for quite a while, LLMs like the GPT +series have given them a massive upgrade in their ability to "understand" +and communicate. It's as if they've suddenly become more fluent in "human" +aka. able to grasp requests and respond with relevant contextual information +drawn from the model's training. + +### AI agents superpowers: “Tools” {#tools} + +These agents really shine through their access to “tools”. Tools enhance AI agents +by giving them abilities to perform tasks. Rather than just being conversational +interfaces, they can now get things done whether it’s crunching numbers, searching +for information, or managing customer communications. Think of it as the difference +between having someone who can describe how to solve a problem and someone who +can actually solve it. + +For example, ChatGPT is now shipped by default with a search tool. This +integration with search providers allows the model to pull current information +from the web during conversations. This means it can fact-check responses, access +recent events and data, and provide up-to-date information rather than relying +solely on its training data. + +Agents equipped with tools + +Tools can also be used to simplify the implementation of Retrieval-Augmented +Generation (RAG) pipelines. Instead of relying only on what an AI model +learned during training, RAG lets the model pull in relevant information +before formulating a response. Here's an example: Using an AI assistant to +help with customer support (e.g. Salesforce AgentForce, ServiceNow AI +Agents). Without RAG, it would only use its general training to answer +questions. But with RAG, when a customer asks about the latest product +feature, the system retrieves the most recent documentation, release notes, +and historical support tickets before crafting its response. This means that +answers are now grounded in the latest information available to the AI +model. + +### Reasoning models {#reasoning-models} + +Another development in the AI space, and perhaps one of the most +interesting, is the emergence of reasoning models. Systems like OpenAI o1, +Anthropic Claude, or DeepSeek-R1 take a more methodical approach by +introducing a "thinking" step before responding to a prompt. Instead of +generating the answer straightaway, reasoning models use prompting +techniques like Chain-of-Thought (CoT) to analyze problems from multiple +angles, break them down into steps, and use the tools available to them to +gather contextual information when needed. + +This represents a shift toward more capable systems that can handle more +complex tasks through a combination of reasoning and practical tools. One of +the latest examples in this area is the introduction of OpenAI's deep +research, an agent that can autonomously conduct complex multi-step research +tasks online. It processes and synthesizes information from various sources, +including text, images, and PDFs, to generate comprehensive reports within five +to thirty minutes, a task that would traditionally take a human several hours. + +Reasoning models + +## Real-time analytics for AI agents {#real-time-analytics-for-ai-agents} + +Let's take the case of an agentic AI assistant with access to a +real-time analytics database containing the company's CRM data. When a user asks +about the latest (up-to-the-minute) sales trends, the AI assistant queries the +connected data source. It iteratively analyzes the data to identify meaningful +patterns and trends, such as month-over-month growth, seasonal variations, or +emerging product categories. Finally, it generates a natural language response +explaining key findings, often with supporting visualizations. When the main +interface is chat-based like in this case, performance matters since these +iterative explorations trigger a series of queries that can scan large amounts of +data to extract relevant insights. + +Some properties make real-time databases especially suitable for such +workloads. For example, real-time analytics databases are designed to work +with near real-time data, allowing them to process and deliver insights +almost immediately as new data arrives. This is crucial for AI agents, as +they can require up-to-date information to make (or help make) timely and +relevant decisions. + +The core analytical capabilities are also important. Real-time analytics +databases shine in performing complex aggregations and pattern detection +across large datasets. Unlike operational databases focusing primarily on +raw data storage or retrieval, these systems are optimized for analyzing +vast amounts of information. This makes them particularly well-suited for AI +agents that need to uncover trends, detect anomalies, and derive actionable +insights. + +Real-time analytics databases are also expected to deliver fast +performance for interactive querying, essential for chat-based interaction +and high-frequency explorative workloads. They ensure consistent performance +even with large data volumes and high query concurrency, enabling responsive +dialogues and a smoother user experience. + +Finally, real-time analytics databases often serve as the ultimate "data +sinks" effectively consolidating valuable domain-specific data in a single +location. By co-locating essential data across different sources and formats +under the same tent, these databases ensure that AI agents have access to a +unified view of the domain information, decoupled from operational systems. + +Classic real-time analytics + +Agent real-time analytics + +These properties already empower real-time databases to play a vital role +in serving AI data retrieval use cases at scale (e.g. OpenAI's acquisition +of Rockset). They can also enable AI agents to provide fast data-driven +responses while offloading the heavy computational work. + +It positions the real-time analytics database as a preferred "context +provider" for AI agents when it comes to insights. + +## AI agents as an emerging user persona {#ai-agents-as-an-emerging-user-persona} + +A useful way to think about AI agents leveraging real-time analytics databases +is to perceive them as a new category of users, or in product manager speak: +a user persona. + +Agents as an emerging user persona + +From the database perspective, we can expect a potentially unlimited number of +AI agents, concurrently running a large number of queries on behalf of users, +or in autonomy, to perform investigations, refine iterative research and insights, +and execute tasks. + +Over the years, real-time databases have had the time to adapt to human +interactive users, directly connected to the system or via a middleware +application layer. Classic personas examples include database administrators, +business analysts, data scientists, or software developers building applications +on top of the database. The industry has progressively learned their usage +patterns and requirements and organically, provided the interfaces, the operators, +the UIs, the formats, the clients, and the performance to satisfy their various +use cases. + +The question now becomes, are we ready to accommodate the AI agent's workloads? +What specific features do we need to re-think or create from scratch for these +usage patterns? + +ClickHouse is rapidly providing answers to some of these questions through a host +of features aimed at providing a feature-complete AI experience. + +## ClickHouse.ai {#clickhouse-ai} + +For more information about features coming soon to ClickHouse Cloud, see [ClickHouse.ai](https://clickhouse.com/clickhouse-ai/). + + + + + + + diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/_category_.json b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/_category_.json new file mode 100644 index 00000000000..7b4415fff32 --- /dev/null +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 2.5, + "label": "Machine Learning and GenAI", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_comparison.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_comparison.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md index 3ba17392fdc..d29bae39587 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md @@ -4,6 +4,7 @@ slug: /migrations/bigquery/migrating-to-clickhouse-cloud description: 'How to migrate your data from BigQuery to ClickHouse Cloud' keywords: ['BigQuery'] show_related_blogs: true +sidebar_label: 'Migration guide' --- import bigquery_2 from '@site/static/images/migrations/bigquery-2.png'; diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/_04_sql_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/_04_sql_translation_reference.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_comparison.md deleted file mode 100644 index 12c2e593b04..00000000000 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_comparison.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_label: 'Overview' -slug: /migrations/snowflake-overview -description: 'Migrating from Snowflake to ClickHouse' -keywords: ['Snowflake'] -title: 'Migrate from Snowflake to ClickHouse' -show_related_blogs: true ---- - -# Comparing ClickHouse Cloud and Snowflake - diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md new file mode 100644 index 00000000000..e2ae24feb1d --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -0,0 +1,192 @@ +--- +sidebar_label: 'Overview' +slug: /migrations/snowflake-overview +description: 'Migrating from Snowflake to ClickHouse' +keywords: ['Snowflake'] +title: 'Migrate from Snowflake to ClickHouse' +show_related_blogs: true +--- + +import snowflake_architecture from '@site/static/images/cloud/onboard/discover/use_cases/snowflake_architecture.png'; +import cloud_architecture from '@site/static/images/cloud/onboard/discover/use_cases/cloud_architecture.png'; +import Image from '@theme/IdealImage'; + +# Snowflake to ClickHouse migration + +> This document provides an introduction to migrating data from Snowflake to ClickHouse. + +Snowflake is a cloud data warehouse primarily focused on migrating legacy on-premise +data warehousing workloads to the cloud. It is well-optimized for executing +long-running reports at scale. As datasets migrate to the cloud, data owners start +thinking about how else they can extract value from this data, including using +these datasets to power real-time applications for internal and external use cases. +When this happens, they often realize they need a database optimized for +powering real-time analytics, like ClickHouse. + +## Comparison {#comparison} + +In this section, we'll compare the key features of ClickHouse and Snowflake. + +### Similarities {#similarities} + +Snowflake is a cloud-based data warehousing platform that provides a scalable +and efficient solution for storing, processing, and analyzing large amounts of +data. +Like ClickHouse, Snowflake is not built on existing technologies but relies +on its own SQL query engine and custom architecture. + +Snowflake’s architecture is described as a hybrid between a shared-storage (shared-disk) +architecture and a shared-nothing architecture. A shared-storage architecture is +one where data is both accessible from all compute nodes using object +stores such as S3. A shared-nothing architecture is one where each compute node +stores a portion of the entire data set locally to respond to queries. This, in +theory, delivers the best of both models: the simplicity of a shared-disk +architecture and the scalability of a shared-nothing architecture. + +This design fundamentally relies on object storage as the primary storage medium, +which scales almost infinitely under concurrent access while providing high +resilience and scalable throughput guarantees. + +The image below from [docs.snowflake.com](https://docs.snowflake.com/en/user-guide/intro-key-concepts) +shows this architecture: + +Snowflake architecture + +Conversely, as an open-source and cloud-hosted product, ClickHouse can be deployed +in both shared-disk and shared-nothing architectures. The latter is typical for +self-managed deployments. While allowing for CPU and memory to be easily scaled, +shared-nothing configurations introduce classic data management challenges and +overhead of data replication, especially during membership changes. + +For this reason, ClickHouse Cloud utilizes a shared-storage architecture that is +conceptually similar to Snowflake. Data is stored once in an object store +(single copy), such as S3 or GCS, providing virtually infinite storage with +strong redundancy guarantees. Each node has access to this single copy of the +data as well as its own local SSDs for cache purposes. Nodes can, in turn, be +scaled to provide additional CPU and memory resources as required. Like Snowflake, +S3’s scalability properties address the classic limitation of shared-disk +architectures (disk I/O and network bottlenecks) by ensuring the I/O throughput +available to current nodes in a cluster is not impacted as additional nodes are +added. + +ClickHouse Cloud architecture + +### Differences {#differences} + +Aside from the underlying storage formats and query engines, these architectures +differ in a few subtle ways: + +* Compute resources in Snowflake are provided through a concept of [warehouses](https://docs.snowflake.com/en/user-guide/warehouses). + These consist of a number of nodes, each of a set size. While Snowflake + doesn't publish the specific architecture of their warehouses, it is + [generally understood](https://select.dev/posts/snowflake-warehouse-sizing) + that each node consists of 8 vCPUs, 16GiB, and 200GB of local storage (for cache). + The number of nodes depends on a t-shirt size, e.g. an x-small has one node, + a small 2, medium 4, large 8, etc. These warehouses are independent of the data + and can be used to query any database residing on object storage. When idle + and not subjected to query load, warehouses are paused - resuming when a query + is received. While storage costs are always reflected in billing, warehouses + are only charged when active. + +* ClickHouse Cloud utilizes a similar principle of nodes with local cache + storage. Rather than t-shirt sizes, users deploy a service with a total + amount of compute and available RAM. This, in turn, transparently + auto-scales (within defined limits) based on the query load - either + vertically by increasing (or decreasing) the resources for each node or + horizontally by raising/lowering the total number of nodes. ClickHouse + Cloud nodes currently have a 1 CPU-to-memory ratio, unlike Snowflake's 1. + While a looser coupling is possible, services are currently coupled to the + data, unlike Snowflake warehouses. Nodes will also pause if idle and + resume if subjected to queries. Users can also manually resize services if + needed. + +* ClickHouse Cloud's query cache is currently node specific, unlike + Snowflake's, which is delivered at a service layer independent of the + warehouse. Based on benchmarks, ClickHouse Cloud's node cache outperforms + Snowflake's. + +* Snowflake and ClickHouse Cloud take different approaches to scaling to + increase query concurrency. Snowflake addresses this through a feature + known as [multi-cluster warehouses](https://docs.snowflake.com/en/user-guide/warehouses-multicluster#benefits-of-multi-cluster-warehouses). + This feature allows users to add clusters to a warehouse. While this offers no + improvement to query latency, it does provide additional parallelization and + allows higher query concurrency. ClickHouse achieves this by adding more memory + and CPU to a service through vertical or horizontal scaling. We do not explore the + capabilities of these services to scale to higher concurrency in this blog, + focusing instead on latency, but acknowledge that this work should be done + for a complete comparison. However, we would expect ClickHouse to perform + well in any concurrency test, with Snowflake explicitly limiting the number + of concurrent queries allowed for a [warehouse to 8 by default](https://docs.snowflake.com/en/sql-reference/parameters#max-concurrency-level). + In comparison, ClickHouse Cloud allows up to 1000 queries to be executed per + node. + +* Snowflake's ability to switch compute size on a dataset, coupled with fast + resume times for warehouses, makes it an excellent experience for ad hoc + querying. For data warehouse and data lake use cases, this provides an + advantage over other systems. + +### Real-time analytics {#real-time-analytics} + +Based on public [benchmark](https://benchmark.clickhouse.com/#system=+%E2%98%81w|%EF%B8%8Fr|C%20c|nfe&type=-&machine=-ca2|gl|6ax|6ale|3al&cluster_size=-&opensource=-&tuned=+n&metric=hot&queries=-) data, +ClickHouse outperforms Snowflake for real-time analytics applications in the following areas: + + +* **Query latency**: Snowflake queries have a higher query latency even + when clustering is applied to tables to optimize performance. In our + testing, Snowflake requires over twice the compute to achieve equivalent + ClickHouse performance on queries where a filter is applied that is part + of the Snowflake clustering key or ClickHouse primary key. While + Snowflake's [persistent query cache](https://docs.snowflake.com/en/user-guide/querying-persisted-results) + offsets some of these latency challenges, this is ineffective in cases + where the filter criteria are more diverse. This query cache effectiveness + can be further impacted by changes to the underlying data, with cache + entries invalidated when the table changes. While this is not the case in + the benchmark for our application, a real deployment would require the new, + more recent data to be inserted. Note that ClickHouse's query cache is + node specific and not [transactionally consistent](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design), + making it [better suited ](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design) + to real-time analytics. Users also have granular control over its use + with the ability to control its use on a [per-query basis](/operations/settings/settings#use-query-cache), + its [precise size](/operations/settings/settings#query-cache-max-size-in-bytes), + whether a [query is cached](/operations/settings/settings#enable-writes-to-query-cache) + (limits on duration or required number of executions), and whether it is + only [passively used](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design#using-logs-and-settings). + +* **Lower cost**: Snowflake warehouses can be configured to suspend after + a period of query inactivity. Once suspended, charges are not incurred. + Practically, this inactivity check can [only be lowered to 60s](https://docs.snowflake.com/en/sql-reference/sql/alter-warehouse). + Warehouses will automatically resume, within several seconds, once a query + is received. With Snowflake only charging for resources when a warehouse + is under use, this behavior caters to workloads that often sit idle, like + ad-hoc querying. + + However, many real-time analytics workloads require ongoing real-time data + ingestion and frequent querying that doesn't benefit from idling (like + customer-facing dashboards). This means warehouses must often be fully + active and incurring charges. This negates the cost-benefit of idling as + well as any performance advantage that may be associated with Snowflake's + ability to resume a responsive state faster than alternatives. This active + state requirement, when combined with ClickHouse Cloud's lower per-second + cost for an active state, results in ClickHouse Cloud offering a + significantly lower total cost for these kinds of workloads. + +* **Predictable pricing of features:** Features such as materialized views + and clustering (equivalent to ClickHouse's ORDER BY) are required to reach + the highest levels of performance in real-time analytics use cases. These + features incur additional charges in Snowflake, requiring not only a + higher tier, which increases costs per credit by 1.5x, but also + unpredictable background costs. For instance, materialized views incur a + background maintenance cost, as does clustering, which is hard to predict + prior to use. In contrast, these features incur no additional cost in + ClickHouse Cloud, except additional CPU and memory usage at insert time, + typically negligible outside of high insert workload use cases. We have + observed in our benchmark that these differences, along with lower query + latencies and higher compression, result in significantly lower costs with + ClickHouse. + + + + + + + diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_snowflake.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md similarity index 89% rename from docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_snowflake.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md index ae9e9107cdd..468a8b6193b 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_snowflake.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md @@ -1,5 +1,5 @@ --- -sidebar_label: 'Snowflake' +sidebar_label: 'Migration guide' slug: /migrations/snowflake description: 'Migrating from Snowflake to ClickHouse' keywords: ['Snowflake'] @@ -69,10 +69,10 @@ Assuming the following table target schema: ```sql CREATE TABLE default.mydataset ( - `timestamp` DateTime64(6), - `some_text` String, - `some_file` Tuple(filename String, version String), - `complex_data` Tuple(name String, description String), + `timestamp` DateTime64(6), + `some_text` String, + `some_file` Tuple(filename String, version String), + `complex_data` Tuple(name String, description String), ) ENGINE = MergeTree ORDER BY (timestamp) @@ -83,16 +83,16 @@ We can then use the `INSERT INTO SELECT` command to insert the data from S3 into ```sql INSERT INTO mydataset SELECT - timestamp, - some_text, - JSONExtract( - ifNull(some_file, '{}'), - 'Tuple(filename String, version String)' - ) AS some_file, - JSONExtract( - ifNull(complex_data, '{}'), - 'Tuple(filename String, description String)' - ) AS complex_data, + timestamp, + some_text, + JSONExtract( + ifNull(some_file, '{}'), + 'Tuple(filename String, version String)' + ) AS some_file, + JSONExtract( + ifNull(complex_data, '{}'), + 'Tuple(filename String, description String)' + ) AS complex_data, FROM s3('https://mybucket.s3.amazonaws.com/mydataset/mydataset*.parquet') SETTINGS input_format_null_as_default = 1, -- Ensure columns are inserted as default if values are null input_format_parquet_case_insensitive_column_matching = 1 -- Column matching between source data and target table should be case insensitive diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md new file mode 100644 index 00000000000..9bb6da114d0 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -0,0 +1,114 @@ +--- +sidebar_label: 'SQL translation reference' +slug: /migrations/snowflake-translation-reference +description: 'SQL translation reference' +keywords: ['Snowflake'] +title: 'Migrating from Snowflake to ClickHouse' +show_related_blogs: true +--- + +# Snowflake SQL translation guide + +## Data types {#data-types} + +### Numerics {#numerics} + +Users moving data between ClickHouse and Snowflake will immediately notice that +ClickHouse offers more granular precision concerning declaring numerics. For example, +Snowflake offers the type Number for numerics. This requires the user to specify a +precision (total number of digits) and scale (digits to the right of the decimal place) +up to a total of 38. Integer declarations are synonymous with Number, and simply +define a fixed precision and scale where the range is the same. This convenience +is possible as modifying the precision (scale is 0 for ints) does not impact the +size of data on disk in Snowflake - the minimal required bytes are used for a +numeric range at write time at a micro partition level. The scale does, however, +impact storage space and is offset with compression. A `Float64` type offers a +wider range of values with a loss of precision. + +Contrast this with ClickHouse, which offers multiple signed and unsigned +precisions for floats and ints. With these, ClickHouse users can be explicit about +the precision required for integers to optimize storage and memory overhead. A +Decimal type, equivalent to Snowflake’s Number type, also offers twice the +precision and scale at 76 digits. In addition to a similar `Float64` value, +ClickHouse also provides a `Float32` for when precision is less critical and +compression paramount. + +### Strings {#strings} + +ClickHouse and Snowflake take contrasting approaches to the storage of string +data. The `VARCHAR` in Snowflake holds Unicode characters in UTF-8, allowing the +user to specify a maximum length. This length has no impact on storage or +performance, with the minimum number of bytes always used to store a string, and +rather provides only constraints useful for downstream tooling. Other types, such +as `Text` and `NChar`, are simply aliases for this type. ClickHouse conversely +stores all [string data as raw bytes](/sql-reference/data-types/string) with a `String` +type (no length specification required), deferring encoding to the user, with +[query time functions](/sql-reference/functions/string-functions#lengthutf8) +available for different encodings. We refer the reader to ["Opaque data argument"](https://utf8everywhere.org/#cookie) +for the motivation as to why. The ClickHouse `String` is thus more comparable +to the Snowflake Binary type in its implementation. Both [Snowflake](https://docs.snowflake.com/en/sql-reference/collation) +and [ClickHouse](/sql-reference/statements/select/order-by#collation-support) +support “collation”, allowing users to override how strings are sorted and compared. + +### Semi-structured types {#semi-structured-data} + +Snowflake supports the `VARIANT`, `OBJECT` and `ARRAY` types for semi-structured +data. + +ClickHouse offers the equivalent [`Variant`](/sql-reference/data-types/variant), +[`Object`](/sql-reference/data-types/object-data-type) (deprecated) and [`Array`](/sql-reference/data-types/array) +types. Additionally, ClickHouse has the [`JSON`](/sql-reference/data-types/newjson) +type which replaces the now deprecated `Object('json')` type and is particularly +performant and storage efficient in [comparison to other native JSON types](https://jsonbench.com/). + +ClickHouse also supports named [`Tuple`s](/sql-reference/data-types/tuple) and arrays of Tuples +via the [`Nested`](/sql-reference/data-types/nested-data-structures/nested) type, +allowing users to explicitly map nested structures. This allows codecs and type +optimizations to be applied throughout the hierarchy, unlike Snowflake, which +requires the user to use the `OBJECT`, `VARIANT`, and `ARRAY` types for the outer +object and does not allow [explicit internal typing](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#characteristics-of-an-object). +This internal typing also simplifies queries on nested numerics in ClickHouse, +which do not need to be cast and can be used in index definitions. + +In ClickHouse, codecs and optimized types can also be applied to substructures. +This provides an added benefit that compression with nested structures remains +excellent, and comparable, to flattened data. In contrast, as a result of the +inability to apply specific types to substructures, Snowflake recommends [flattening +data to achieve optimal compression](https://docs.snowflake.com/en/user-guide/semistructured-considerations#storing-semi-structured-data-in-a-variant-column-vs-flattening-the-nested-structure). +Snowflake also [imposes size restrictions](https://docs.snowflake.com/en/user-guide/semistructured-considerations#data-size-limitations) +for these data types. + +### Type reference {#type-reference} + +| Snowflake | ClickHouse | Note | +|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [`NUMBER`](https://docs.snowflake.com/en/sql-reference/data-types-numeric) | [`Decimal`](/sql-reference/data-types/decimal) | ClickHouse supports twice the precision and scale than Snowflake - 76 digits vs. 38. | +| [`FLOAT`, `FLOAT4`, `FLOAT8`](https://docs.snowflake.com/en/sql-reference/data-types-numeric#data-types-for-floating-point-numbers) | [`Float32`, `Float64`](/sql-reference/data-types/float) | All floats in Snowflake are 64 bit. | +| [`VARCHAR`](https://docs.snowflake.com/en/sql-reference/data-types-text#varchar) | [`String`](/sql-reference/data-types/string) | | +| [`BINARY`](https://docs.snowflake.com/en/sql-reference/data-types-text#binary) | [`String`](/sql-reference/data-types/string) | | +| [`BOOLEAN`](https://docs.snowflake.com/en/sql-reference/data-types-logical) | [`Bool`](/sql-reference/data-types/boolean) | | +| [`DATE`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#date) | [`Date`](/sql-reference/data-types/date), [`Date32`](/sql-reference/data-types/date32) | `DATE` in Snowflake offers a wider date range than ClickHouse e.g. min for `Date32` is `1900-01-01` and `Date` `1970-01-01`. `Date` in ClickHouse provides more cost efficient (two byte) storage. | +| [`TIME(N)`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#time) | No direct equivalent but can be represented by [`DateTime`](/sql-reference/data-types/datetime) and [`DateTime64(N)`](/sql-reference/data-types/datetime64). | `DateTime64` uses the same concepts of precision. | +| [`TIMESTAMP`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp) - [`TIMESTAMP_LTZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz), [`TIMESTAMP_NTZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz), [`TIMESTAMP_TZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz) | [`DateTime`](/sql-reference/data-types/datetime) and [`DateTime64`](/sql-reference/data-types/datetime64) | `DateTime` and `DateTime64` can optionally have a TZ parameter defined for the column. If not present, the server's timezone is used. Additionally a `--use_client_time_zone` parameter is available for the client. | +| [`VARIANT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#variant) | [`JSON`, `Tuple`, `Nested`](/integrations/data-formats/json) | `JSON` type is experimental in ClickHouse. This type infers the column types at insert time. `Tuple`, `Nested` and `Array` can also be used to build explicitly type structures as an alternative. | +| [`OBJECT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#object) | [`Tuple`, `Map`, `JSON`](/integrations/data-formats/json) | Both `OBJECT` and `Map` are analogous to `JSON` type in ClickHouse where the keys are a `String`. ClickHouse requires the value to be consistent and strongly typed whereas Snowflake uses `VARIANT`. This means the values of different keys can be a different type. If this is required in ClickHouse, explicitly define the hierarchy using `Tuple` or rely on `JSON` type. | +| [`ARRAY`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#array) | [`Array`](/sql-reference/data-types/array), [`Nested`](/sql-reference/data-types/nested-data-structures/nested) | `ARRAY` in Snowflake uses `VARIANT` for the elements - a super type. Conversely these are strongly typed in ClickHouse. | +| [`GEOGRAPHY`](https://docs.snowflake.com/en/sql-reference/data-types-geospatial#geography-data-type) | [`Point`, `Ring`, `Polygon`, `MultiPolygon`](/sql-reference/data-types/geo) | Snowflake imposes a coordinate system (WGS 84) while ClickHouse applies at query time. | +| [`GEOMETRY`](https://docs.snowflake.com/en/sql-reference/data-types-geospatial#geometry-data-type) | [`Point`, `Ring`, `Polygon`, `MultiPolygon`](/sql-reference/data-types/geo) | | | + +| ClickHouse Type | Description | +|-------------------|-----------------------------------------------------------------------------------------------------| +| `IPv4` and `IPv6` | IP-specific types, potentially allowing more efficient storage than Snowflake. | +| `FixedString` | Allows a fixed length of bytes to be used, which is useful for hashes. | +| `LowCardinality` | Allows any type to be dictionary encoded. Useful for when the cardinality is expected to be < 100k. | +| `Enum` | Allows efficient encoding of named values in either 8 or 16-bit ranges. | +| `UUID` | For efficient storage of uuids. | +| `Array(Float32)` | Vectors can be represented as an Array of Float32 with supported distance functions. | + +Finally, ClickHouse offers the unique ability to store the intermediate +[state of aggregate functions](/sql-reference/data-types/aggregatefunction). This +state is implementation-specific, but allows the result of an aggregation to be +stored and later queried (with corresponding merge functions). Typically, this +feature is used via a materialized view and, as demonstrated below, offers the +ability to improve performance of specific queries with minimal storage cost by +storing the incremental result of queries over inserted data (more details here). diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/_03_snowflake_clickhouse_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/_03_snowflake_clickhouse_translation_reference.md deleted file mode 100644 index ec4e2d19ecb..00000000000 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/_03_snowflake_clickhouse_translation_reference.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebar_label: 'SQL translation reference' -slug: /migrations/snowflake-translation-reference -description: 'SQL translation reference' -keywords: ['Snowflake'] -title: 'Migrating from Snowflake to ClickHouse' -show_related_blogs: true ---- \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md similarity index 62% rename from docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_comparison.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index 907c8c9e0a2..aa0ae3cfdcd 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_comparison.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -7,5 +7,9 @@ title: 'Migrate from Snowflake to ClickHouse' show_related_blogs: true --- -# Comparing ClickHouse Cloud and Elasticsearch +# Elasticsearch to ClickHouse migration + +This document provides an introduction to migrating data from Elasticsearch to ClickHouse. + + diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_comparison.md b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_comparison.md deleted file mode 100644 index 78f15e446fe..00000000000 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_comparison.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -sidebar_label: 'Overview' -slug: /migrations/redshift-overview -description: 'Migrating from Amazon Redshift to ClickHouse' -keywords: ['Redshift'] -title: 'Comparing ClickHouse Cloud and Amazon Redshift' -show_related_blogs: true ---- - -# Comparing ClickHouse Cloud and Amazon Redshift - - diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md new file mode 100644 index 00000000000..96a780dfd79 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md @@ -0,0 +1,69 @@ +--- +sidebar_label: 'Overview' +slug: /migrations/redshift-overview +description: 'Migrating from Amazon Redshift to ClickHouse' +keywords: ['Redshift'] +title: 'Comparing ClickHouse Cloud and Amazon Redshift' +--- + +# Amazon Redshift to ClickHouse migration + +> This document provides an introduction to migrating data from Amazon +Redshift to ClickHouse. + +## Introduction {#introduction} + +Amazon Redshift is a cloud data warehouse that provides reporting and +analytics capabilities for structured and semi-structured data. It was +designed to handle analytical workloads on big data sets using +column-oriented database principles similar to ClickHouse. As part of the +AWS offering, it is often the default solution AWS users turn to for their +analytical data needs. + +While attractive to existing AWS users due to its tight integration with the +Amazon ecosystem, Redshift users that adopt it to power real-time analytics +applications find themselves in need of a more optimized solution for this +purpose. As a result, they increasingly turn to ClickHouse to benefit from +superior query performance and data compression, either as a replacement or +a "speed layer" deployed alongside existing Redshift workloads. + +## ClickHouse vs Redshift {#clickhouse-vs-redshift} + +For users heavily invested in the AWS ecosystem, Redshift represents a +natural choice when faced with data warehousing needs. Redshift differs from +ClickHouse in this important aspect – it optimizes its engine for data +warehousing workloads requiring complex reporting and analytical queries. +Across all deployment modes, the following two limitations make it difficult +to use Redshift for real-time analytical workloads: +* Redshift [compiles code for each query execution plan](https://docs.aws.amazon.com/redshift/latest/dg/c-query-performance.html), +which adds significant overhead to first-time query execution. This overhead can +be justified when query patterns are predictable and compiled execution plans +can be stored in a query cache. However, this introduces challenges for interactive +applications with variable queries. Even when Redshift is able to exploit this +code compilation cache, ClickHouse is faster on most queries. See ["ClickBench"](https://benchmark.clickhouse.com/#system=+%E2%98%81w|%EF%B8%8Fr|C%20c|Rf&type=-&machine=-ca2|gl|6ax|6ale|3al&cluster_size=-&opensource=-&tuned=+n&metric=hot&queries=-). +* Redshift [limits concurrency to 50 across all queues](https://docs.aws.amazon.com/redshift/latest/dg/c_workload_mngmt_classification.html), +which (while adequate for BI) makes it inappropriate for highly concurrent +analytical applications. + +Conversely, while ClickHouse can also be utilized for complex analytical queries +it is optimized for real-time analytical workloads, either powering applications +or acting as a warehouse acceleration later. As a result, Redshift users typically +replace or augment Redshift with ClickHouse for the following reasons: + +| Advantage | Description | +|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Lower query latencies** | ClickHouse achieves lower query latencies, including for varied query patterns, under high concurrency and while subjected to streaming inserts. Even when your query misses a cache, which is inevitable in interactive user-facing analytics, ClickHouse can still process it fast. | +| **Higher concurrent query limits** | ClickHouse places much higher limits on concurrent queries, which is vital for real-time application experiences. In ClickHouse, self-managed as well as cloud, you can scale up your compute allocation to achieve the concurrency your application needs for each service. The level of permitted query concurrency is configurable in ClickHouse, with ClickHouse Cloud defaulting to a value of 1000. | +| **Superior data compression** | ClickHouse offers superior data compression, which allows users to reduce their total storage (and thus cost) or persist more data at the same cost and derive more real-time insights from their data. See "ClickHouse vs Redshift Storage Efficiency" below. | + + + + + + + + + + + + diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migrate.md b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md similarity index 94% rename from docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migrate.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md index 4a7d698e9cf..506c9957e58 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migrate.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md @@ -4,7 +4,6 @@ slug: /migrations/redshift/migration-guide description: 'Migrating from Amazon Redshift to ClickHouse' keywords: ['Redshift'] title: 'Amazon Redshift to ClickHouse migration guide' -show_related_blogs: true --- import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md new file mode 100644 index 00000000000..67585e4ea72 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md @@ -0,0 +1,95 @@ +--- +sidebar_label: 'SQL translation reference' +slug: /migrations/redshift/sql-translation-reference +description: 'SQL translation reference for Amazon Redshift to ClickHouse' +keywords: ['Redshift'] +title: 'Amazon Redshift SQL translation guide' +--- + +# Amazon Redshift SQL translation guide + +## Data types {#data-types} + +Users moving data between ClickHouse and Redshift will immediately notice +that ClickHouse offers a more extensive range of types, which are also less +restrictive. While Redshift requires users to specify possible string +lengths, even if variable, ClickHouse removes this restriction and burden +from the user by storing strings without encoding as bytes. The ClickHouse +String type thus has no limits or length specification requirements. + +Furthermore, users can exploit Arrays, Tuples, and Enums - absent from +Redshift as first-class citizens (although Arrays/Structs can be imitated +with `SUPER`) and a common frustration of users. ClickHouse additionally +allows the persistence, either at query time or even in a table, of +aggregation states. This will enable data to be pre-aggregated, typically +using a materialized view, and can dramatically improve query performance +for common queries. + +Below we map the equivalent ClickHouse type for each Redshift type: + +| Redshift | ClickHouse | +|------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [`SMALLINT`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-integer-types) | [`Int8`](/sql-reference/data-types/int-uint) * | +| [`INTEGER`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-integer-types) | [`Int32`](/sql-reference/data-types/int-uint) * | +| [`BIGINT`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-integer-types) | [`Int64`](/sql-reference/data-types/int-uint) * | +| [`DECIMAL`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-decimal-or-numeric-type) | [`UInt128`, `UInt256`, `Int128`, `Int256`](/sql-reference/data-types/int-uint), [`Decimal(P, S)`, `Decimal32(S)`, `Decimal64(S)`, `Decimal128(S)`, `Decimal256(S)`](/sql-reference/data-types/decimal) - (high precision and ranges possible) | +| [`REAL`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-floating-point-types) | [`Float32`](/sql-reference/data-types/float) | +| [`DOUBLE PRECISION`](https://docs.aws.amazon.com/redshift/latest/dg/r_Numeric_types201.html#r_Numeric_types201-floating-point-types) | [`Float64`](/sql-reference/data-types/float) | +| [`BOOLEAN`](https://docs.aws.amazon.com/redshift/latest/dg/r_Boolean_type.html) | [`Bool`](/sql-reference/data-types/boolean) | +| [`CHAR`](https://docs.aws.amazon.com/redshift/latest/dg/r_Character_types.html#r_Character_types-char-or-character) | [`String`](/sql-reference/data-types/string), [`FixedString`](/sql-reference/data-types/fixedstring) | +| [`VARCHAR`](https://docs.aws.amazon.com/redshift/latest/dg/r_Character_types.html#r_Character_types-varchar-or-character-varying) ** | [`String`](/sql-reference/data-types/string) | +| [`DATE`](https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html#r_Datetime_types-date) | [`Date32`](/sql-reference/data-types/date32) | +| [`TIMESTAMP`](https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html#r_Datetime_types-timestamp) | [`DateTime`](/sql-reference/data-types/datetime), [`DateTime64`](/sql-reference/data-types/datetime64) | +| [`TIMESTAMPTZ`](https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html#r_Datetime_types-timestamptz) | [`DateTime`](/sql-reference/data-types/datetime), [`DateTime64`](/sql-reference/data-types/datetime64) | +| [`GEOMETRY`](https://docs.aws.amazon.com/redshift/latest/dg/geospatial-overview.html) | [Geo Data Types](/sql-reference/data-types/geo) | +| [`GEOGRAPHY`](https://docs.aws.amazon.com/redshift/latest/dg/geospatial-overview.html) | [Geo Data Types](/sql-reference/data-types/geo) (less developed e.g. no coordinate systems - can be emulated [with functions](/sql-reference/functions/geo/)) | +| [`HLLSKETCH`](https://docs.aws.amazon.com/redshift/latest/dg/r_HLLSKTECH_type.html) | [`AggregateFunction(uniqHLL12, X)`](/sql-reference/data-types/aggregatefunction) | +| [`SUPER`](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html) | [`Tuple`](/sql-reference/data-types/tuple), [`Nested`](/sql-reference/data-types/nested-data-structures/nested), [`Array`](/sql-reference/data-types/array), [`JSON`](/sql-reference/data-types/newjson), [`Map`](/sql-reference/data-types/map) | +| [`TIME`](https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html#r_Datetime_types-time) | [`DateTime`](/sql-reference/data-types/datetime), [`DateTime64`](/sql-reference/data-types/datetime64) | +| [`TIMETZ`](https://docs.aws.amazon.com/redshift/latest/dg/r_Datetime_types.html#r_Datetime_types-timetz) | [`DateTime`](/sql-reference/data-types/datetime), [`DateTime64`](/sql-reference/data-types/datetime64) | +| [`VARBYTE`](https://docs.aws.amazon.com/redshift/latest/dg/r_VARBYTE_type.html) ** | [`String`](/sql-reference/data-types/string) combined with [`Bit`](/sql-reference/functions/bit-functions) and [Encoding](/sql-reference/functions/encoding-functions/#hex) functions | + +* ClickHouse additionally supports unsigned integers with extended ranges i.e.
`UInt8`, `UInt32`, `UInt32` and `UInt64`.
+**ClickHouse’s String type is unlimited by default but can be constrained to specific lengths using Constraints. + +## DDL syntax {#compression} + +### Sorting keys {#sorting-keys} + +Both ClickHouse and Redshift have the concept of a “sorting key”, which define +how data is sorted when being stored. Redshift defines the sorting key using the +`SORTKEY` clause: + +```sql +CREATE TABLE some_table(...) SORTKEY (column1, column2) +``` + +Comparatively, ClickHouse uses an `ORDER BY` clause to specify the sort order: + +```sql +CREATE TABLE some_table(...) ENGINE = MergeTree ORDER BY (column1, column2) +``` + +In most cases, you can use the same sorting key columns and order in ClickHouse +as Redshift, assuming you are using the default `COMPOUND` type. When data is +added to Redshift, you should run the `VACUUM` and `ANALYZE` commands to re-sort +newly added data and update the statistics for the query planner - otherwise, the +unsorted space grows. No such process is required for ClickHouse. + +Redshift supports a couple of convenience features for sorting keys. The first is +automatic sorting keys (using `SORTKEY AUTO`). While this may be appropriate for +getting started, explicit sorting keys ensure the best performance and storage +efficiency when the sorting key is optimal. The second is the `INTERLEAVED` sort key, +which gives equal weight to a subset of columns in the sort key to improve +performance when a query uses one or more secondary sort columns. ClickHouse +supports explicit [projections](/data-modeling/projections), which achieve the +same end-result with a slightly different setup. + +Users should be aware that the “primary key” concept represents different things +in ClickHouse and Redshift. In Redshift, the primary key resembles the traditional +RDMS concept intended to enforce constraints. However, they are not strictly +enforced in Redshift and instead act as hints for the query planner and data +distribution among nodes. In ClickHouse, the primary key denotes columns used +to construct the sparse primary index, used to ensure the data is ordered on +disk, maximizing compression while avoiding pollution of the primary index and +wasting memory. diff --git a/docs/cloud/reference/01_changelog/changelog.md b/docs/cloud/reference/01_changelog/01_changelog.md similarity index 100% rename from docs/cloud/reference/01_changelog/changelog.md rename to docs/cloud/reference/01_changelog/01_changelog.md diff --git a/docs/cloud/changelogs/24_02.md b/docs/cloud/reference/01_changelog/02_release_notes/24_02.md similarity index 100% rename from docs/cloud/changelogs/24_02.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_02.md diff --git a/docs/cloud/changelogs/24_05.md b/docs/cloud/reference/01_changelog/02_release_notes/24_05.md similarity index 100% rename from docs/cloud/changelogs/24_05.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_05.md diff --git a/docs/cloud/changelogs/24_06.md b/docs/cloud/reference/01_changelog/02_release_notes/24_06.md similarity index 100% rename from docs/cloud/changelogs/24_06.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_06.md diff --git a/docs/cloud/changelogs/24_08.md b/docs/cloud/reference/01_changelog/02_release_notes/24_08.md similarity index 100% rename from docs/cloud/changelogs/24_08.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_08.md diff --git a/docs/cloud/changelogs/24_10.md b/docs/cloud/reference/01_changelog/02_release_notes/24_10.md similarity index 100% rename from docs/cloud/changelogs/24_10.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_10.md diff --git a/docs/cloud/changelogs/24_12.md b/docs/cloud/reference/01_changelog/02_release_notes/24_12.md similarity index 100% rename from docs/cloud/changelogs/24_12.md rename to docs/cloud/reference/01_changelog/02_release_notes/24_12.md diff --git a/docs/cloud/changelogs/25_04.md b/docs/cloud/reference/01_changelog/02_release_notes/25_04.md similarity index 100% rename from docs/cloud/changelogs/25_04.md rename to docs/cloud/reference/01_changelog/02_release_notes/25_04.md diff --git a/docs/cloud/changelogs/25_06.md b/docs/cloud/reference/01_changelog/02_release_notes/25_06.md similarity index 100% rename from docs/cloud/changelogs/25_06.md rename to docs/cloud/reference/01_changelog/02_release_notes/25_06.md diff --git a/docs/cloud/reference/01_changelog/02_release_notes/_category_.json b/docs/cloud/reference/01_changelog/02_release_notes/_category_.json new file mode 100644 index 00000000000..4eeae460788 --- /dev/null +++ b/docs/cloud/reference/01_changelog/02_release_notes/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Release notes", + "collapsible": true, + "collapsed": true, + "link": { "type": "doc", "id": "cloud/reference/changelog/release_notes/index" } +} \ No newline at end of file diff --git a/docs/cloud/reference/release-notes-index.md b/docs/cloud/reference/01_changelog/02_release_notes/index.md similarity index 100% rename from docs/cloud/reference/release-notes-index.md rename to docs/cloud/reference/01_changelog/02_release_notes/index.md diff --git a/docs/cloud/reference/01_changelog/_category_.json b/docs/cloud/reference/01_changelog/_category_.json new file mode 100644 index 00000000000..60a9e95ee7e --- /dev/null +++ b/docs/cloud/reference/01_changelog/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Change logs", + "collapsible": true, + "collapsed": true, + "link": { "type": "doc", "id": "cloud/reference/changelog/index" } +} \ No newline at end of file diff --git a/docs/cloud/reference/01_changelog/changelogs-index.md b/docs/cloud/reference/01_changelog/index.md similarity index 91% rename from docs/cloud/reference/01_changelog/changelogs-index.md rename to docs/cloud/reference/01_changelog/index.md index c23e70f4ea2..cfdb11087f8 100644 --- a/docs/cloud/reference/01_changelog/changelogs-index.md +++ b/docs/cloud/reference/01_changelog/index.md @@ -7,4 +7,4 @@ description: 'Landing page for Cloud changelogs' | Page | Description | |---------------------------------------------------------------|-------------------------------------------------| | [Cloud Changelog](/whats-new/cloud) | Changelog for ClickHouse Cloud | -| [Release Notes](/cloud/reference/changelogs/release-notes) | Release notes for all ClickHouse Cloud releases | +| [Release Notes](/cloud/reference/changelogs/release-notes) | Release notes for all ClickHouse Cloud releases | \ No newline at end of file diff --git a/docs/cloud/reference/05_architecture.md b/docs/cloud/reference/02_architecture.md similarity index 98% rename from docs/cloud/reference/05_architecture.md rename to docs/cloud/reference/02_architecture.md index 9c3d7cf5f56..6e3294d3a97 100644 --- a/docs/cloud/reference/05_architecture.md +++ b/docs/cloud/reference/02_architecture.md @@ -1,7 +1,7 @@ --- sidebar_label: 'Architecture' slug: /cloud/reference/architecture -title: 'ClickHouse Cloud Architecture' +title: 'ClickHouse Cloud architecture' description: 'This page describes the architecture of ClickHouse Cloud' --- diff --git a/docs/cloud/manage/billing.md b/docs/cloud/reference/03_billing/01_billing_overview.md similarity index 99% rename from docs/cloud/manage/billing.md rename to docs/cloud/reference/03_billing/01_billing_overview.md index 1def3aac523..400976d4073 100644 --- a/docs/cloud/manage/billing.md +++ b/docs/cloud/reference/03_billing/01_billing_overview.md @@ -5,7 +5,7 @@ title: 'Pricing' description: 'Overview page for ClickHouse Cloud pricing' --- -import ClickPipesFAQ from './jan2025_faq/_snippets/_clickpipes_faq.md' +import ClickPipesFAQ from '../09_jan2025_faq/_snippets/_clickpipes_faq.md' For pricing information, see the [ClickHouse Cloud Pricing](https://clickhouse.com/pricing#pricing-calculator) page. ClickHouse Cloud bills based on the usage of compute, storage, [data transfer](/cloud/manage/network-data-transfer) (egress over the internet and cross-region), and [ClickPipes](/integrations/clickpipes). diff --git a/docs/cloud/reference/02_billing/marketplace/aws-marketplace-committed.md b/docs/cloud/reference/03_billing/02_marketplace/aws-marketplace-committed.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/aws-marketplace-committed.md rename to docs/cloud/reference/03_billing/02_marketplace/aws-marketplace-committed.md diff --git a/docs/cloud/reference/02_billing/marketplace/aws-marketplace-payg.md b/docs/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/aws-marketplace-payg.md rename to docs/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md diff --git a/docs/cloud/reference/02_billing/marketplace/azure-marketplace-committed.md b/docs/cloud/reference/03_billing/02_marketplace/azure-marketplace-committed.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/azure-marketplace-committed.md rename to docs/cloud/reference/03_billing/02_marketplace/azure-marketplace-committed.md diff --git a/docs/cloud/reference/02_billing/marketplace/azure-marketplace-payg.md b/docs/cloud/reference/03_billing/02_marketplace/azure-marketplace-payg.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/azure-marketplace-payg.md rename to docs/cloud/reference/03_billing/02_marketplace/azure-marketplace-payg.md diff --git a/docs/cloud/reference/02_billing/marketplace/gcp-marketplace-committed.md b/docs/cloud/reference/03_billing/02_marketplace/gcp-marketplace-committed.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/gcp-marketplace-committed.md rename to docs/cloud/reference/03_billing/02_marketplace/gcp-marketplace-committed.md diff --git a/docs/cloud/reference/02_billing/marketplace/gcp-marketplace-payg.md b/docs/cloud/reference/03_billing/02_marketplace/gcp-marketplace-payg.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/gcp-marketplace-payg.md rename to docs/cloud/reference/03_billing/02_marketplace/gcp-marketplace-payg.md diff --git a/docs/cloud/reference/02_billing/marketplace/index.md b/docs/cloud/reference/03_billing/02_marketplace/index.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/index.md rename to docs/cloud/reference/03_billing/02_marketplace/index.md diff --git a/docs/cloud/reference/02_billing/marketplace/overview.md b/docs/cloud/reference/03_billing/02_marketplace/overview.md similarity index 100% rename from docs/cloud/reference/02_billing/marketplace/overview.md rename to docs/cloud/reference/03_billing/02_marketplace/overview.md diff --git a/docs/cloud/reference/02_billing/payment-thresholds.md b/docs/cloud/reference/03_billing/03_payment-thresholds.md similarity index 97% rename from docs/cloud/reference/02_billing/payment-thresholds.md rename to docs/cloud/reference/03_billing/03_payment-thresholds.md index 0c2b6948d0e..2d9ce5f188a 100644 --- a/docs/cloud/reference/02_billing/payment-thresholds.md +++ b/docs/cloud/reference/03_billing/03_payment-thresholds.md @@ -1,7 +1,7 @@ --- sidebar_label: 'Payment Thresholds' slug: /cloud/billing/payment-thresholds -title: 'Payment Thresholds' +title: 'Payment thresholds' description: 'Payment thresholds and automatic invoicing for ClickHouse Cloud.' keywords: ['billing', 'payment thresholds', 'automatic invoicing', 'invoice'] --- diff --git a/docs/cloud/reference/04_network-data-transfer.mdx b/docs/cloud/reference/03_billing/04_network-data-transfer.mdx similarity index 96% rename from docs/cloud/reference/04_network-data-transfer.mdx rename to docs/cloud/reference/03_billing/04_network-data-transfer.mdx index 30308d7b29f..4013e1477b7 100644 --- a/docs/cloud/reference/04_network-data-transfer.mdx +++ b/docs/cloud/reference/03_billing/04_network-data-transfer.mdx @@ -5,7 +5,7 @@ title: 'Data Transfer' description: 'Understand how ClickHouse Cloud meters data transferred ingress and egress' --- -import NetworkPricing from '@site/docs/cloud/manage/_snippets/_network_transfer_rates.md'; +import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; ClickHouse Cloud meters data transferred ingress and egress. This includes any data in and out of ClickHouse Cloud as well as any intra-region diff --git a/docs/cloud/reference/02_billing/troubleshooting-billing-issues.md b/docs/cloud/reference/03_billing/05_billing_compliance.md similarity index 99% rename from docs/cloud/reference/02_billing/troubleshooting-billing-issues.md rename to docs/cloud/reference/03_billing/05_billing_compliance.md index 5454ec20190..2ed47efdb7c 100644 --- a/docs/cloud/reference/02_billing/troubleshooting-billing-issues.md +++ b/docs/cloud/reference/03_billing/05_billing_compliance.md @@ -1,7 +1,7 @@ --- sidebar_label: 'ClickHouse Cloud billing compliance' slug: /manage/troubleshooting-billing-issues -title: 'ClickHouse Cloud billing compliance' +title: 'Cloud billing compliance' description: 'Page describing ClickHouse Cloud billing compliance' keywords: ['billing compliance', 'pay-as-you-go'] --- diff --git a/docs/cloud/reference/02_billing/index.md b/docs/cloud/reference/03_billing/index.md similarity index 100% rename from docs/cloud/reference/02_billing/index.md rename to docs/cloud/reference/03_billing/index.md diff --git a/docs/cloud/reference/03_cloud-compatibility.md b/docs/cloud/reference/04_cloud-compatibility.md similarity index 99% rename from docs/cloud/reference/03_cloud-compatibility.md rename to docs/cloud/reference/04_cloud-compatibility.md index 86dafbfefd5..59c238c9c08 100644 --- a/docs/cloud/reference/03_cloud-compatibility.md +++ b/docs/cloud/reference/04_cloud-compatibility.md @@ -1,6 +1,6 @@ --- slug: /whats-new/cloud-compatibility -sidebar_label: 'Cloud Compatibility' +sidebar_label: 'Cloud compatibility' title: 'Cloud Compatibility' description: 'This guide provides an overview of what to expect functionally and operationally in ClickHouse Cloud.' --- diff --git a/docs/cloud/reference/supported-regions.md b/docs/cloud/reference/05_supported-regions.md similarity index 98% rename from docs/cloud/reference/supported-regions.md rename to docs/cloud/reference/05_supported-regions.md index c9b4d0ab549..426fd5bc97d 100644 --- a/docs/cloud/reference/supported-regions.md +++ b/docs/cloud/reference/05_supported-regions.md @@ -1,6 +1,6 @@ --- title: 'Supported Cloud Regions' -sidebar_label: 'Supported Cloud Regions' +sidebar_label: 'Supported Cloud regions' keywords: ['aws', 'gcp', 'google cloud', 'azure', 'cloud', 'regions'] description: 'Supported regions for ClickHouse Cloud' slug: /cloud/reference/supported-regions diff --git a/docs/cloud/reference/service-uptime.md b/docs/cloud/reference/06_service-uptime.md similarity index 95% rename from docs/cloud/reference/service-uptime.md rename to docs/cloud/reference/06_service-uptime.md index 3a31e459eaf..33397a626be 100644 --- a/docs/cloud/reference/service-uptime.md +++ b/docs/cloud/reference/06_service-uptime.md @@ -1,7 +1,7 @@ --- sidebar_label: 'Service Uptime and SLA' slug: /cloud/manage/service-uptime -title: 'Service Uptime' +title: 'Service uptime' description: 'Users can now see regional uptimes on the status page and subscribe to alerts on service disruptions.' --- diff --git a/docs/cloud/manage/settings.md b/docs/cloud/reference/08_settings.md similarity index 94% rename from docs/cloud/manage/settings.md rename to docs/cloud/reference/08_settings.md index a766ef59c13..9926c5833cb 100644 --- a/docs/cloud/manage/settings.md +++ b/docs/cloud/reference/08_settings.md @@ -1,7 +1,7 @@ --- -sidebar_label: 'Configuring Settings' +sidebar_label: 'Configuring settings' slug: /manage/settings -title: 'Configuring Settings' +title: 'Configuring settings' description: 'How to configure settings for your ClickHouse Cloud service for a specific user or role' --- diff --git a/docs/cloud/manage/jan2025_faq/_snippets/_clickpipes_faq.md b/docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/_snippets/_clickpipes_faq.md rename to docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md diff --git a/docs/cloud/manage/jan2025_faq/backup.md b/docs/cloud/reference/09_jan2025_faq/backup.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/backup.md rename to docs/cloud/reference/09_jan2025_faq/backup.md diff --git a/docs/cloud/manage/jan2025_faq/billing.md b/docs/cloud/reference/09_jan2025_faq/billing.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/billing.md rename to docs/cloud/reference/09_jan2025_faq/billing.md diff --git a/docs/cloud/manage/jan2025_faq/dimensions.md b/docs/cloud/reference/09_jan2025_faq/dimensions.md similarity index 94% rename from docs/cloud/manage/jan2025_faq/dimensions.md rename to docs/cloud/reference/09_jan2025_faq/dimensions.md index c4dd9268593..01e4937000f 100644 --- a/docs/cloud/manage/jan2025_faq/dimensions.md +++ b/docs/cloud/reference/09_jan2025_faq/dimensions.md @@ -1,5 +1,5 @@ --- -title: 'New Pricing Dimensions' +title: 'New pricing dimensions' slug: /cloud/manage/jan-2025-faq/pricing-dimensions keywords: ['new pricing', 'dimensions'] description: 'Pricing dimensions for data transfer and ClickPipes' @@ -9,7 +9,7 @@ import Image from '@theme/IdealImage'; import clickpipesPricingFaq1 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_1.png'; import clickpipesPricingFaq2 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_2.png'; import clickpipesPricingFaq3 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_3.png'; -import NetworkPricing from '@site/docs/cloud/manage/_snippets/_network_transfer_rates.md'; +import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; import ClickPipesFAQ from './_snippets/_clickpipes_faq.md' The following dimensions have been added to the new ClickHouse Cloud pricing. diff --git a/docs/cloud/manage/jan2025_faq/index.md b/docs/cloud/reference/09_jan2025_faq/index.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/index.md rename to docs/cloud/reference/09_jan2025_faq/index.md diff --git a/docs/cloud/manage/jan2025_faq/new_tiers.md b/docs/cloud/reference/09_jan2025_faq/new_tiers.md similarity index 99% rename from docs/cloud/manage/jan2025_faq/new_tiers.md rename to docs/cloud/reference/09_jan2025_faq/new_tiers.md index b90874aedb8..6aa943808d2 100644 --- a/docs/cloud/manage/jan2025_faq/new_tiers.md +++ b/docs/cloud/reference/09_jan2025_faq/new_tiers.md @@ -1,5 +1,5 @@ --- -title: 'Description of New Tiers' +title: 'Description of new tiers' slug: /cloud/manage/jan-2025-faq/new-tiers keywords: ['new tiers', 'features', 'pricing', 'description'] description: 'Description of new tiers and features' diff --git a/docs/cloud/manage/jan2025_faq/plan_migrations.md b/docs/cloud/reference/09_jan2025_faq/plan_migrations.md similarity index 99% rename from docs/cloud/manage/jan2025_faq/plan_migrations.md rename to docs/cloud/reference/09_jan2025_faq/plan_migrations.md index fffdebfe45b..fc5cfc56233 100644 --- a/docs/cloud/manage/jan2025_faq/plan_migrations.md +++ b/docs/cloud/reference/09_jan2025_faq/plan_migrations.md @@ -1,5 +1,5 @@ --- -title: 'Migrating to New Plans' +title: 'Migrating to new plans' slug: /cloud/manage/jan-2025-faq/plan-migrations keywords: ['migration', 'new tiers', 'pricing', 'cost', 'estimation'] description: 'Migrating to new plans, tiers, pricing, how to decide and estimate costs' diff --git a/docs/cloud/manage/jan2025_faq/scaling.md b/docs/cloud/reference/09_jan2025_faq/scaling.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/scaling.md rename to docs/cloud/reference/09_jan2025_faq/scaling.md diff --git a/docs/cloud/manage/jan2025_faq/summary.md b/docs/cloud/reference/09_jan2025_faq/summary.md similarity index 100% rename from docs/cloud/manage/jan2025_faq/summary.md rename to docs/cloud/reference/09_jan2025_faq/summary.md diff --git a/docs/cloud/reference/account-close.md b/docs/cloud/reference/10_account-close.md similarity index 98% rename from docs/cloud/reference/account-close.md rename to docs/cloud/reference/10_account-close.md index ac9a79eeeea..021345d4a94 100644 --- a/docs/cloud/reference/account-close.md +++ b/docs/cloud/reference/10_account-close.md @@ -1,11 +1,12 @@ --- -sidebar_label: 'Delete Account' +sidebar_label: 'Account closure' slug: /cloud/manage/close_account -title: 'Account Close & Deletion' +title: 'Account closure and deletion' description: 'We know there are circumstances that sometimes necessitate account closure. This guide will help you through the process.' --- ## Account closure and deletion {#account-close--deletion} + Our goal is to help you be successful in your project. If you have questions that are not answered on this site or need help evaluating a unique use case, please contact us at [support@clickhouse.com](mailto:support@clickhouse.com). diff --git a/docs/cloud/manage/_snippets/_network_transfer_rates.md b/docs/cloud/reference/_snippets/_network_transfer_rates.md similarity index 100% rename from docs/cloud/manage/_snippets/_network_transfer_rates.md rename to docs/cloud/reference/_snippets/_network_transfer_rates.md diff --git a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md index 353c2f197b9..331fcabb5f5 100644 --- a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md +++ b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md @@ -10,7 +10,7 @@ import Image from '@theme/IdealImage'; [Amazon Redshift](https://aws.amazon.com/redshift/) is a popular cloud data warehousing solution that is part of the Amazon Web Services offerings. This guide presents different approaches to migrating data from a Redshift instance to ClickHouse. We will cover three options: -Redshift to ClickHouse Migration Options +Redshift to ClickHouse Migration Options From the ClickHouse instance standpoint, you can either: @@ -29,7 +29,7 @@ We used Redshift as a data source in this tutorial. However, the migration appro In the push scenario, the idea is to leverage a third-party tool or service (either custom code or an [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)) to send your data to your ClickHouse instance. For example, you can use a software like [Airbyte](https://www.airbyte.com/) to move data between your Redshift instance (as a source) and ClickHouse as a destination ([see our integration guide for Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)) -PUSH Redshift to ClickHouse +PUSH Redshift to ClickHouse ### Pros {#pros} @@ -47,7 +47,7 @@ In the push scenario, the idea is to leverage a third-party tool or service (eit In the pull scenario, the idea is to leverage the ClickHouse JDBC Bridge to connect to a Redshift cluster directly from a ClickHouse instance and perform `INSERT INTO ... SELECT` queries: -PULL from Redshift to ClickHouse +PULL from Redshift to ClickHouse ### Pros {#pros-1} @@ -171,7 +171,7 @@ If you are using ClickHouse Cloud, you will need to run your ClickHouse JDBC Bri In this scenario, we export data to S3 in an intermediary pivot format and, in a second step, load the data from S3 into ClickHouse. -PIVOT from Redshift using S3 +PIVOT from Redshift using S3 ### Pros {#pros-2} diff --git a/docs/whats-new/changelog/cloud.md b/docs/whats-new/changelog/cloud.md index cbc3f51a2f8..dd3faf69c73 100644 --- a/docs/whats-new/changelog/cloud.md +++ b/docs/whats-new/changelog/cloud.md @@ -8,6 +8,6 @@ description: 'Learn about Cloud Changelog' # Cloud Changelog -import CloudChangelog from '@site/docs/cloud/reference/changelog.md'; +import CloudChangelog from '@site/docs/cloud/reference/01_changelog/01_changelog.md'; diff --git a/docs/faq/troubleshooting.md b/knowledgebase/unable-to-access-cloud-service.mdx similarity index 63% rename from docs/faq/troubleshooting.md rename to knowledgebase/unable-to-access-cloud-service.mdx index 4b1221d7dea..353fd98ce3b 100644 --- a/docs/faq/troubleshooting.md +++ b/knowledgebase/unable-to-access-cloud-service.mdx @@ -1,12 +1,15 @@ --- -title: 'Troubleshooting' -slug: /faq/troubleshooting -description: 'How to troubleshoot common ClickHouse Cloud error messages.' +title: Tips and tricks on optimizing basic data types in ClickHouse +description: "Tips and tricks on optimizing basic data types in ClickHouse" +date: 2024-07-02 +tags: ['Troubleshooting'] +keywords: ['accessing cloud service'] --- -## ClickHouse Cloud troubleshooting {#clickhouse-cloud-troubleshooting} +{frontMatter.description} +{/* truncate */} -### Unable to access a ClickHouse Cloud service {#unable-to-access-a-clickhouse-cloud-service} +## I am unable to access a ClickHouse Cloud service {#i-am-unable-to-access-a-clickhouse-cloud-service} If you are seeing an error message like one of these, your IP Access List may be denying access: diff --git a/sidebars.js b/sidebars.js index df9a760807c..2de00c45b3a 100644 --- a/sidebars.js +++ b/sidebars.js @@ -260,48 +260,6 @@ const sidebars = { "cloud/bestpractices/multitenancy", ], }, - { - type: "category", - label: "Managing Cloud", - collapsed: true, - collapsible: true, - className: "top-nav-item", - link: { type: "doc", id: "cloud/manage/index" }, - items: [ - "cloud/manage/settings", - "faq/troubleshooting", - { - type: "category", - label: "Jan 2025 Changes FAQ", - collapsed: true, - collapsible: true, - link: { type: "doc", id: "cloud/manage/jan2025_faq/index" }, - items: [ - "cloud/manage/jan2025_faq/summary", - "cloud/manage/jan2025_faq/new_tiers", - "cloud/manage/jan2025_faq/plan_migrations", - "cloud/manage/jan2025_faq/dimensions", - "cloud/manage/jan2025_faq/billing", - "cloud/manage/jan2025_faq/scaling", - "cloud/manage/jan2025_faq/backup", - ], - } - ], - }, - { - type: "category", - label: "Cloud API", - collapsed: true, - collapsible: true, - className: "top-nav-item", - link: { type: "doc", id: "cloud/manage/api/index" }, - items: [ - { - type: "autogenerated", - dirName: "cloud/manage/api", - } - ], - }, { type: "category", label: "Reference", @@ -372,6 +330,20 @@ const sidebars = { }, ], }, + { + type: "category", + label: "Cloud API", + collapsed: true, + collapsible: true, + className: "top-nav-item", + link: { type: "doc", id: "cloud/api/index" }, + items: [ + { + type: "autogenerated", + dirName: "cloud/api", + } + ], + }, ], sqlreference: [ @@ -1645,20 +1617,8 @@ const sidebars = { }, { type: "link", - label: "Managing Cloud", - description: "Manage your ClickHouse Cloud services", - href: "/cloud/bestpractices" - }, - { - type: "link", - label: "Cloud API", - description: "Automate your ClickHouse Cloud services", - href: "/cloud/manage/cloud-api/" - }, - { - type: "link", - label: "Cloud Reference", - description: "Understanding how ClickHouse Cloud works", + label: "Reference", + description: "Reference docs for ClickHouse Cloud", href: "/cloud/reference/" }, { @@ -1669,9 +1629,9 @@ const sidebars = { }, { type: "link", - label: "Migrating to Cloud", - description: "Migrate your database to ClickHouse Cloud", - href: "/integrations/migration" + label: "Cloud API", + description: "Automate your ClickHouse Cloud services", + href: "/cloud/manage/cloud-api/" }, ] }, diff --git a/static/images/cloud/onboard/discover/use_cases/cloud_architecture.png b/static/images/cloud/onboard/discover/use_cases/cloud_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..394a3cc4c4b599537c3d13e2f3b2f6e2321fb52b GIT binary patch literal 83486 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 B;$8p% literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/datalakehouse_01.png b/static/images/cloud/onboard/discover/use_cases/datalakehouse_01.png new file mode 100644 index 0000000000000000000000000000000000000000..120f30c54d2a997a923fdec36064829686310ac9 GIT binary patch literal 93124 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 B16lw8 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_01.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_01.png new file mode 100644 index 0000000000000000000000000000000000000000..2193a93a6d180bd0c90bf6366fd7969462313bff GIT binary patch literal 53816 zcmd42byQW~*Ds8R104F$4TqF&6{HT`EnU(fAl=~+5Cnun3kV1jN_U5nhY+MeN~NWw z8{duJcz(|v;~nF<@4bJ#jKP4t*WP>Wwbopp`I(yb6++ zhjVbS>*{EmnVH$!J6vC1|5y$IfzVZyRlU8vT3S8F#(j79{3$8v`1!fl*VlD*+%ht> zM@L7&=&a%4L3VcVmX_wCqQc~4WKfV|sTR%}&@aSGM??4e_n#kvK>9Rh;2gG_l94AG z8ZOE0?;W&^H)}GZ&qTtC z*^+1=CG{6Ora=|fl%7x$^;Y0{Xdy6Hf83K(P3OQpDDe25(!sLL4 zY!Cd1H0SX(36C-Dg<8YhFZT8wLg=jAw8Q0>C@fh;C}a(zx`^y6+ zad&$kM|v7KPiN0Rsc4fe1)-f0K)^v6@E=_@OWw`J?*nuqD2wynV_L4u>P1-U=`F;G z>D8_7HkT+d=#d@iX}i0w3((D(QnEbl99XU2Xp#1sNS7DTaBYbl-hBOJ+=#5reEsVi z^Rk~lN=@j$#1U>`jfbg0_kti-sbO$A-agePu>s?7OFrk(NK0+4Gg!by4SV!}yAe^j znXhj6gz##vCHr;|$-vGlVMtn9otb9#n-*S*Nv{ZVx1yv-^5=6_loeXo+3|rzLD)AE zWL0$tn(%8=gxfCv$f?@7)QJBCqidTpf_j%7+3uLZ=+pSVQw73@xBSMSM@DO8JQdfH z!V(t#?G0HEJ9M~-OFikS8LvZFEVEeaRXttHM6uqi5>Kvk-5@eqU6rbnO40*)3Q677Y3x)ItzzMd$1rFMQd|lZ3}k zH2DtBl9KZ@8cBZ`tR!I|<2ZrHjK36`-U1m!%jMeOs zGIथ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 M;tFErB5wlz2WAd*)Bpeg literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_02.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9443ee122f98c44147512da50adda31ae884b5c5 GIT binary patch literal 67405 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 IcpUcs0aQtXvj6}9 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_03.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_03.png new file mode 100644 index 0000000000000000000000000000000000000000..88a8656c8307ed96eaa9b5b19815f5cf2bc25a01 GIT binary patch literal 56048 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 Y*58pU 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 z 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 a#(k0fSWrdYis=^M@6rY6d7|cx!2buKqOoiM literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_05.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_05.png new file mode 100644 index 0000000000000000000000000000000000000000..035aebd1b5c8a3825fc4cb2874913e39cac2baee GIT binary patch literal 5187 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 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_06.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_06.png new file mode 100644 index 0000000000000000000000000000000000000000..48a17c9e0b9165fea7cc10123e1cc8b18ce7b5f2 GIT binary patch literal 74529 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 literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/ml_ai_09.png b/static/images/cloud/onboard/discover/use_cases/ml_ai_09.png new file mode 100644 index 0000000000000000000000000000000000000000..ae54653aa6757c0cf1896566dec1b3691ebeea5e GIT binary patch literal 54196 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 R>ro3*=IQF^vd$@?2>@4#)SCbR literal 0 HcmV?d00001 diff --git a/static/images/cloud/onboard/discover/use_cases/snowflake_architecture.png b/static/images/cloud/onboard/discover/use_cases/snowflake_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..05ae8e7c2a777cb662cbdaca8d50f163f8b82eb6 GIT binary patch literal 16004 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 bP@EO<(@N+$pALNb4N{g@mn*vUFyMay4sOly literal 0 HcmV?d00001 diff --git a/vercel.json b/vercel.json index 85745255f68..434aff71a8c 100644 --- a/vercel.json +++ b/vercel.json @@ -3375,6 +3375,11 @@ "source": "/docs/cloud/migrate/upload-a-csv-file", "destination": "/docs/knowledge-base/upload-a-file", "permanent": true + }, + { + "source": "/docs/faq/troubleshooting", + "destination": "/docs/knowledge-base/unable-to-access-cloud-service", + "permanent": true } ] } From 07cc0a7a771d7acf95838f452ee85c49e0bf0254 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 29 Jul 2025 21:35:35 +0200 Subject: [PATCH 07/29] further reorganisation of Cloud section in general --- docs/_snippets/_users-and-roles-common.md | 101 ++++--- docs/cloud/bestpractices/usagelimits.md | 31 -- .../{bestpractices => guides}/_category_.yml | 2 +- .../guides/best_practices/_category_.json | 5 + .../best_practices}/multitenancy.md | 2 +- .../guides/best_practices/usagelimits.md | 40 +++ .../cloud-compatibility.md} | 0 docs/cloud/{bestpractices => guides}/index.md | 0 docs/cloud/guides/security/_category_.json | 5 + .../cloud_access_management/_category_.json | 5 + .../common-access-management-queries.md | 0 .../saml-sso-setup.md | 0 .../security/connectivity/_category_.json | 5 + .../accessing-s3-data-securely.md | 0 .../reference/09_security/_category_.json | 5 + .../privacy_and_compliance/_category_.json | 6 + .../compliance-overview.md | 6 - .../privacy_and_compliance/index.md} | 0 .../personal-data-access.md | 4 +- .../cloud-access-management.md | 106 ++++--- .../redshift/_snippets/_migration_guide.md | 275 ++++++++++-------- sidebars.js | 24 +- 22 files changed, 344 insertions(+), 278 deletions(-) delete mode 100644 docs/cloud/bestpractices/usagelimits.md rename docs/cloud/{bestpractices => guides}/_category_.yml (83%) create mode 100644 docs/cloud/guides/best_practices/_category_.json rename docs/cloud/{bestpractices => guides/best_practices}/multitenancy.md (99%) create mode 100644 docs/cloud/guides/best_practices/usagelimits.md rename docs/cloud/{reference/04_cloud-compatibility.md => guides/cloud-compatibility.md} (100%) rename docs/cloud/{bestpractices => guides}/index.md (100%) create mode 100644 docs/cloud/guides/security/_category_.json create mode 100644 docs/cloud/guides/security/cloud_access_management/_category_.json rename docs/cloud/{security => guides/security/cloud_access_management}/common-access-management-queries.md (100%) rename docs/cloud/{security => guides/security/cloud_access_management}/saml-sso-setup.md (100%) create mode 100644 docs/cloud/guides/security/connectivity/_category_.json rename docs/cloud/{security => guides/security/connectivity}/accessing-s3-data-securely.md (100%) create mode 100644 docs/cloud/reference/09_security/_category_.json create mode 100644 docs/cloud/reference/09_security/privacy_and_compliance/_category_.json rename docs/cloud/{security => reference/09_security/privacy_and_compliance}/compliance-overview.md (95%) rename docs/cloud/{security/privacy-compliance-overview.md => reference/09_security/privacy_and_compliance/index.md} (100%) rename docs/cloud/{security => reference/09_security/privacy_and_compliance}/personal-data-access.md (98%) diff --git a/docs/_snippets/_users-and-roles-common.md b/docs/_snippets/_users-and-roles-common.md index 29726229be9..964f9a8b40d 100644 --- a/docs/_snippets/_users-and-roles-common.md +++ b/docs/_snippets/_users-and-roles-common.md @@ -42,64 +42,73 @@ Create these tables and users to be used in the examples. #### Creating a sample database, table, and rows {#creating-a-sample-database-table-and-rows} -1. Create a test database + - ```sql - CREATE DATABASE db1; - ``` +##### Create a test database {#create-a-test-database} -2. Create a table +```sql +CREATE DATABASE db1; +``` - ```sql - CREATE TABLE db1.table1 ( - id UInt64, - column1 String, - column2 String - ) - ENGINE MergeTree - ORDER BY id; - ``` +##### Create a table {#create-a-table} -3. Populate the table with sample rows +```sql +CREATE TABLE db1.table1 ( + id UInt64, + column1 String, + column2 String +) +ENGINE MergeTree +ORDER BY id; +``` - ```sql - INSERT INTO db1.table1 - (id, column1, column2) - VALUES - (1, 'A', 'abc'), - (2, 'A', 'def'), - (3, 'B', 'abc'), - (4, 'B', 'def'); - ``` +##### Populate the table with sample rows {#populate} -4. Verify the table: +```sql +INSERT INTO db1.table1 + (id, column1, column2) +VALUES + (1, 'A', 'abc'), + (2, 'A', 'def'), + (3, 'B', 'abc'), + (4, 'B', 'def'); +``` - ```sql - SELECT * - FROM db1.table1 - ``` +##### Verify the table {#verify} - ```response - Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49 +```sql title="Query" +SELECT * +FROM db1.table1 +``` - ┌─id─┬─column1─┬─column2─┐ - │ 1 │ A │ abc │ - │ 2 │ A │ def │ - │ 3 │ B │ abc │ - │ 4 │ B │ def │ - └────┴─────────┴─────────┘ - ``` +```response title="Response" +Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49 -5. Create a regular user that will be used to demonstrate restrict access to certain columns: +┌─id─┬─column1─┬─column2─┐ +│ 1 │ A │ abc │ +│ 2 │ A │ def │ +│ 3 │ B │ abc │ +│ 4 │ B │ def │ +└────┴─────────┴─────────┘ +``` - ```sql - CREATE USER column_user IDENTIFIED BY 'password'; - ``` +##### Create `column_user` {#create-a-user-with-restricted-access-to-columns} -6. Create a regular user that will be used to demonstrate restricting access to rows with certain values: - ```sql - CREATE USER row_user IDENTIFIED BY 'password'; - ``` +Create a regular user that will be used to demonstrate restrict access to certain columns: + +```sql +CREATE USER column_user IDENTIFIED BY 'password'; +``` + +##### Create `row_user` {#create-a-user-with-restricted-access-to-rows-with-certain-values} + +Create a regular user that will be used to demonstrate restricting access to rows with certain values: + +```sql +CREATE USER row_user IDENTIFIED BY 'password'; +``` + + #### Creating roles {#creating-roles} diff --git a/docs/cloud/bestpractices/usagelimits.md b/docs/cloud/bestpractices/usagelimits.md deleted file mode 100644 index 37ab67b542c..00000000000 --- a/docs/cloud/bestpractices/usagelimits.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -slug: /cloud/bestpractices/usage-limits -sidebar_label: 'Usage Limits' -title: 'Usage limits' -description: 'Describes the recommended usage limits in ClickHouse Cloud' ---- - -While ClickHouse is known for its speed and reliability, optimal performance is achieved within certain operating parameters. For example, having too many tables, databases or parts could negatively impact performance. To avoid this, Clickhouse Cloud has guardrails set up for several types of items. You can find details of these guardrails below. - -:::tip -If you've run up against one of these guardrails, it's possible that you are implementing your use case in an unoptimized way. Contact our support team and we will gladly help you refine your use case to avoid exceeding the guardrails or look together at how we can increase them in a controlled manner. -::: - -| Dimension | Limit | -|-----------|-------| -|**Databases**| 1000| -|**Tables**| 5000| -|**Columns**| ∼1000 (wide format is preferred to compact)| -|**Partitions**| 50k| -|**Parts**| 100k across the entire instance| -|**Part size**| 150gb| -|**Services per organization**| 20 (soft)| -|**Services per warehouse**| 5 (soft)| -|**Low cardinality**| 10k or less| -|**Primary keys in a table**| 4-5 that sufficiently filter down the data| -|**Query concurrency**| 1000| -|**Batch ingest**| anything > 1M will be split by the system in 1M row blocks| - -:::note -For Single Replica Services, the maximum number of databases is restricted to 100, and the maximum number of tables is restricted to 500. In addition, storage for Basic Tier Services is limited to 1 TB. -::: diff --git a/docs/cloud/bestpractices/_category_.yml b/docs/cloud/guides/_category_.yml similarity index 83% rename from docs/cloud/bestpractices/_category_.yml rename to docs/cloud/guides/_category_.yml index 1648e8a79cb..747e5fb1796 100644 --- a/docs/cloud/bestpractices/_category_.yml +++ b/docs/cloud/guides/_category_.yml @@ -1,4 +1,4 @@ -label: 'Best Practices' +label: 'Guides' collapsible: true collapsed: true link: diff --git a/docs/cloud/guides/best_practices/_category_.json b/docs/cloud/guides/best_practices/_category_.json new file mode 100644 index 00000000000..21f95c55bca --- /dev/null +++ b/docs/cloud/guides/best_practices/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Best practices", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/bestpractices/multitenancy.md b/docs/cloud/guides/best_practices/multitenancy.md similarity index 99% rename from docs/cloud/bestpractices/multitenancy.md rename to docs/cloud/guides/best_practices/multitenancy.md index 5289a09b067..5f7df65427a 100644 --- a/docs/cloud/bestpractices/multitenancy.md +++ b/docs/cloud/guides/best_practices/multitenancy.md @@ -1,6 +1,6 @@ --- slug: /cloud/bestpractices/multi-tenancy -sidebar_label: 'Implement multi tenancy' +sidebar_label: 'Multi tenancy' title: 'Multi tenancy' description: 'Best practices to implement multi tenancy' --- diff --git a/docs/cloud/guides/best_practices/usagelimits.md b/docs/cloud/guides/best_practices/usagelimits.md new file mode 100644 index 00000000000..af49f5956be --- /dev/null +++ b/docs/cloud/guides/best_practices/usagelimits.md @@ -0,0 +1,40 @@ +--- +slug: /cloud/bestpractices/usage-limits +sidebar_label: 'Service limits' +title: 'Usage limits' +description: 'Describes the recommended usage limits in ClickHouse Cloud' +--- + +While ClickHouse is known for its speed and reliability, optimal performance is +achieved within certain operating parameters. For example, having too many tables, +databases or parts could negatively impact performance. To avoid this, Clickhouse +Cloud has guardrails set up for several types of items. You can find details of +these guardrails below. + +:::tip +If you've run up against one of these guardrails, it's possible that you are +implementing your use case in an unoptimized way. Contact our support team and +we will gladly help you refine your use case to avoid exceeding the guardrails +or look together at how we can increase them in a controlled manner. +::: + +| Dimension | Limit | +|-------------------------------|------------------------------------------------------------| +| **Databases** | 1000 | +| **Tables** | 5000 | +| **Columns** | ∼1000 (wide format is preferred to compact) | +| **Partitions** | 50k | +| **Parts** | 100k across the entire instance | +| **Part size** | 150gb | +| **Services per organization** | 20 (soft) | +| **Services per warehouse** | 5 (soft) | +| **Low cardinality** | 10k or less | +| **Primary keys in a table** | 4-5 that sufficiently filter down the data | +| **Query concurrency** | 1000 | +| **Batch ingest** | anything > 1M will be split by the system in 1M row blocks | + +:::note +For Single Replica Services, the maximum number of databases is restricted to +100, and the maximum number of tables is restricted to 500. In addition, storage +for Basic Tier Services is limited to 1 TB. +::: diff --git a/docs/cloud/reference/04_cloud-compatibility.md b/docs/cloud/guides/cloud-compatibility.md similarity index 100% rename from docs/cloud/reference/04_cloud-compatibility.md rename to docs/cloud/guides/cloud-compatibility.md diff --git a/docs/cloud/bestpractices/index.md b/docs/cloud/guides/index.md similarity index 100% rename from docs/cloud/bestpractices/index.md rename to docs/cloud/guides/index.md diff --git a/docs/cloud/guides/security/_category_.json b/docs/cloud/guides/security/_category_.json new file mode 100644 index 00000000000..aed26fa7f7a --- /dev/null +++ b/docs/cloud/guides/security/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Security", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/guides/security/cloud_access_management/_category_.json b/docs/cloud/guides/security/cloud_access_management/_category_.json new file mode 100644 index 00000000000..abfdcebed27 --- /dev/null +++ b/docs/cloud/guides/security/cloud_access_management/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Cloud Access Management", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/security/common-access-management-queries.md b/docs/cloud/guides/security/cloud_access_management/common-access-management-queries.md similarity index 100% rename from docs/cloud/security/common-access-management-queries.md rename to docs/cloud/guides/security/cloud_access_management/common-access-management-queries.md diff --git a/docs/cloud/security/saml-sso-setup.md b/docs/cloud/guides/security/cloud_access_management/saml-sso-setup.md similarity index 100% rename from docs/cloud/security/saml-sso-setup.md rename to docs/cloud/guides/security/cloud_access_management/saml-sso-setup.md diff --git a/docs/cloud/guides/security/connectivity/_category_.json b/docs/cloud/guides/security/connectivity/_category_.json new file mode 100644 index 00000000000..6e137e0592d --- /dev/null +++ b/docs/cloud/guides/security/connectivity/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Connectivity", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/security/accessing-s3-data-securely.md b/docs/cloud/guides/security/connectivity/accessing-s3-data-securely.md similarity index 100% rename from docs/cloud/security/accessing-s3-data-securely.md rename to docs/cloud/guides/security/connectivity/accessing-s3-data-securely.md diff --git a/docs/cloud/reference/09_security/_category_.json b/docs/cloud/reference/09_security/_category_.json new file mode 100644 index 00000000000..aed26fa7f7a --- /dev/null +++ b/docs/cloud/reference/09_security/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Security", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/reference/09_security/privacy_and_compliance/_category_.json b/docs/cloud/reference/09_security/privacy_and_compliance/_category_.json new file mode 100644 index 00000000000..99beeb3e924 --- /dev/null +++ b/docs/cloud/reference/09_security/privacy_and_compliance/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Privacy and compliance", + "collapsible": true, + "collapsed": true, + "link": { "type": "doc", "id": "cloud/reference/security/privacy_and_compliance/index" } +} \ No newline at end of file diff --git a/docs/cloud/security/compliance-overview.md b/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md similarity index 95% rename from docs/cloud/security/compliance-overview.md rename to docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md index 4653c0f09c1..8b5be8b5766 100644 --- a/docs/cloud/security/compliance-overview.md +++ b/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md @@ -1,9 +1,3 @@ ---- -sidebar_label: 'Security and Compliance' -slug: /cloud/security/security-and-compliance -title: 'Security and Compliance' -description: 'This page describes the security and compliance measures implemented by ClickHouse Cloud to protect customer data.' ---- import BetaBadge from '@theme/badges/BetaBadge'; import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge'; diff --git a/docs/cloud/security/privacy-compliance-overview.md b/docs/cloud/reference/09_security/privacy_and_compliance/index.md similarity index 100% rename from docs/cloud/security/privacy-compliance-overview.md rename to docs/cloud/reference/09_security/privacy_and_compliance/index.md diff --git a/docs/cloud/security/personal-data-access.md b/docs/cloud/reference/09_security/privacy_and_compliance/personal-data-access.md similarity index 98% rename from docs/cloud/security/personal-data-access.md rename to docs/cloud/reference/09_security/privacy_and_compliance/personal-data-access.md index bcf4514b301..3bdc8ca3302 100644 --- a/docs/cloud/security/personal-data-access.md +++ b/docs/cloud/reference/09_security/privacy_and_compliance/personal-data-access.md @@ -1,7 +1,7 @@ --- -sidebar_label: 'Personal Data Access' +sidebar_label: 'Personal data access' slug: /cloud/security/personal-data-access -title: 'Personal Data Access' +title: 'Personal data access' description: 'As a registered user, ClickHouse allows you to view and manage your personal account data, including contact information.' --- diff --git a/docs/cloud/security/cloud-access-management/cloud-access-management.md b/docs/cloud/security/cloud-access-management/cloud-access-management.md index b0794fccf84..cfab1faad61 100644 --- a/docs/cloud/security/cloud-access-management/cloud-access-management.md +++ b/docs/cloud/security/cloud-access-management/cloud-access-management.md @@ -32,23 +32,31 @@ Users must be assigned an organization level role and may optionally be assigned | SQL console | Custom | Configure using SQL [`GRANT`](/sql-reference/statements/grant) statement; assign the role to a SQL console user by naming the role after the user | To create a custom role for a SQL console user and grant it a general role, run the following commands. The email address must match the user's email address in the console. + + + +#### Create `database_developer` and grant permissions {#create-database_developer-and-grant-permissions} + +Create the `database_developer` role and grant `SHOW`, `CREATE`, `ALTER`, and `DELETE` permissions. -1. Create the database_developer role and grant `SHOW`, `CREATE`, `ALTER`, and `DELETE` permissions. - - ```sql - CREATE ROLE OR REPLACE database_developer; - GRANT SHOW ON * TO database_developer; - GRANT CREATE ON * TO database_developer; - GRANT ALTER ON * TO database_developer; - GRANT DELETE ON * TO database_developer; - ``` - -2. Create a role for the SQL console user my.user@domain.com and assign it the database_developer role. +```sql +CREATE ROLE OR REPLACE database_developer; +GRANT SHOW ON * TO database_developer; +GRANT CREATE ON * TO database_developer; +GRANT ALTER ON * TO database_developer; +GRANT DELETE ON * TO database_developer; +``` + +#### Create SQL console user role {#create-sql-console-user-role} + +Create a role for the SQL console user my.user@domain.com and assign it the database_developer role. - ```sql - CREATE ROLE OR REPLACE `sql-console-role:my.user@domain.com`; - GRANT database_developer TO `sql-console-role:my.user@domain.com`; - ``` +```sql +CREATE ROLE OR REPLACE `sql-console-role:my.user@domain.com`; +GRANT database_developer TO `sql-console-role:my.user@domain.com`; +``` + + ### SQL console passwordless authentication {#sql-console-passwordless-authentication} SQL console users are created for each session and authenticated using X.509 certificates that are automatically rotated. The user is removed when the session is terminated. When generating access lists for audits, please navigate to the Settings tab for the service in the console and note the SQL console access in addition to the database users that exist in the database. If custom roles are configured, the user's access is listed in the role ending with the user's username. @@ -88,38 +96,46 @@ Users can use a SHA256 hash generator or code function such as `hashlib` in Pyth ### Database access listings with SQL console users {#database-access-listings-with-sql-console-users} The following process can be used to generate a complete access listing across the SQL console and databases in your organization. -1. Run the following queries to get a list of all grants in the database. - - ```sql - SELECT grants.user_name, - grants.role_name, - users.name AS role_member, - grants.access_type, - grants.database, - grants.table - FROM system.grants LEFT OUTER JOIN system.role_grants ON grants.role_name = role_grants.granted_role_name - LEFT OUTER JOIN system.users ON role_grants.user_name = users.name - - UNION ALL - - SELECT grants.user_name, - grants.role_name, - role_grants.role_name AS role_member, - grants.access_type, - grants.database, - grants.table - FROM system.role_grants LEFT OUTER JOIN system.grants ON role_grants.granted_role_name = grants.role_name - WHERE role_grants.user_name is null; - ``` - -2. Associate this list to Console users with access to SQL console. + + +#### Get a list of all database grants {#get-a-list-of-all-database-grants} + +Run the following queries to get a list of all grants in the database. + +```sql +SELECT grants.user_name, +grants.role_name, +users.name AS role_member, +grants.access_type, +grants.database, +grants.table +FROM system.grants LEFT OUTER JOIN system.role_grants ON grants.role_name = role_grants.granted_role_name +LEFT OUTER JOIN system.users ON role_grants.user_name = users.name + +UNION ALL + +SELECT grants.user_name, +grants.role_name, +role_grants.role_name AS role_member, +grants.access_type, +grants.database, +grants.table +FROM system.role_grants LEFT OUTER JOIN system.grants ON role_grants.granted_role_name = grants.role_name +WHERE role_grants.user_name is null; +``` + +#### Associate grant list to Console users with access to SQL console {#associate-grant-list-to-console-users-with-access-to-sql-console} + +Associate this list with Console users that have access to SQL console. - a. Go to the Console. +a. Go to the Console. + +b. Select the relevant service. - b. Select the relevant service. +c. Select Settings on the left. - c. Select Settings on the left. +d. Scroll to the SQL console access section. - d. Scroll to the SQL console access section. +e. Click the link for the number of users with access to the database `There are # users with access to this service.` to see the user listing. - e. Click the link for the number of users with access to the database `There are # users with access to this service.` to see the user listing. + \ No newline at end of file diff --git a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md index 331fcabb5f5..1517c9a82fe 100644 --- a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md +++ b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md @@ -58,7 +58,6 @@ In the pull scenario, the idea is to leverage the ClickHouse JDBC Bridge to conn * Requires a ClickHouse JDBC Bridge instance which can turn into a potential scalability bottleneck - :::note Even though Redshift is based on PostgreSQL, using the ClickHouse PostgreSQL table function or table engine is not possible since ClickHouse requires PostgreSQL version 9 or above and the Redshift API is based on an earlier version (8.x). ::: @@ -67,105 +66,114 @@ Even though Redshift is based on PostgreSQL, using the ClickHouse PostgreSQL tab To use this option, you need to set up a ClickHouse JDBC Bridge. ClickHouse JDBC Bridge is a standalone Java application that handles JDBC connectivity and acts as a proxy between the ClickHouse instance and the data sources. For this tutorial, we used a pre-populated Redshift instance with a [sample database](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). + + +#### Deploy ClickHouse JDBC Bridge {#deploy-clickhouse-jdbc-bridge} -1. Deploy the ClickHouse JDBC Bridge. For more details, see our user guide on [JDBC for External Data sources](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +Deploy the ClickHouse JDBC Bridge. For more details, see our user guide on [JDBC for External Data sources](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) :::note If you are using ClickHouse Cloud, you will need to run your ClickHouse JDBC Bridge on a separate environment and connect to ClickHouse Cloud using the [remoteSecure](/sql-reference/table-functions/remote/) function ::: -2. Configure your Redshift datasource for ClickHouse JDBC Bridge. For example, `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` - - ```json - { - "redshift-server": { - "aliases": [ - "redshift" - ], - "driverUrls": [ - "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" - ], - "driverClassName": "com.amazon.redshift.jdbc.Driver", - "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", - "username": "awsuser", - "password": "", - "maximumPoolSize": 5 - } - } - ``` - -3. Once ClickHouse JDBC Bridge deployed and running, you can start querying your Redshift instance from ClickHouse - - ```sql - SELECT * - FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') - ``` - - ```response - Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 - - ┌─username─┬─firstname─┬─lastname─┐ - │ PGL08LJI │ Vladimir │ Humphrey │ - │ XDZ38RDD │ Barry │ Roy │ - │ AEB55QTM │ Reagan │ Hodge │ - │ OWY35QYB │ Tamekah │ Juarez │ - │ MSD36KVR │ Mufutau │ Watkins │ - └──────────┴───────────┴──────────┘ - - 5 rows in set. Elapsed: 0.438 sec. - ``` - - ```sql - SELECT * - FROM jdbc('redshift', 'select count(*) from sales') - ``` - - ```response - Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b - - ┌──count─┐ - │ 172456 │ - └────────┘ - - 1 rows in set. Elapsed: 0.304 sec. - ``` - - -4. In the following, we display importing data using an `INSERT INTO ... SELECT` statement - - ```sql - # TABLE CREATION with 3 columns - CREATE TABLE users_imported - ( - `username` String, - `firstname` String, - `lastname` String - ) - ENGINE = MergeTree - ORDER BY firstname - ``` - - ```response - Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 - - Ok. - - 0 rows in set. Elapsed: 0.233 sec. - ``` - - ```sql - # IMPORTING DATA - INSERT INTO users_imported (*) SELECT * - FROM jdbc('redshift', 'select username, firstname, lastname from users') - ``` - - ```response - Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 - - Ok. - - 0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) - ``` +#### Configure your Redshift datasource {#configure-your-redshift-datasource} + +Configure your Redshift datasource for ClickHouse JDBC Bridge. For example, `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` + +```json +{ + "redshift-server": { + "aliases": [ + "redshift" + ], + "driverUrls": [ + "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" + ], + "driverClassName": "com.amazon.redshift.jdbc.Driver", + "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", + "username": "awsuser", + "password": "", + "maximumPoolSize": 5 + } +} +``` + +#### Query your Redshift instance from ClickHouse {#query-your-redshift-instance-from-clickhouse} + +Once ClickHouse JDBC Bridge deployed and running, you can start querying your Redshift instance from ClickHouse + +```sql +SELECT * +FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') +``` + +```response +Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 + +┌─username─┬─firstname─┬─lastname─┐ +│ PGL08LJI │ Vladimir │ Humphrey │ +│ XDZ38RDD │ Barry │ Roy │ +│ AEB55QTM │ Reagan │ Hodge │ +│ OWY35QYB │ Tamekah │ Juarez │ +│ MSD36KVR │ Mufutau │ Watkins │ +└──────────┴───────────┴──────────┘ + +5 rows in set. Elapsed: 0.438 sec. +``` + +```sql +SELECT * +FROM jdbc('redshift', 'select count(*) from sales') +``` + +```response +Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b + +┌──count─┐ +│ 172456 │ +└────────┘ + +1 rows in set. Elapsed: 0.304 sec. +``` + +#### Import Data from Redshift to ClickHouse {#import-data-from-redshift-to-clickhouse} + +In the following, we display importing data using an `INSERT INTO ... SELECT` statement + +```sql +# TABLE CREATION with 3 columns +CREATE TABLE users_imported +( + `username` String, + `firstname` String, + `lastname` String +) +ENGINE = MergeTree +ORDER BY firstname +``` + +```response +Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 + +Ok. + +0 rows in set. Elapsed: 0.233 sec. +``` + +```sql +INSERT INTO users_imported (*) SELECT * +FROM jdbc('redshift', 'select username, firstname, lastname from users') +``` + +```response +Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 + +Ok. + +0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) +``` + + ## Pivot Data from Redshift to ClickHouse using S3 {#pivot-data-from-redshift-to-clickhouse-using-s3} @@ -186,52 +194,63 @@ In this scenario, we export data to S3 in an intermediary pivot format and, in a ### Tutorial {#tutorial-1} -1. Using Redshift's [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) feature, export the data into a an existing private S3 bucket: + + +#### Export data into an S3 bucket using UNLOAD {#export-data-into-an-s3-bucket-using-unload} + +Using Redshift's [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) feature, export the data into an existing private S3 bucket: + +UNLOAD from Redshift to S3 - UNLOAD from Redshift to S3 +It will generate part files containing the raw data in S3 - It will generate part files containing the raw data in S3 +Data in S3 - Data in S3 +#### Create the table in ClickHouse {#create-the-table-in-clickhouse} -2. Create the table in ClickHouse: +Create the table in ClickHouse: - ```sql - CREATE TABLE users - ( - username String, - firstname String, - lastname String - ) - ENGINE = MergeTree - ORDER BY username - ``` +```sql +CREATE TABLE users +( + username String, + firstname String, + lastname String +) +ENGINE = MergeTree +ORDER BY username +``` - Alternatively, ClickHouse can try to infer the table structure using `CREATE TABLE ... EMPTY AS SELECT`: +Alternatively, ClickHouse can try to infer the table structure using `CREATE TABLE ... EMPTY AS SELECT`: - ```sql - CREATE TABLE users - ENGINE = MergeTree ORDER BY username - EMPTY AS - SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') - ``` +```sql +CREATE TABLE users +ENGINE = MergeTree ORDER BY username +EMPTY AS +SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') +``` - This works especially well when the data is in a format that contains information about data types, like Parquet. +This works especially well when the data is in a format that contains information about data types, like Parquet. -3. Load the S3 files into ClickHouse using an `INSERT INTO ... SELECT` statement: - ```sql - INSERT INTO users SELECT * - FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') - ``` +#### Load S3 files into ClickHouse {#load-s3-files-into-clickhouse} - ```response - Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 +Load the S3 files into ClickHouse using an `INSERT INTO ... SELECT` statement: - Ok. +```sql +INSERT INTO users SELECT * +FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') +``` - 0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) - ``` +```response +Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 + +Ok. + +0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) +``` :::note This example used CSV as the pivot format. However, for production workloads we recommend Apache Parquet as the best option for large migrations since it comes with compression and can save some storage costs while reducing transfer times. (By default, each row group is compressed using SNAPPY). ClickHouse also leverages Parquet's column orientation to speed up data ingestion. -::: \ No newline at end of file +::: + + \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 2de00c45b3a..fa9dabfedca 100644 --- a/sidebars.js +++ b/sidebars.js @@ -250,14 +250,16 @@ const sidebars = { }, { type: "category", - label: "Best practices", + label: "Guides", collapsed: true, collapsible: true, className: "top-nav-item", - link: { type: "doc", id: "cloud/bestpractices/index" }, + link: { type: "doc", id: "cloud/guides/index" }, items: [ - "cloud/bestpractices/usagelimits", - "cloud/bestpractices/multitenancy", + { + type: "autogenerated", + dirName: "cloud/guides", + } ], }, { @@ -290,8 +292,6 @@ const sidebars = { items: [ "cloud/security/cloud-access-management/cloud-access-management", "cloud/security/cloud-access-management/cloud-authentication", - "cloud/security/saml-sso-setup", - "cloud/security/common-access-management-queries", "cloud/security/inviting-new-users", ], }, @@ -311,23 +311,11 @@ const sidebars = { "cloud/security/azure-privatelink", ], }, - "cloud/security/accessing-s3-data-securely", "cloud/security/cloud-endpoints-api", ], }, "cloud/security/cmek", "cloud/security/audit-logging", - { - type: "category", - label: "Privacy and Compliance", - collapsed: true, - collapsible: true, - link: { type: "doc", id: "cloud/security/privacy-compliance-overview" }, - items: [ - "cloud/security/compliance-overview", - "cloud/security/personal-data-access", - ], - }, ], }, { From b38f4b1213e24fdfbc62fc173e519e7899e27e5c Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 10:50:52 +0200 Subject: [PATCH 08/29] fix knowledgebase check --- docs/cloud/guides/upload-a-csv-file.md | 5 ----- knowledgebase/unable-to-access-cloud-service.mdx | 2 +- knowledgebase/upload-a-file.mdx | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 docs/cloud/guides/upload-a-csv-file.md diff --git a/docs/cloud/guides/upload-a-csv-file.md b/docs/cloud/guides/upload-a-csv-file.md deleted file mode 100644 index 1f91255792c..00000000000 --- a/docs/cloud/guides/upload-a-csv-file.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Uploading files' -slug: /cloud/migrate/upload-a-csv-file -description: 'Learn how to upload files to Cloud' ---- diff --git a/knowledgebase/unable-to-access-cloud-service.mdx b/knowledgebase/unable-to-access-cloud-service.mdx index 353fd98ce3b..46fc174e860 100644 --- a/knowledgebase/unable-to-access-cloud-service.mdx +++ b/knowledgebase/unable-to-access-cloud-service.mdx @@ -2,7 +2,7 @@ title: Tips and tricks on optimizing basic data types in ClickHouse description: "Tips and tricks on optimizing basic data types in ClickHouse" date: 2024-07-02 -tags: ['Troubleshooting'] +tags: ['Errors and Exceptions'] keywords: ['accessing cloud service'] --- diff --git a/knowledgebase/upload-a-file.mdx b/knowledgebase/upload-a-file.mdx index dc2a7e3d70f..f968d125d1c 100644 --- a/knowledgebase/upload-a-file.mdx +++ b/knowledgebase/upload-a-file.mdx @@ -2,7 +2,7 @@ title: How do I upload a file to ClickHouse Cloud? description: "Learn how to upload a file to ClickHouse Cloud to import your data" date: 2025-07-24 -tags: ['Cloud'] +tags: ['Data Ingestion'] keywords: ['Upload file', 'ClickHouse Cloud'] --- From 6882048254505edbca3b7a99b49c7d60f61c0e45 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:18:37 +0200 Subject: [PATCH 09/29] fix spelling --- .../_snippets/_security_table_of_contents.md | 2 +- .../03_data_lake_and_warehouse.md | 2 +- .../01_overview.md | 22 ++++++------- .../02_data_prep_feature_engineering.md | 2 +- .../03_sql_translation_reference.md | 6 ++-- docs/cloud/onboard/03_tune/resource_tour.md | 2 +- ...ormance_optimizations_table_of_contents.md | 32 +++++++++---------- scripts/aspell-dict-file.txt | 24 +++++++++----- scripts/aspell-ignore/en/aspell-dict.txt | 20 ++++++++++++ scripts/check-doc-aspell | 2 ++ 10 files changed, 72 insertions(+), 42 deletions(-) diff --git a/docs/cloud/_snippets/_security_table_of_contents.md b/docs/cloud/_snippets/_security_table_of_contents.md index 57bc76468ba..45aa2a68290 100644 --- a/docs/cloud/_snippets/_security_table_of_contents.md +++ b/docs/cloud/_snippets/_security_table_of_contents.md @@ -2,7 +2,7 @@ |---------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| | [Shared Responsibility Model](shared-responsibility-model.md) | Understand how security responsibilities are divided between ClickHouse Cloud and your organization for different service types. | | [Cloud Access Management](cloud-access-management/index.md) | Manage user access with authentication, single sign-on (SSO), role-based permissions, and team invitations. | -| [Connectivity](connectivity-overview.md) | Configure secure network access including IP allowlists, private networking, S3 data access, and Cloud IP address management. | +| [Connectivity](connectivity-overview.md) | Configure secure network access including IP allow-lists, private networking, S3 data access, and Cloud IP address management. | | [Enhanced Encryption](cmek.md) | Learn about default AES 256 encryption and how to enable Transparent Data Encryption (TDE) for additional data protection at rest. | | [Audit Logging](audit-logging.md) | Set up and use audit logging to track and monitor activities in your ClickHouse Cloud environment. | | [Privacy and Compliance](privacy-compliance-overview.md) | Review security certifications, compliance standards, and learn how to manage your personal information and data rights. | \ No newline at end of file diff --git a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md index 173e0de4751..acb44128b30 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md @@ -37,7 +37,7 @@ and how they interact to create a cohesive data management platform. | Component | Description | |-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Data sources** | The lakehouse's data sources include operational databases, streaming platforms, IoT devices, application logs, and external providers. | +| **Data sources** | Lakehouse data sources include operational databases, streaming platforms, IoT devices, application logs, and external providers. | | **Query engine** | Processes analytical queries against the data stored in the object storage, leveraging the metadata and optimizations provided by the table format layer. Supports SQL and potentially other query languages to analyze large volumes of data efficiently. | | **Metadata catalog** | The [data catalog](https://clickhouse.com/engineering-resources/data-catalog) acts as a central repository for metadata, storing and managing table definitions and schemas, partitioning information, and access control policies. Enables data discovery, lineage tracking, and governance across the lakehouse. | | **Table format layer** | The [table format layer](https://clickhouse.com/engineering-resources/open-table-formats) manages the logical organization of data files into tables, providing database-like features such as ACID transactions, schema enforcement and evolution, time travel capabilities, and performance optimizations like data skipping and clustering. | diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md index 3fede8379fd..77e32109dd2 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md @@ -41,26 +41,26 @@ on expensive, close-coupled storage that does not scale cost effectively. ## ClickHouse as a foundation for real-time AI/ML {#clickhouse-for-real-time-ai-ml} -ClickHouse was designed and built from the ground upto tackle data at scale in -real-time. As such it is ideally positioned for handling the requirements of +ClickHouse was designed and built from the ground up to tackle data at scale in +real-time. As such, it is ideally positioned for handling the requirements of today’s AI and ML applications. Several core features enable it to ingest, process and query datasets on the petabyte scale with real-time performance: -| Feature | Description | -|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Columnar Storage** | ClickHouse utilizes a columnar storage model. This means that data from each column of an inserted row is stored together on disk, which enables significantly more efficient compression and boosts query speed by allowing the system to read only the relevant columns required for a query, which drastically reduces disk I/O. This is particularly advantageous for analytical queries common in ML/GenAI that often involve aggregations or filtering on a subset of columns. | -| **High Performance** | ClickHouse offers for its lightning-fast query processing, capable of querying billions of rows in milliseconds. It achieves this through a fully parallelized query pipeline and vectorized query execution engine, which processes multiple rows simultaneously at the CPU level, maximizing efficiency. | -| **Scalability** | Designed for horizontal scalability, ClickHouse allows users to add more servers (nodes) to a cluster to handle increasing data volumes and query loads, distributing data and queries across them. Performance scales linearly with the addition of each new server, enabling it to easily handle petabytes of data. | -| **Real-time data ingestion** | It is built for continuous data ingestion, supporting high rates of inserts and merges (billions of rows per second, gigabytes per second) without disrupting ongoing queries or analytics. This capability is crucial for environments where data arrives in a constant stream, such as from IoT devices or application logs, ensuring that ML models are fueled with the most up-to-date information. | -| **Specialized data types & functions** | In addition to standard SQL data types, syntax and functions, ClickHouse offers a host of additional specialised data typesand functions suited for ML use cases. Some of these include Array functions which natively support vector operations, distance calculations, array manipulations; Native JSON support for efficient processing of semi-structured data common to ML feature stores; Approximate algorithms like HyperLogLog, quantiles, and sampling functions for large-scale statistical analysis or numeric indexed vectors for vector aggregation and pointwise operations. | -| **Extensive integration ecosystem** | ClickHouse's extensive integration ecosystem makes it exceptionally valuable for AI/ML applications by seamlessly connecting with every critical component of the ML toolchain—from Python/pandas and Jupyter for data science workflows, to Spark and Kafka for large-scale data processing, to Airflow for pipeline orchestration, and Grafana for model monitoring—eliminating the typical friction and data movement bottlenecks that plague multi-tool ML environments. | +| Feature | Description | +|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Columnar Storage** | ClickHouse utilizes a columnar storage model. This means that data from each column of an inserted row is stored together on disk, which enables significantly more efficient compression and boosts query speed by allowing the system to read only the relevant columns required for a query, which drastically reduces disk I/O. This is particularly advantageous for analytical queries common in ML/GenAI that often involve aggregations or filtering on a subset of columns. | +| **High Performance** | ClickHouse offers for its lightning-fast query processing, capable of querying billions of rows in milliseconds. It achieves this through a fully parallelized query pipeline and vectorized query execution engine, which processes multiple rows simultaneously at the CPU level, maximizing efficiency. | +| **Scalability** | Designed for horizontal scalability, ClickHouse allows users to add more servers (nodes) to a cluster to handle increasing data volumes and query loads, distributing data and queries across them. Performance scales linearly with the addition of each new server, enabling it to easily handle petabytes of data. | +| **Real-time data ingestion** | It is built for continuous data ingestion, supporting high rates of inserts and merges (billions of rows per second, gigabytes per second) without disrupting ongoing queries or analytics. This capability is crucial for environments where data arrives in a constant stream, such as from IoT devices or application logs, ensuring that ML models are fueled with the most up-to-date information. | +| **Specialized data types & functions** | In addition to standard SQL data types, syntax and functions, ClickHouse offers a host of additional specialised data types and functions suited for ML use cases. Some of these include Array functions which natively support vector operations, distance calculations, array manipulations; Native JSON support for efficient processing of semi-structured data common to ML feature stores; Approximate algorithms like HyperLogLog, quantiles, and sampling functions for large-scale statistical analysis or numeric indexed vectors for vector aggregation and pointwise operations. | +| **Extensive integration ecosystem** | ClickHouse's extensive integration ecosystem makes it exceptionally valuable for AI/ML applications by seamlessly connecting with every critical component of the ML toolchain—from Python/pandas and Jupyter for data science workflows, to Spark and Kafka for large-scale data processing, to Airflow for pipeline orchestration, and Grafana for model monitoring—eliminating the typical friction and data movement bottlenecks that plague multi-tool ML environments. | ## How ClickHouse helps simplify the AI/ML Data Stack {#simplify-the-ai-ml-data-stack} ClickHouse streamlines the traditionally fragmented AI/ML data infrastructure by serving as a unified platform that handles multiple data management functions within a single high-performance system. Rather than maintaining -separate specialized datastores for different ML tasks, ClickHouse provides +separate specialized data stores for different ML tasks, ClickHouse provides a consolidated foundation for analytics, machine learning workloads, and data preparation and exploration. diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md index dfe0283a179..ef3b3044b22 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md @@ -157,7 +157,7 @@ place on object storage. data stores such as Postgres and MySQL. A completely parallelization query execution engine, combined with a column-oriented storage format, allows ClickHouse to perform aggregations over PBs of data in seconds - unlike - transformations on in memory dataframes, users are not memory-bound. + transformations on in memory data frames, users are not memory-bound. Furthermore, materialized views allow data to be transformed at insert time, thus overloading compute to data load time from query time. These views can exploit the same range of analytical and statistical functions ideal for diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md index 9bb6da114d0..a5f41b52605 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -19,14 +19,14 @@ Snowflake offers the type Number for numerics. This requires the user to specify precision (total number of digits) and scale (digits to the right of the decimal place) up to a total of 38. Integer declarations are synonymous with Number, and simply define a fixed precision and scale where the range is the same. This convenience -is possible as modifying the precision (scale is 0 for ints) does not impact the +is possible as modifying the precision (scale is 0 for integers) does not impact the size of data on disk in Snowflake - the minimal required bytes are used for a numeric range at write time at a micro partition level. The scale does, however, impact storage space and is offset with compression. A `Float64` type offers a wider range of values with a loss of precision. Contrast this with ClickHouse, which offers multiple signed and unsigned -precisions for floats and ints. With these, ClickHouse users can be explicit about +precision for floats and integers. With these, ClickHouse users can be explicit about the precision required for integers to optimize storage and memory overhead. A Decimal type, equivalent to Snowflake’s Number type, also offers twice the precision and scale at 76 digits. In addition to a similar `Float64` value, @@ -102,7 +102,7 @@ for these data types. | `FixedString` | Allows a fixed length of bytes to be used, which is useful for hashes. | | `LowCardinality` | Allows any type to be dictionary encoded. Useful for when the cardinality is expected to be < 100k. | | `Enum` | Allows efficient encoding of named values in either 8 or 16-bit ranges. | -| `UUID` | For efficient storage of uuids. | +| `UUID` | For efficient storage of UUIDs. | | `Array(Float32)` | Vectors can be represented as an Array of Float32 with supported distance functions. | Finally, ClickHouse offers the unique ability to store the intermediate diff --git a/docs/cloud/onboard/03_tune/resource_tour.md b/docs/cloud/onboard/03_tune/resource_tour.md index 54dca7e8377..27faee9395b 100644 --- a/docs/cloud/onboard/03_tune/resource_tour.md +++ b/docs/cloud/onboard/03_tune/resource_tour.md @@ -23,7 +23,7 @@ Explore resource organised by the following topics: - Troubleshooting common issues (coming soon) - Production readiness checklist (coming soon) -Before diving into more specific tipics, we recommend you start with our general +Before diving into more specific topics, we recommend you start with our general ClickHouse best practice guides which cover general best practices to follow when using ClickHouse: diff --git a/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md b/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md index 9877a841c44..3cbd396bb55 100644 --- a/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md +++ b/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md @@ -1,17 +1,17 @@ -| Topic | Description | -|---------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Query optimization guide](/optimize/query-optimization) | Start here for query optimization fundamentals, covering common scenarios and performance techniques to improve query execution speed. | +| Topic | Description | +|---------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Query optimization guide](/optimize/query-optimization) | Start here for query optimization fundamentals, covering common scenarios and performance techniques to improve query execution speed. | | [Primary indexes advanced guide](/guides/best-practices/sparse-primary-indexes) | Deep dive into ClickHouse's unique sparse primary indexing system, how it differs from traditional databases, and best practices for optimal indexing strategies. | -| [Query parallelism](/optimize/query-parallelism) | Learn how ClickHouse parallelizes query execution using processing lanes and `max_threads` settings, including how to inspect and optimize parallel execution. | -| [Partitioning key](/optimize/partitioning-key) | Master partition key selection to dramatically improve query performance by enabling efficient data segment pruning and avoiding common partitioning pitfalls. | -| [Data skipping indexes](/optimize/skipping-indexes) | Apply secondary indexes strategically to skip irrelevant data blocks and accelerate filtered queries on non-primary key columns. | -| [`PREWHERE` optimization](/optimize/prewhere) | Understand how `PREWHERE` automatically reduces I/O by filtering data before reading unnecessary columns, plus how to monitor its effectiveness. | -| [Bulk inserts](/optimize/bulk-inserts) | Maximize ingestion throughput and reduce resource overhead by batching data insertions effectively. | -| [Asynchronous inserts](/optimize/asynchronous-inserts) | Improve insert performance by leveraging server-side batching to reduce client-side complexity and increase throughput for high-frequency insertions. | -| [Avoid mutations](/optimize/avoid-mutations) | Design append-only workflows that eliminate costly `UPDATE` and `DELETE` operations while maintaining data accuracy and performance. | -| [Avoid nullable columns](/optimize/avoid-nullable-columns) | Reduce storage overhead and improve query performance by using default values instead of nullable columns where possible. | -| [Avoid `OPTIMIZE FINAL`](/optimize/avoidoptimizefinal) | Understand when you should and should not use `OPTIMIZE TABLE FINAL` | -| [Analyzer](/operations/analyzer) | Leverage ClickHouse's new query analyzer to identify performance bottlenecks and optimize query execution plans for better efficiency. | -| [Query profiling](/operations/optimizing-performance/sampling-query-profiler) | Use the sampling query profiler to analyze query execution patterns, identify performance hotspots, and optimize resource usage. | -| [Query cache](/operations/query-cache) | Accelerate frequently executed `SELECT` queries by enabling and configuring ClickHouse's built-in query result caching. | -| [Testing hardware](/operations/performance-test) | Run ClickHouse performance benchmarks on any server without installation to evaluate hardware capabilities. (Not applicable to ClickHouse Cloud) | \ No newline at end of file +| [Query parallelism](/optimize/query-parallelism) | Learn how ClickHouse parallelizes query execution using processing lanes and `max_threads` settings, including how to inspect and optimize parallel execution. | +| [Partitioning key](/optimize/partitioning-key) | Master partition key selection to dramatically improve query performance by enabling efficient data segment pruning and avoiding common partitioning pitfalls. | +| [Data skipping indexes](/optimize/skipping-indexes) | Apply secondary indexes strategically to skip irrelevant data blocks and accelerate filtered queries on non-primary key columns. | +| [`PREWHERE` optimization](/optimize/prewhere) | Understand how `PREWHERE` automatically reduces I/O by filtering data before reading unnecessary columns, plus how to monitor its effectiveness. | +| [Bulk inserts](/optimize/bulk-inserts) | Maximize ingestion throughput and reduce resource overhead by batching data insertions effectively. | +| [Asynchronous inserts](/optimize/asynchronous-inserts) | Improve insert performance by leveraging server-side batching to reduce client-side complexity and increase throughput for high-frequency insertions. | +| [Avoid mutations](/optimize/avoid-mutations) | Design append-only workflows that eliminate costly `UPDATE` and `DELETE` operations while maintaining data accuracy and performance. | +| [Avoid nullable columns](/optimize/avoid-nullable-columns) | Reduce storage overhead and improve query performance by using default values instead of nullable columns where possible. | +| [Avoid `OPTIMIZE FINAL`](/optimize/avoidoptimizefinal) | Understand when you should and should not use `OPTIMIZE TABLE FINAL` | +| [Analyzer](/operations/analyzer) | Leverage ClickHouse's new query analyzer to identify performance bottlenecks and optimize query execution plans for better efficiency. | +| [Query profiling](/operations/optimizing-performance/sampling-query-profiler) | Use the sampling query profiler to analyze query execution patterns, identify performance hot spots, and optimize resource usage. | +| [Query cache](/operations/query-cache) | Accelerate frequently executed `SELECT` queries by enabling and configuring ClickHouse's built-in query result caching. | +| [Testing hardware](/operations/performance-test) | Run ClickHouse performance benchmarks on any server without installation to evaluate hardware capabilities. (Not applicable to ClickHouse Cloud) | \ No newline at end of file diff --git a/scripts/aspell-dict-file.txt b/scripts/aspell-dict-file.txt index 22113ce5f4f..b57186e13be 100644 --- a/scripts/aspell-dict-file.txt +++ b/scripts/aspell-dict-file.txt @@ -300,7 +300,7 @@ dataview --docs/integrations/data-ingestion/clickpipes/postgres/source/supabase.md-- pooler supabase ---docs/cloud/security/saml-sso-setup.md-- +--docs/cloud/guides/security/cloud_access_management/saml-sso-setup.md-- IdP IdPs Entra @@ -327,7 +327,7 @@ typings Rockset's Workspaces workspaces ---docs/cloud/security/azure-privatelink.md-- +--docs/cloud/features/04_security/connectivity/private_networking/azure-privatelink.md-- privatelink VNets guid @@ -353,13 +353,13 @@ UserIDs --docs/cloud/security/shared-responsibility-model.md-- Entra RelayState ---docs/cloud/manage/_snippets/_network_transfer_rates.md-- +--docs/cloud/reference/_snippets/_network_transfer_rates.md-- asia eastus europe germanywestcentral westus ---docs/cloud/manage/jan2025_faq/dimensions.md-- +--docs/cloud/reference/09_jan2025_faq/dimensions.md-- intra clickpipesPricingFaq --docs/cloud/manage/backups.md-- @@ -402,14 +402,14 @@ pageId rdhnsx sessionId ybtm ---docs/cloud/reference/supported-regions.md-- +--docs/cloud/reference/05_supported-regions.md-- asia australia europe Montréal northamerica JapanEast ---docs/cloud/reference/byoc.md-- +--docs/cloud/features/02_infrastructure_and_deploy/byoc.md-- Acceptor Autoscaler byoc @@ -956,7 +956,7 @@ payg bursty --docs/cloud/security/gcp-private-service-connect.md-- privatelink ---docs/cloud/security/aws-privatelink.md-- +--docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md-- dnsname nsname pecreate @@ -1000,7 +1000,7 @@ Probabilistically tunable --docs/best-practices/use_materialized_views.md-- DAGs ---docs/migrations/postgres/appendix.md-- +--docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md-- Citus --docs/integrations/data-ingestion/azure-synapse/index.md-- microsoft @@ -1093,3 +1093,11 @@ MCP's daemonset --docs/use-cases/observability/clickstack/ingesting-data/kubernetes.md-- daemonset +--docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md-- +AgentForce +DeepSeek +OpenAI's +PDFs +ReAct +ServiceNow +explorative \ No newline at end of file diff --git a/scripts/aspell-ignore/en/aspell-dict.txt b/scripts/aspell-ignore/en/aspell-dict.txt index 9c99dc35314..4195360fd28 100644 --- a/scripts/aspell-ignore/en/aspell-dict.txt +++ b/scripts/aspell-ignore/en/aspell-dict.txt @@ -2375,6 +2375,7 @@ kurtsamp lagInFrame laion lakehouse +Lakehouses lang laravel largestTriangleThreeBuckets @@ -3609,3 +3610,22 @@ znode znodes zookeeperSessionUptime zstd +Coinhall +Instacart +SingleStore +Fastly +Fong +MTTD +MTTR +O'Reilly +transformative +MLOps +chatbots +SageMaker +GWLBs +NLBs +explorative +pointwise +summarization +reusability +lakehouses \ No newline at end of file diff --git a/scripts/check-doc-aspell b/scripts/check-doc-aspell index cd7f412a9d2..bc79d14dc68 100755 --- a/scripts/check-doc-aspell +++ b/scripts/check-doc-aspell @@ -131,6 +131,7 @@ IGNORE_LIST=( "${ROOT_PATH}/docs/whats-new/security-changelog.md" "${ROOT_PATH}/docs/cloud/changelogs/*" "${ROOT_PATH}/docs/whats-new/changelog/*" # ignore all changelogs + "${ROOT_PATH}/docs/cloud/reference/01_changelog/*" "${ROOT_PATH}/docs/sql-reference/*" # we ignore all files from ClickHouse/ClickHouse "${ROOT_PATH}/docs/engines/*" "${ROOT_PATH}/docs/getting-started/*" @@ -141,6 +142,7 @@ IGNORE_LIST=( "${ROOT_PATH}/docs/zh/*" "${ROOT_PATH}/docs/cloud/manage/api/*" # api files "${ROOT_PATH}/docs/index.md" + "${ROOT_PATH}/docs/about-us/beta-and-experimental-features.md" # Add more files to ignore here, e.g.: # "${ROOT_PATH}/docs/some-other-file.md" ) From bda9dc9c3eeb41d6fd77cac075d70725d96b7164 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:47:00 +0200 Subject: [PATCH 10/29] fix markdown linting --- docs/cloud/api/api-overview.md | 3 ++- .../connectivity/cloud-endpoints-api.md | 2 +- docs/cloud/onboard/01_discover/01_what_is.md | 4 ++-- .../01_discover/02_use_cases/00_overview.md | 5 ----- .../02_use_cases/01_real-time-analytics.md | 16 ++-------------- .../01_discover/02_use_cases/02_observability.md | 4 +--- .../02_data_prep_feature_engineering.md | 6 ------ .../03_agent_facing_analytics.md | 7 ------- .../04_snowflake/01_overview.md | 8 -------- .../05_elastic/01_overview.md | 3 --- .../06_redshift/01_overview.md | 12 ------------ docs/cloud/onboard/03_tune/resource_tour.md | 1 - .../cloud/reference/01_changelog/01_changelog.md | 16 ++++++++-------- .../redshift/_snippets/_migration_guide.md | 2 -- 14 files changed, 16 insertions(+), 73 deletions(-) diff --git a/docs/cloud/api/api-overview.md b/docs/cloud/api/api-overview.md index ab0484d0c5c..5e81632b5e8 100644 --- a/docs/cloud/api/api-overview.md +++ b/docs/cloud/api/api-overview.md @@ -56,7 +56,8 @@ If your organization has been migrated to one of the [new pricing plans](https:/ You will now also be able to specify the `num_replicas` field as a property of the service resource. ::: -## Terraform and OpenAPI New Pricing: Replica Settings Explained +## Terraform and OpenAPI New Pricing: Replica Settings Explained {#terraform-and-openapi-new-pricing---replica-settings-explained} + The number of replicas each service will be created with defaults to 3 for the Scale and Enterprise tiers, while it defaults to 1 for the Basic tier. For the Scale and the Enterprise tiers it is possible to adjust it by passing a `numReplicas` field in the service creation request. The value of the `numReplicas` field must be between 2 and 20 for the first service in a warehouse. Services that are created in an existing warehouse can have a number of replicas as low as 1. diff --git a/docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md b/docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md index 5716d41b091..d55ec618f67 100644 --- a/docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md +++ b/docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md @@ -1,4 +1,4 @@ -w--- +--- slug: /manage/security/cloud-endpoints-api sidebar_label: 'Cloud IP Addresses' title: 'Cloud IP Addresses' diff --git a/docs/cloud/onboard/01_discover/01_what_is.md b/docs/cloud/onboard/01_discover/01_what_is.md index 4e1e012bded..4814300e577 100644 --- a/docs/cloud/onboard/01_discover/01_what_is.md +++ b/docs/cloud/onboard/01_discover/01_what_is.md @@ -5,7 +5,7 @@ keywords: ['clickhouse cloud', 'what is clickhouse cloud', 'clickhouse cloud ove hide_title: true --- -## What is ClickHouse Cloud? +## What is ClickHouse Cloud? {#what-is-clickhouse-cloud} ClickHouse Cloud is a fully managed cloud service created by the original creators of ClickHouse, the fastest and most popular open-source columnar online analytical @@ -15,7 +15,7 @@ With Cloud, infrastructure, maintenance, scaling, and operations are taken care for you, so that you can focus on what matters most to you, which is building value for your organization and your customers faster. -## Benefits of ClickHouse Cloud +## Benefits of ClickHouse Cloud {#benefits-of-clickhouse-cloud} ClickHouse Cloud offers several major benefits over the open-source version: diff --git a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md index 24903149206..623b8fc605f 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md @@ -18,8 +18,3 @@ Broadly, the most common use cases for ClickHouse Cloud are: | [Data Lake and Warehouse](/cloud/get-started/cloud/use-cases/data_lake_and_warehouse) | As a modern data warehouse solution, ClickHouse Cloud combines native cloud storage integration with S3, GCS, and Azure Blob for cost-effective storage with schema-on-read flexibility that supports semi-structured data like JSON and nested types. The platform achieves massive compression ratios of 10:1 or better, significantly reducing storage costs, while its compute-storage separation architecture allows independent scaling and cost optimization. Users benefit from a standard SQL interface enhanced with advanced analytics functions, making it easy to query and analyze data at any scale.| | [Observability](/cloud/get-started/cloud/use-cases/observability) | ClickHouse Cloud is purpose-built for observability workloads, featuring specialized engines and functions optimized for time-series data that can ingest and query terabytes of logs, metrics, and traces with ease. Through ClickStack, ClickHouse's comprehensive observability solution, organizations can break down the traditional three silos of logs, metrics, and traces by unifying all observability data in a single platform, enabling correlated analysis and eliminating the complexity of managing separate systems. This unified approach makes it ideal for application performance monitoring, infrastructure monitoring, and security event analysis at enterprise scale, with ClickStack providing the tools and integrations needed for complete observability workflows without data silos.| | [Machine Learning and GenAI](/cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai) | ClickHouse Cloud powers modern AI applications through four key capabilities: native vector similarity search for RAG applications and embedding storage, comprehensive feature store functionality for real-time ML feature engineering and serving, specialized LLM observability for tracking model performance and usage patterns, and integrated MCP (Model Context Protocol) server support that enables AI agents and LLMs to directly query and analyze data. This unified platform eliminates the complexity of managing separate systems for vector databases, feature stores, and observability tools, providing a single solution for the entire AI/ML data pipeline with ClickHouse's signature performance and scalability.| - - - - - diff --git a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md index 96f18161229..fe1e8eada64 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md @@ -13,7 +13,7 @@ import rta_3 from '@site/static/images/cloud/onboard/discover/use_cases/3_rta.pn -## What is real-time analytics? +## What is real-time analytics? {#what-is-real-time-analytics} Real-time analytics refers to data processing that delivers insights to end users and customers as soon as the data is generated. It differs from traditional or @@ -45,7 +45,7 @@ Organizations can discover insights about their customers by aggregating and analyzing events like this. This has traditionally been done using batch analytics, and in the next section, we’ll compare batch and real-time analytics. -## Real-Time analytics vs batch analytics +## Real-Time analytics vs batch analytics {#real-time-analytics-vs-batch-analytics} The diagram below shows what a typical batch analytics system would look like from the perspective of an individual event: @@ -157,15 +157,3 @@ quickly and with a large number of concurrent users. > to 400 milliseconds or more for the other databases. It ran latest-price queries in 8 milliseconds, outpacing the > next-best performance (SingleStore) which came in at 45 milliseconds. Finally, it handled ASOF JOIN queries in > 50 milliseconds, while Snowflake took 20 minutes and Rockset timed out. - - - - - - - - - - - - diff --git a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md index e88c7f77638..7ec9034824e 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md @@ -17,8 +17,7 @@ into a comprehensive approach to understanding system behavior. However, implementing effective observability isn't straightforward - it requires understanding technical concepts and organizational challenges. - -## What is Observability? +## What is Observability? {#what-is-observability} Observability is understanding a system's internal state by examining its outputs. In software systems, this means understanding what's happening inside your @@ -228,4 +227,3 @@ implementing observability. The standard observability pipeline has evolved to provide a framework for effectively collecting, processing, and analyzing telemetry data. One of the earliest and most influential examples of this evolution comes from Twitter's experience in 2013. - diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md index ef3b3044b22..6c1678ec2bb 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md @@ -238,9 +238,3 @@ by ClickHouse: a streaming engine such as Kafka + Flink and a framework to provide compute for model training. A means of hosting models is also required. For simplicity, we assume the use of a cloud-hosted solution to these, such as Confluent and Amazon SageMaker. - - - - - - diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md index 5bb42053fe9..0cb2e68a439 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md @@ -166,10 +166,3 @@ of features aimed at providing a feature-complete AI experience. ## ClickHouse.ai {#clickhouse-ai} For more information about features coming soon to ClickHouse Cloud, see [ClickHouse.ai](https://clickhouse.com/clickhouse-ai/). - - - - - - - diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md index e2ae24feb1d..980cfed6061 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -130,7 +130,6 @@ differ in a few subtle ways: Based on public [benchmark](https://benchmark.clickhouse.com/#system=+%E2%98%81w|%EF%B8%8Fr|C%20c|nfe&type=-&machine=-ca2|gl|6ax|6ale|3al&cluster_size=-&opensource=-&tuned=+n&metric=hot&queries=-) data, ClickHouse outperforms Snowflake for real-time analytics applications in the following areas: - * **Query latency**: Snowflake queries have a higher query latency even when clustering is applied to tables to optimize performance. In our testing, Snowflake requires over twice the compute to achieve equivalent @@ -183,10 +182,3 @@ ClickHouse outperforms Snowflake for real-time analytics applications in the fol observed in our benchmark that these differences, along with lower query latencies and higher compression, result in significantly lower costs with ClickHouse. - - - - - - - diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index aa0ae3cfdcd..5b6a7476b7c 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -10,6 +10,3 @@ show_related_blogs: true # Elasticsearch to ClickHouse migration This document provides an introduction to migrating data from Elasticsearch to ClickHouse. - - - diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md index 96a780dfd79..785eba5d98a 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md @@ -55,15 +55,3 @@ replace or augment Redshift with ClickHouse for the following reasons: | **Lower query latencies** | ClickHouse achieves lower query latencies, including for varied query patterns, under high concurrency and while subjected to streaming inserts. Even when your query misses a cache, which is inevitable in interactive user-facing analytics, ClickHouse can still process it fast. | | **Higher concurrent query limits** | ClickHouse places much higher limits on concurrent queries, which is vital for real-time application experiences. In ClickHouse, self-managed as well as cloud, you can scale up your compute allocation to achieve the concurrency your application needs for each service. The level of permitted query concurrency is configurable in ClickHouse, with ClickHouse Cloud defaulting to a value of 1000. | | **Superior data compression** | ClickHouse offers superior data compression, which allows users to reduce their total storage (and thus cost) or persist more data at the same cost and derive more real-time insights from their data. See "ClickHouse vs Redshift Storage Efficiency" below. | - - - - - - - - - - - - diff --git a/docs/cloud/onboard/03_tune/resource_tour.md b/docs/cloud/onboard/03_tune/resource_tour.md index 27faee9395b..2a4a23c3e64 100644 --- a/docs/cloud/onboard/03_tune/resource_tour.md +++ b/docs/cloud/onboard/03_tune/resource_tour.md @@ -35,7 +35,6 @@ using ClickHouse: ## Scaling strategies and resource management {#scaling} - ## Monitoring {#monitoring} | Page | Description | diff --git a/docs/cloud/reference/01_changelog/01_changelog.md b/docs/cloud/reference/01_changelog/01_changelog.md index 8f67d0076de..c792b3f4f93 100644 --- a/docs/cloud/reference/01_changelog/01_changelog.md +++ b/docs/cloud/reference/01_changelog/01_changelog.md @@ -63,10 +63,10 @@ to get up and running. - New services now store database and table metadata in a central **SharedCatalog**, a new model for coordination and object lifecycles which enables: - - **Cloud-scale DDL**, even under high concurrency - - **Resilient deletion and new DDL operations** - - **Fast spin-up and wake-ups** as stateless nodes now launch with no disk dependencies - - **Stateless compute across both native and open formats**, including Iceberg and Delta Lake + - **Cloud-scale DDL**, even under high concurrency + - **Resilient deletion and new DDL operations** + - **Fast spin-up and wake-ups** as stateless nodes now launch with no disk dependencies + - **Stateless compute across both native and open formats**, including Iceberg and Delta Lake Read more about SharedCatalog in our [blog](https://clickhouse.com/blog/clickhouse-cloud-stateless-compute) @@ -767,12 +767,12 @@ This release upgrades the core database version, adds ability to set up private ### Integrations changes {#integrations-changes-4} * Kafka Connect - * Support async_insert for exactly once (disabled by default) + * Support async_insert for exactly once (disabled by default) * Golang client - * Fixed DateTime binding - * Improved batch insert performance + * Fixed DateTime binding + * Improved batch insert performance * Java client - * Fixed request compression problem + * Fixed request compression problem ### Settings changes {#settings-changes} * `use_mysql_types_in_show_columns` is no longer required. It will be automatically enabled when you connect through the MySQL interface. diff --git a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md index 1517c9a82fe..960120aa751 100644 --- a/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md +++ b/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md @@ -24,7 +24,6 @@ From the ClickHouse instance standpoint, you can either: We used Redshift as a data source in this tutorial. However, the migration approaches presented here are not exclusive to Redshift, and similar steps can be derived for any compatible data source. ::: - ## Push Data from Redshift to ClickHouse {#push-data-from-redshift-to-clickhouse} In the push scenario, the idea is to leverage a third-party tool or service (either custom code or an [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)) to send your data to your ClickHouse instance. For example, you can use a software like [Airbyte](https://www.airbyte.com/) to move data between your Redshift instance (as a source) and ClickHouse as a destination ([see our integration guide for Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)) @@ -42,7 +41,6 @@ In the push scenario, the idea is to leverage a third-party tool or service (eit * Users need to set up and maintain an ETL/ELT infrastructure. * Introduces a third-party element in the architecture which can turn into a potential scalability bottleneck. - ## Pull Data from Redshift to ClickHouse {#pull-data-from-redshift-to-clickhouse} In the pull scenario, the idea is to leverage the ClickHouse JDBC Bridge to connect to a Redshift cluster directly from a ClickHouse instance and perform `INSERT INTO ... SELECT` queries: From d5b62380982c1606333706aaeb79c4e99da4ff98 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:26:30 +0200 Subject: [PATCH 11/29] update table of contents script --- scripts/autogenerate-table-of-contents.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/autogenerate-table-of-contents.sh b/scripts/autogenerate-table-of-contents.sh index 1d614c97c56..87a6248c7c9 100644 --- a/scripts/autogenerate-table-of-contents.sh +++ b/scripts/autogenerate-table-of-contents.sh @@ -40,8 +40,8 @@ COMMANDS=( '--single-toc --dir="docs/sql-reference/aggregate-functions/reference" --md="docs/sql-reference/aggregate-functions/reference/index.md"' '--single-toc --dir="docs/sql-reference/table-functions" --md="docs/sql-reference/table-functions/index.md"' '--single-toc --dir="docs/chdb/guides" --md="docs/chdb/guides/index.md" --ignore images' - '--single-toc --dir="docs/cloud/manage/jan2025_faq" --md="docs/cloud/manage/jan2025_faq/index.md" --ignore images' - '--single-toc --dir="docs/cloud/changelogs" --md="docs/cloud/reference/release-notes-index.md"' + '--single-toc --dir="docs/cloud/reference/09_jan2025_faq" --md="docs/cloud/reference/09_jan2025_faq/index.md" --ignore images' + '--single-toc --dir="docs/cloud/reference/01_changelogs" --md="docs/cloud/reference/01_changelogs/02_release_notes/index.md"' '--single-toc --dir="docs/development" --md="docs/development/index.md" --ignore images' '--single-toc --dir="docs/getting-started/example-datasets" --md="docs/getting-started/index.md" --ignore images' '--single-toc --dir="docs/integrations/data-ingestion/clickpipes/kafka" --md="docs/integrations/data-ingestion/clickpipes/kafka/index.md" --ignore images' From 53b0fd0c27663aad13a173c9155d6d43198be3da Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:30:43 +0200 Subject: [PATCH 12/29] fix --- scripts/autogenerate-table-of-contents.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/autogenerate-table-of-contents.sh b/scripts/autogenerate-table-of-contents.sh index 87a6248c7c9..f57755a96d7 100644 --- a/scripts/autogenerate-table-of-contents.sh +++ b/scripts/autogenerate-table-of-contents.sh @@ -41,7 +41,7 @@ COMMANDS=( '--single-toc --dir="docs/sql-reference/table-functions" --md="docs/sql-reference/table-functions/index.md"' '--single-toc --dir="docs/chdb/guides" --md="docs/chdb/guides/index.md" --ignore images' '--single-toc --dir="docs/cloud/reference/09_jan2025_faq" --md="docs/cloud/reference/09_jan2025_faq/index.md" --ignore images' - '--single-toc --dir="docs/cloud/reference/01_changelogs" --md="docs/cloud/reference/01_changelogs/02_release_notes/index.md"' + '--single-toc --dir="docs/cloud/reference/01_changelog" --md="docs/cloud/reference/01_changelog/02_release_notes/index.md"' '--single-toc --dir="docs/development" --md="docs/development/index.md" --ignore images' '--single-toc --dir="docs/getting-started/example-datasets" --md="docs/getting-started/index.md" --ignore images' '--single-toc --dir="docs/integrations/data-ingestion/clickpipes/kafka" --md="docs/integrations/data-ingestion/clickpipes/kafka/index.md" --ignore images' From bb66cfc495fb40133bb13a382bc488db5ec5a98e Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:42:07 +0200 Subject: [PATCH 13/29] add stepper for KB --- docusaurus.config.en.js | 3 + docusaurus.config.jp.js | 4 ++ docusaurus.config.ru.js | 4 ++ docusaurus.config.zh.js | 4 ++ knowledgebase/upload-a-file.mdx | 118 -------------------------------- plugins/remark-custom-blocks.js | 2 +- 6 files changed, 16 insertions(+), 119 deletions(-) delete mode 100644 knowledgebase/upload-a-file.mdx diff --git a/docusaurus.config.en.js b/docusaurus.config.en.js index b930c2a57a2..0a14487a310 100644 --- a/docusaurus.config.en.js +++ b/docusaurus.config.en.js @@ -186,6 +186,9 @@ const config = { blogPath ); }, + remarkPlugins: [math, remarkCustomBlocks, glossaryTransformer], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], }, pages: { diff --git a/docusaurus.config.jp.js b/docusaurus.config.jp.js index 742e74a0c91..4efd9ee3c43 100644 --- a/docusaurus.config.jp.js +++ b/docusaurus.config.jp.js @@ -5,6 +5,7 @@ import chHeader from "./plugins/header.js"; import fixLinks from "./src/hooks/fixLinks.js"; import prismLight from "./src/utils/prismLight"; import prismDark from "./src/utils/prismDark"; +import glossaryTransformer from "./plugins/glossary-transformer.js"; const remarkCustomBlocks = require('./plugins/remark-custom-blocks'); // Helper function to skip over index.md files. @@ -154,6 +155,9 @@ const config = { blogPath ); }, + remarkPlugins: [math, remarkCustomBlocks, glossaryTransformer], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], }, theme: { customCss: [require.resolve("./src/css/custom.scss")], diff --git a/docusaurus.config.ru.js b/docusaurus.config.ru.js index 2369b02c088..ec5e39c1b72 100644 --- a/docusaurus.config.ru.js +++ b/docusaurus.config.ru.js @@ -5,6 +5,7 @@ import chHeader from "./plugins/header.js"; import fixLinks from "./src/hooks/fixLinks.js"; import prismLight from "./src/utils/prismLight"; import prismDark from "./src/utils/prismDark"; +import glossaryTransformer from "./plugins/glossary-transformer.js"; const remarkCustomBlocks = require('./plugins/remark-custom-blocks'); // Helper function to skip over index.md files. @@ -155,6 +156,9 @@ const config = { blogPath ); }, + remarkPlugins: [math, remarkCustomBlocks, glossaryTransformer], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], }, theme: { customCss: [require.resolve("./src/css/custom.scss")], diff --git a/docusaurus.config.zh.js b/docusaurus.config.zh.js index ecff04ba03a..2f9e7739cff 100644 --- a/docusaurus.config.zh.js +++ b/docusaurus.config.zh.js @@ -5,6 +5,7 @@ import chHeader from "./plugins/header.js"; import fixLinks from "./src/hooks/fixLinks.js"; import prismLight from "./src/utils/prismLight"; import prismDark from "./src/utils/prismDark"; +import glossaryTransformer from "./plugins/glossary-transformer.js"; const remarkCustomBlocks = require('./plugins/remark-custom-blocks'); // Helper function to skip over index.md files. @@ -154,6 +155,9 @@ const config = { blogPath ); }, + remarkPlugins: [math, remarkCustomBlocks, glossaryTransformer], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], }, theme: { customCss: [require.resolve("./src/css/custom.scss")], diff --git a/knowledgebase/upload-a-file.mdx b/knowledgebase/upload-a-file.mdx deleted file mode 100644 index f968d125d1c..00000000000 --- a/knowledgebase/upload-a-file.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: How do I upload a file to ClickHouse Cloud? -description: "Learn how to upload a file to ClickHouse Cloud to import your data" -date: 2025-07-24 -tags: ['Data Ingestion'] -keywords: ['Upload file', 'ClickHouse Cloud'] ---- - -import Image from '@theme/IdealImage'; -import csv_01 from '@site/static/images/cloud/migrate/csv_01.png'; -import csv_02 from '@site/static/images/cloud/migrate/csv_02.png'; -import csv_03 from '@site/static/images/cloud/migrate/csv_03.png'; -import csv_04 from '@site/static/images/cloud/migrate/csv_04.png'; -import csv_05 from '@site/static/images/cloud/migrate/csv_05.png'; -import csv_06 from '@site/static/images/cloud/migrate/csv_06.png'; -import csv_07 from '@site/static/images/cloud/migrate/csv_07.png'; -import csv_08 from '@site/static/images/cloud/migrate/csv_08.png'; -import csv_09 from '@site/static/images/cloud/migrate/csv_09.png'; -import csv_10 from '@site/static/images/cloud/migrate/csv_10.png'; - -{frontMatter.description} -{/* truncate */} - -# Upload files to Cloud - -ClickHouse Cloud provides an easy way to import your files and supports the -following formats: - -| Format | -|---------------------------------| -| `CSV` | -| `CSVWithNamesAndTypes` | -| `CSVWithNames` | -| `JSONEachRow` | -| `TabSeparated` | -| `TabSeparatedWithNames` | -| `TabSeparatedWithNamesAndTypes` | - - - -## Upload a file {#upload-file} - -From the Cloud homepage, select your service as shown below: - -upload_file_02 - -If your service is idle you will need to wake it. - -Select `Data sources` in the left hand tab as shown below: - -upload_file_03 - -Next select `Upload a file` on the right side of the data sources page: - -upload_file_04 - -A file dialogue will pop up allowing you to select the file that you wish to -use to insert data into a table on your Cloud service. - -upload_file_05 - -## Configure table {#configure-table} - -Once the file has uploaded you will be able to configure the table where you want -to insert the data to. A preview of the table with the first three rows is shown. - -upload_file_08 - -You can now select a destination table. The options are: - -- a new table -- an existing table - -
-You can specify which database you want to upload the data to, and in the case of -a new table, the name of the table that will be created. You will also be able to select the sorting key: - -upload_file_05 - -Columns read from the file are shown as `Source field`s and for each field, you -can change: -- the inferred type -- the default value -- whether to make the column [Nullable](/sql-reference/data-types/nullable) or not - -upload_file_06 - -:::note Excluding fields -You can also remove a field if you don't want to include it in the import -::: - -You can specify the type of table engine that you want to use: - -- `MergeTree` -- `ReplacingMergeTree` -- `SummingMergeTree` -- `Null` -
-You can specify a partitioning key expression and primary -key expression. - -upload_file_07 - -Click `Import to ClickHouse` (shown above) to import the data. The data import will be queued as -indicated by the `queued` status badge in the `Status` column as shown below. You can also click -`Open as query` (shown above) to open the insert query in the SQL console. The query will insert -the file which was uploaded to an S3 bucket using the `URL` table function. - -upload_file_09 - -If the job fails you will see a `failed` status badge under the `Status` column of -the `Data upload history` tab. You can click `View Details` for more information -on why the upload failed. You may need to modify the table configuration or clean -the data based on the error message for the failed insert. - -upload_file_11 - -
\ No newline at end of file diff --git a/plugins/remark-custom-blocks.js b/plugins/remark-custom-blocks.js index 5e857e05d20..6c6895fd2df 100644 --- a/plugins/remark-custom-blocks.js +++ b/plugins/remark-custom-blocks.js @@ -76,7 +76,7 @@ const plugin = (options) => { if (child.type === 'heading' && child.depth === headerLevel) { finalizeStep(); // Finalize the previous step first currentStepLabel = extractText(child.children); - currentAnchorId = child.data.hProperties.id; + currentAnchorId = child.data?.hProperties?.id || null; currentStepId = `step-${total_steps}`; // Generate step-X ID currentStepContent.push(child); // We need the header otherwise onBrokenAnchors fails } else if (currentStepLabel) { From 656e33a0159540bf3f41bfceb4197dfababf62b9 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:58:37 +0200 Subject: [PATCH 14/29] Fix frontmatter checks --- docs/cloud/onboard/01_discover/01_what_is.md | 1 + docs/cloud/onboard/01_discover/02_use_cases/00_overview.md | 1 + .../01_discover/02_use_cases/01_real-time-analytics.md | 1 + .../onboard/01_discover/02_use_cases/02_observability.md | 1 + .../01_discover/02_use_cases/03_data_lake_and_warehouse.md | 1 + .../04_machine_learning_and_genAI/01_overview.md | 1 + .../02_data_prep_feature_engineering.md | 1 + .../03_agent_facing_analytics.md | 1 + docs/cloud/onboard/03_tune/resource_tour.md | 1 + .../privacy_and_compliance/compliance-overview.md | 5 +++++ 10 files changed, 14 insertions(+) diff --git a/docs/cloud/onboard/01_discover/01_what_is.md b/docs/cloud/onboard/01_discover/01_what_is.md index 4814300e577..37a515a551f 100644 --- a/docs/cloud/onboard/01_discover/01_what_is.md +++ b/docs/cloud/onboard/01_discover/01_what_is.md @@ -1,6 +1,7 @@ --- slug: /cloud/overview title: 'Introduction' +description: 'Learn what ClickHouse Cloud is, its benefits over open-source, and key features of the fully managed analytics platform' keywords: ['clickhouse cloud', 'what is clickhouse cloud', 'clickhouse cloud overview', 'clickhouse cloud features'] hide_title: true --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md index 623b8fc605f..b32cfd37906 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/overview title: 'Building on ClickHouse Cloud' +description: 'Explore ClickHouse Cloud use cases including real-time analytics, observability, data lake & warehouse, and machine learning applications' keywords: ['use cases', 'Cloud'] sidebar_label: 'Overview' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md index fe1e8eada64..67aa054a4b0 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/01_real-time-analytics.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/real-time-analytics title: 'Real-time analytics' +description: 'Learn how to build real-time analytics applications with ClickHouse Cloud for instant insights and data-driven decision making' keywords: ['use cases', 'real-time analytics'] sidebar_label: 'Real-time analytics' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md index 7ec9034824e..97bfb5b263f 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/02_observability.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/observability title: 'Observability' +description: 'Use ClickHouse Cloud for observability, monitoring, logging, and system performance analysis in distributed applications' keywords: ['use cases', 'observability'] sidebar_label: 'Observability' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md index acb44128b30..6deabf4a0a3 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/03_data_lake_and_warehouse.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/data_lake_and_warehouse title: 'Data Lakehouse' +description: 'Build modern data lakehouse architectures with ClickHouse Cloud combining the flexibility of data lakes with database performance' keywords: ['use cases', 'data lake and warehouse'] sidebar_label: 'Data Lakehouse' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md index 77e32109dd2..9e1e56c1d6e 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/AI_ML title: 'Machine learning and generative AI' +description: 'Learn how ClickHouse Cloud powers machine learning and generative AI applications with high-performance data processing and analytics' keywords: ['use cases', 'Machine Learning', 'Generative AI'] sidebar_label: 'Overview' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md index 6c1678ec2bb..5e9caf86ea3 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/02_data_prep_feature_engineering.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/AI_ML/feature_engineering title: 'Data preparation and feature engineering' +description: 'Use ClickHouse Cloud for efficient data preparation and feature engineering in machine learning and AI workflows' keywords: ['use cases', 'Machine Learning', 'Generative AI'] sidebar_label: 'Data preparation and feature engineering' --- diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md index 0cb2e68a439..518c78c700e 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/03_agent_facing_analytics.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/use-cases/AI_ML/agent_facing_analytics title: 'Agent facing analytics' +description: 'Build agent-facing analytics systems with ClickHouse Cloud for AI agents and autonomous systems requiring real-time data access' keywords: ['use cases', 'Machine Learning', 'Generative AI', 'agent facing analytics', 'agents'] sidebar_label: 'Agent facing analytics' --- diff --git a/docs/cloud/onboard/03_tune/resource_tour.md b/docs/cloud/onboard/03_tune/resource_tour.md index 2a4a23c3e64..7df3afb3b2f 100644 --- a/docs/cloud/onboard/03_tune/resource_tour.md +++ b/docs/cloud/onboard/03_tune/resource_tour.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started/cloud/resource-tour title: 'Resource tour' +description: 'Overview of ClickHouse Cloud documentation resources for query optimization, scaling strategies, monitoring, and best practices' keywords: ['clickhouse cloud'] hide_title: true --- diff --git a/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md b/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md index 8b5be8b5766..de8b7a9b90e 100644 --- a/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md +++ b/docs/cloud/reference/09_security/privacy_and_compliance/compliance-overview.md @@ -1,3 +1,8 @@ +--- +title: 'Security and compliance reports' +slug: /cloud/security/compliance-overview +description: 'Overview of ClickHouse Cloud security and compliance certifications including SOC 2, ISO 27001, U.S. DPF, and HIPAA' +--- import BetaBadge from '@theme/badges/BetaBadge'; import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge'; From 3133d61f94eefcf1859829fb4d6360a4c8ec460d Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:09:47 +0200 Subject: [PATCH 15/29] fix build issue --- docs/cloud/onboard/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/cloud/onboard/index.md b/docs/cloud/onboard/index.md index 403ef1a094c..f5edd4cc175 100644 --- a/docs/cloud/onboard/index.md +++ b/docs/cloud/onboard/index.md @@ -1,6 +1,7 @@ --- slug: /cloud/get-started title: 'Get started with ClickHouse Cloud' +description: 'Complete guide to getting started with ClickHouse Cloud - from discovering features to deployment and optimization' hide_title: true --- From 96f1a47149a1103d159dec9a21063d38d05bd7b6 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:21:08 +0200 Subject: [PATCH 16/29] add floating page exceptions --- plugins/floating-pages-exceptions.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/floating-pages-exceptions.txt b/plugins/floating-pages-exceptions.txt index af82fab4beb..70a0b75f554 100644 --- a/plugins/floating-pages-exceptions.txt +++ b/plugins/floating-pages-exceptions.txt @@ -11,3 +11,9 @@ integrations/language-clients/java/client-v1 integrations/language-clients/java/jdbc-v1 integrations/data-ingestion/clickpipes/postgres/maintenance.md interfaces/arrowflight.md +docs/integrations/data-ingestion/clickpipes/postgres/resync.md +docs/integrations/data-ingestion/clickpipes/postgres/scaling.md +docs/integrations/data-ingestion/dbms/dynamodb/index.md +docs/integrations/data-ingestion/dbms/mysql/index.md +docs/integrations/data-ingestion/redshift/index.md +docs/integrations/migration/index.md From e2f81585d1462bbbe087fa3a630f49e5cd31ea7e Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:08:16 +0200 Subject: [PATCH 17/29] floating pages update --- plugins/floating-pages-exceptions.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/floating-pages-exceptions.txt b/plugins/floating-pages-exceptions.txt index 70a0b75f554..3f4cfbeb919 100644 --- a/plugins/floating-pages-exceptions.txt +++ b/plugins/floating-pages-exceptions.txt @@ -11,9 +11,9 @@ integrations/language-clients/java/client-v1 integrations/language-clients/java/jdbc-v1 integrations/data-ingestion/clickpipes/postgres/maintenance.md interfaces/arrowflight.md -docs/integrations/data-ingestion/clickpipes/postgres/resync.md -docs/integrations/data-ingestion/clickpipes/postgres/scaling.md -docs/integrations/data-ingestion/dbms/dynamodb/index.md -docs/integrations/data-ingestion/dbms/mysql/index.md -docs/integrations/data-ingestion/redshift/index.md -docs/integrations/migration/index.md +integrations/data-ingestion/clickpipes/postgres/resync.md +integrations/data-ingestion/clickpipes/postgres/scaling.md +integrations/data-ingestion/dbms/dynamodb/index.md +integrations/data-ingestion/dbms/mysql/index.md +integrations/data-ingestion/redshift/index.md +integrations/migration/index.md From 70aae5dd49d4a51d229911e9c6a282cc848e9d5c Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:47:32 +0200 Subject: [PATCH 18/29] update links --- .../_snippets/_security_table_of_contents.md | 12 +- docs/cloud/api/api-overview.md | 2 +- docs/cloud/api/openapi.md | 2 +- .../01_shared-responsibility-model.md | 2 +- .../private_networking/aws-privatelink.md | 2 +- .../gcp-private-service-connect.md | 2 +- .../private-link-overview.md | 6 +- .../export-backups-to-own-cloud-account.md | 2 +- docs/cloud/features/upgrades.md | 2 +- .../01_discover/02_use_cases/00_overview.md | 2 +- .../01_overview.md | 2 +- .../onboard/01_discover/04_cloud-tiers.md | 6 +- .../01_migration_guides/01_overview.md | 8 +- .../01_migration_guides/02_postgres/index.md | 2 +- .../01_migration_guide_part1.md | 2 +- .../02_migration_guide_part2.md | 2 +- .../01_migration_guides/03_bigquery/index.md | 6 +- .../04_snowflake/01_overview.md | 6 +- .../03_sql_translation_reference.md | 4 +- .../01_clickhouse-to-cloud.md | 2 +- .../04_object-storage-to-clickhouse.md | 2 +- .../reference/01_changelog/01_changelog.md | 8 +- .../01_changelog/02_release_notes/index.md | 11 + .../03_billing/01_billing_overview.md | 6 +- docs/cloud/reference/03_billing/index.md | 2 +- docs/cloud/reference/09_jan2025_faq/index.md | 10 + .../privacy_and_compliance/index.md | 2 +- docs/getting-started/index.md | 27 + .../data-ingestion/clickpipes/kafka/index.md | 7 + .../dbms/jdbc-with-clickhouse.md | 2 +- .../data-ingestion/kafka/index.md | 6 +- docs/integrations/migration/index.md | 2 +- docs/use-cases/AI_ML/MCP/index.md | 1 + .../observability/clickstack/production.md | 2 +- docs/whats-new/changelog/index.md | 1377 +++++++++++++++++ translation-architecture-diagram.md | 135 ++ 36 files changed, 1621 insertions(+), 53 deletions(-) create mode 100644 translation-architecture-diagram.md diff --git a/docs/cloud/_snippets/_security_table_of_contents.md b/docs/cloud/_snippets/_security_table_of_contents.md index 45aa2a68290..9ff837bb8a9 100644 --- a/docs/cloud/_snippets/_security_table_of_contents.md +++ b/docs/cloud/_snippets/_security_table_of_contents.md @@ -1,8 +1,8 @@ | Page | Description | |---------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| -| [Shared Responsibility Model](shared-responsibility-model.md) | Understand how security responsibilities are divided between ClickHouse Cloud and your organization for different service types. | -| [Cloud Access Management](cloud-access-management/index.md) | Manage user access with authentication, single sign-on (SSO), role-based permissions, and team invitations. | -| [Connectivity](connectivity-overview.md) | Configure secure network access including IP allow-lists, private networking, S3 data access, and Cloud IP address management. | -| [Enhanced Encryption](cmek.md) | Learn about default AES 256 encryption and how to enable Transparent Data Encryption (TDE) for additional data protection at rest. | -| [Audit Logging](audit-logging.md) | Set up and use audit logging to track and monitor activities in your ClickHouse Cloud environment. | -| [Privacy and Compliance](privacy-compliance-overview.md) | Review security certifications, compliance standards, and learn how to manage your personal information and data rights. | \ No newline at end of file +| [Shared Responsibility Model](/cloud/security/shared-responsibility-model) | Understand how security responsibilities are divided between ClickHouse Cloud and your organization for different service types. | +| [Cloud Access Management](/cloud/security/cloud-access-management) | Manage user access with authentication, single sign-on (SSO), role-based permissions, and team invitations. | +| [Connectivity](/cloud/security/connectivity) | Configure secure network access including IP allow-lists, private networking, S3 data access, and Cloud IP address management. | +| [Enhanced Encryption](/cloud/security/cmek) | Learn about default AES 256 encryption and how to enable Transparent Data Encryption (TDE) for additional data protection at rest. | +| [Audit Logging](/cloud/security/audit-logging) | Set up and use audit logging to track and monitor activities in your ClickHouse Cloud environment. | +| [Privacy and Compliance](/cloud/security/privacy-compliance-overview) | Review security certifications, compliance standards, and learn how to manage your personal information and data rights. | \ No newline at end of file diff --git a/docs/cloud/api/api-overview.md b/docs/cloud/api/api-overview.md index 5e81632b5e8..95a75a1c886 100644 --- a/docs/cloud/api/api-overview.md +++ b/docs/cloud/api/api-overview.md @@ -15,7 +15,7 @@ organizations and services on ClickHouse Cloud. Using our Cloud API, you can create and manage services, provision API keys, add or remove members in your organization, and more. -[Learn how to create your first API key and start using the ClickHouse Cloud API.](/cloud/manage/openapi.md) +[Learn how to create your first API key and start using the ClickHouse Cloud API.](/cloud/manage/openapi) ## Swagger (OpenAPI) Endpoint and UI {#swagger-openapi-endpoint-and-ui} diff --git a/docs/cloud/api/openapi.md b/docs/cloud/api/openapi.md index 919cb38cc48..6e9b0d4fad3 100644 --- a/docs/cloud/api/openapi.md +++ b/docs/cloud/api/openapi.md @@ -17,7 +17,7 @@ import Image from '@theme/IdealImage'; ClickHouse Cloud provides an API utilizing OpenAPI that allows you to programmatically manage your account and aspects of your services. :::note -This document covers the ClickHouse Cloud API. For database API endpoints, please see [Cloud Endpoints API](/cloud/get-started/query-endpoints.md) +This document covers the ClickHouse Cloud API. For database API endpoints, please see [Cloud Endpoints API](/cloud/get-started/query-endpoints) ::: 1. You can use the **API Keys** tab on the left menu to create and manage your API keys. diff --git a/docs/cloud/features/04_security/01_shared-responsibility-model.md b/docs/cloud/features/04_security/01_shared-responsibility-model.md index dbb828332eb..9ada3976aa9 100644 --- a/docs/cloud/features/04_security/01_shared-responsibility-model.md +++ b/docs/cloud/features/04_security/01_shared-responsibility-model.md @@ -104,4 +104,4 @@ The model below generally addresses ClickHouse responsibilities and shows respon | HIPAA compliance | Available | AWS, GCP | Enterprise | | PCI compliance | Available | AWS | Enterprise | - For more information on supported compliance frameworks, please review our [Security and Compliance](/cloud/security/security-and-compliance) page. + For more information on supported compliance frameworks, please review our [Security and Compliance](/cloud/security/compliance-overview) page. diff --git a/docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md b/docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md index 794b0f20638..9ebe6ac9ec6 100644 --- a/docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md +++ b/docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md @@ -374,7 +374,7 @@ jq .result.privateEndpointIds ### Connecting to a remote database {#connecting-to-a-remote-database} -Let's say you are trying to use [MySQL](../../sql-reference/table-functions/mysql.md) or [PostgreSQL](../../sql-reference/table-functions/postgresql.md) table functions in ClickHouse Cloud and connect to your database hosted in an Amazon Web Services (AWS) VPC. AWS PrivateLink cannot be used to enable this connection securely. PrivateLink is a one-way, unidirectional connection. It allows your internal network or Amazon VPC to connect securely to ClickHouse Cloud, but it does not allow ClickHouse Cloud to connect to your internal network. +Let's say you are trying to use [MySQL](/sql-reference/table-functions/mysql) or [PostgreSQL](/sql-reference/table-functions/postgresql) table functions in ClickHouse Cloud and connect to your database hosted in an Amazon Web Services (AWS) VPC. AWS PrivateLink cannot be used to enable this connection securely. PrivateLink is a one-way, unidirectional connection. It allows your internal network or Amazon VPC to connect securely to ClickHouse Cloud, but it does not allow ClickHouse Cloud to connect to your internal network. According to the [AWS PrivateLink documentation](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/aws-privatelink.html): diff --git a/docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md b/docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md index 8fcd99e06fd..cc573e09b6c 100644 --- a/docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md +++ b/docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md @@ -421,7 +421,7 @@ curl --silent --user "${KEY_ID:?}:${KEY_SECRET:?}" -X GET -H "Content-Type: appl ### Connecting to a remote database {#connecting-to-a-remote-database} -Let's say you are trying to use the [MySQL](../../sql-reference/table-functions/mysql.md) or [PostgreSQL](../../sql-reference/table-functions/postgresql.md) table functions in ClickHouse Cloud and connect to your database hosted in GCP. GCP PSC cannot be used to enable this connection securely. PSC is a one-way, unidirectional connection. It allows your internal network or GCP VPC to connect securely to ClickHouse Cloud, but it does not allow ClickHouse Cloud to connect to your internal network. +Let's say you are trying to use the [MySQL](/sql-reference/table-functions/mysql) or [PostgreSQL](/sql-reference/table-functions/postgresql) table functions in ClickHouse Cloud and connect to your database hosted in GCP. GCP PSC cannot be used to enable this connection securely. PSC is a one-way, unidirectional connection. It allows your internal network or GCP VPC to connect securely to ClickHouse Cloud, but it does not allow ClickHouse Cloud to connect to your internal network. According to the [GCP Private Service Connect documentation](https://cloud.google.com/vpc/docs/private-service-connect): diff --git a/docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md b/docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md index 183362a8e58..8d6be0c413e 100644 --- a/docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md +++ b/docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md @@ -9,6 +9,6 @@ description: 'Landing page for private link' ClickHouse Cloud provides the ability to connect your services to your cloud virtual network. Refer to the guides below for your provider: -- [AWS private Link](/cloud/security/aws-privatelink.md) -- [GCP private service connect](/cloud/security/gcp-private-service-connect.md) -- [Azure private link](/cloud/security/azure-privatelink.md) +- [AWS private Link](/manage/security/aws-privatelink) +- [GCP private service connect](/manage/security/gcp-private-service-connect) +- [Azure private link](/cloud/security/azure-privatelink) diff --git a/docs/cloud/features/backups/export-backups-to-own-cloud-account.md b/docs/cloud/features/backups/export-backups-to-own-cloud-account.md index 4cd5ea78b62..0bb2be7cda7 100644 --- a/docs/cloud/features/backups/export-backups-to-own-cloud-account.md +++ b/docs/cloud/features/backups/export-backups-to-own-cloud-account.md @@ -15,7 +15,7 @@ For details of how ClickHouse Cloud backups work, including "full" vs. "incremen Here we show examples of how to take full and incremental backups to AWS, GCP, Azure object storage as well as how to restore from the backups. :::note -Users should be aware that any usage where backups are being exported to a different region in the same cloud provider, will incur [data transfer](../network-data-transfer.mdx) charges. Currently we do not support cross cloud backups. +Users should be aware that any usage where backups are being exported to a different region in the same cloud provider, will incur [data transfer](/cloud/manage/network-data-transfer) charges. Currently we do not support cross cloud backups. ::: ## Requirements {#requirements} diff --git a/docs/cloud/features/upgrades.md b/docs/cloud/features/upgrades.md index f52cb9d8bbd..ad28955ffe6 100644 --- a/docs/cloud/features/upgrades.md +++ b/docs/cloud/features/upgrades.md @@ -15,7 +15,7 @@ import scheduled_upgrade_window from '@site/static/images/cloud/manage/scheduled # Upgrades -With ClickHouse Cloud you never have to worry about patching and upgrades. We roll out upgrades that include fixes, new features and performance improvements on a periodic basis. For the full list of what is new in ClickHouse refer to our [Cloud changelog](/cloud/reference/changelog.md). +With ClickHouse Cloud you never have to worry about patching and upgrades. We roll out upgrades that include fixes, new features and performance improvements on a periodic basis. For the full list of what is new in ClickHouse refer to our [Cloud changelog](/whats-new/cloud). :::note We are introducing a new upgrade mechanism, a concept we call "make before break" (or MBB). With this new approach, we add updated replica(s) before removing the old one(s) during the upgrade operation. This results in more seamless upgrades that are less disruptive to running workloads. diff --git a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md index b32cfd37906..53eeaeb7e99 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md @@ -18,4 +18,4 @@ Broadly, the most common use cases for ClickHouse Cloud are: | [Real-Time analytics](/cloud/get-started/cloud/use-cases/real-time-analytics) | ClickHouse Cloud excels at real-time analytics by delivering sub-second query responses on billions of rows through its columnar storage architecture and vectorized execution engine. The platform handles high-throughput data ingestion of millions of events per second while enabling direct queries on raw data without requiring pre-aggregation. Materialized Views provide real-time aggregations and pre-computed results, while approximate functions for quantiles and counts deliver instant insights perfect for interactive dashboards and real-time decision making.| | [Data Lake and Warehouse](/cloud/get-started/cloud/use-cases/data_lake_and_warehouse) | As a modern data warehouse solution, ClickHouse Cloud combines native cloud storage integration with S3, GCS, and Azure Blob for cost-effective storage with schema-on-read flexibility that supports semi-structured data like JSON and nested types. The platform achieves massive compression ratios of 10:1 or better, significantly reducing storage costs, while its compute-storage separation architecture allows independent scaling and cost optimization. Users benefit from a standard SQL interface enhanced with advanced analytics functions, making it easy to query and analyze data at any scale.| | [Observability](/cloud/get-started/cloud/use-cases/observability) | ClickHouse Cloud is purpose-built for observability workloads, featuring specialized engines and functions optimized for time-series data that can ingest and query terabytes of logs, metrics, and traces with ease. Through ClickStack, ClickHouse's comprehensive observability solution, organizations can break down the traditional three silos of logs, metrics, and traces by unifying all observability data in a single platform, enabling correlated analysis and eliminating the complexity of managing separate systems. This unified approach makes it ideal for application performance monitoring, infrastructure monitoring, and security event analysis at enterprise scale, with ClickStack providing the tools and integrations needed for complete observability workflows without data silos.| -| [Machine Learning and GenAI](/cloud/get-started/cloud/use-cases/machine_learning_and_gen_ai) | ClickHouse Cloud powers modern AI applications through four key capabilities: native vector similarity search for RAG applications and embedding storage, comprehensive feature store functionality for real-time ML feature engineering and serving, specialized LLM observability for tracking model performance and usage patterns, and integrated MCP (Model Context Protocol) server support that enables AI agents and LLMs to directly query and analyze data. This unified platform eliminates the complexity of managing separate systems for vector databases, feature stores, and observability tools, providing a single solution for the entire AI/ML data pipeline with ClickHouse's signature performance and scalability.| +| [Machine Learning and GenAI](/cloud/get-started/cloud/use-cases/AI_ML) | ClickHouse Cloud powers modern AI applications through four key capabilities: native vector similarity search for RAG applications and embedding storage, comprehensive feature store functionality for real-time ML feature engineering and serving, specialized LLM observability for tracking model performance and usage patterns, and integrated MCP (Model Context Protocol) server support that enables AI agents and LLMs to directly query and analyze data. This unified platform eliminates the complexity of managing separate systems for vector databases, feature stores, and observability tools, providing a single solution for the entire AI/ML data pipeline with ClickHouse's signature performance and scalability.| diff --git a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md index 9e1e56c1d6e..8a10c3c65c5 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/04_machine_learning_and_genAI/01_overview.md @@ -97,5 +97,5 @@ model deployment and monitoring. | Area | Description | |----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| -| [Data preparation and feature engineering](/get-started/cloud/use-cases/AI_ML/feature_engineering) | Learn how ClickHouse is used in the data preparation and feature engineering stages of the AI/ML pipeline | +| [Data preparation and feature engineering](/cloud/get-started/cloud/use-cases/AI_ML/feature_engineering) | Learn how ClickHouse is used in the data preparation and feature engineering stages of the AI/ML pipeline | | [Agent-facing analytics](/cloud/get-started/cloud/use-cases/AI_ML/agent_facing_analytics) | Learn how ClickHouse enables agentic facing analytics | diff --git a/docs/cloud/onboard/01_discover/04_cloud-tiers.md b/docs/cloud/onboard/01_discover/04_cloud-tiers.md index 244b453f8ab..d41d4ee57c9 100644 --- a/docs/cloud/onboard/01_discover/04_cloud-tiers.md +++ b/docs/cloud/onboard/01_discover/04_cloud-tiers.md @@ -172,9 +172,9 @@ Users can upgrade to the Scale or Enterprise tier to scale their services. Designed for workloads requiring enhanced SLAs (2+ replica deployments), scalability, and advanced security. - Offers support for features such as: - - [Private networking support](../security/private-link-overview.md). + - [Private networking support](/cloud/security/private-link-overview). - [Compute-compute separation](../reference/warehouses#what-is-compute-compute-separation). - - [Flexible scaling](../manage/scaling.md) options (scale up/down, in/out). + - [Flexible scaling](/cloud/manage/jan-2025-faq/scaling) options (scale up/down, in/out). ## Enterprise {#enterprise} @@ -187,7 +187,7 @@ Caters to large-scale, mission critical deployments that have stringent security - Single Sign On (SSO) - Enhanced Encryption: For AWS and GCP services. Services are encrypted by our key by default and can be rotated to their key to enable Customer Managed Encryption Keys (CMEK). - Allows Scheduled upgrades: Users can select the day of the week/time window for upgrades, both database and cloud releases. -- Offers [HIPAA](../security/compliance-overview.md/#hipaa-since-2024) Compliance. +- Offers [HIPAA](/cloud/security/compliance-overview#hipaa-since-2024) Compliance. - Exports Backups to the user's account. :::note diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/01_overview.md index 46457d3c294..3a881aa4454 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/01_overview.md @@ -25,9 +25,9 @@ description: 'Page describing the options available for migrating data into Clic There are several options for migrating data into ClickHouse Cloud, depending on where your data resides now: -- [Self-managed to Cloud](./clickhouse-to-cloud.md): use the `remoteSecure` function to transfer data -- [Another DBMS](./clickhouse-local-etl.md): use the [clickhouse-local] ETL tool along with the appropriate ClickHouse table function for your current DBMS -- [Anywhere!](./etl-tool-to-clickhouse.md): use one of the many popular ETL/ELT tools that connect to all kinds of different data sources -- [Object Storage](./object-storage-to-clickhouse.md): easily insert data from S3 into ClickHouse +- [Self-managed to Cloud](/cloud/migration/clickhouse-to-cloud): use the `remoteSecure` function to transfer data +- [Another DBMS](/cloud/migration/clickhouse-local): use the [clickhouse-local] ETL tool along with the appropriate ClickHouse table function for your current DBMS +- [Anywhere!](/cloud/migration/etl-tool-to-clickhouse): use one of the many popular ETL/ELT tools that connect to all kinds of different data sources +- [Object Storage](/integrations/migration/object-storage-to-clickhouse): easily insert data from S3 into ClickHouse In the example [Migrate from Redshift](/integrations/data-ingestion/redshift/index.md), we present three different ways to migrate data to ClickHouse. diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/index.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/index.md index e4052fd1ab9..35837f4d34c 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/index.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/index.md @@ -8,7 +8,7 @@ description: 'Landing page for the PostgreSQL migrations section' | Page | Description | |----------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Overview](./overview.md) | Introduction page for this section | +| [Overview](/migrations/postgresql/overview) | Introduction page for this section | | [Connecting to PostgreSQL](/integrations/postgresql/connecting-to-postgresql) | This page covers the following options for integrating PostgreSQL with ClickHouse: ClickPipes, PeerDB, PostgreSQL table engine, MaterializedPostgreSQL database engine. | | [Migrating data](/migrations/postgresql/dataset) | Part 1 of a guide on migrating from PostgreSQL to ClickHouse. Using a practical example, it demonstrates how to efficiently carry out the migration with a real-time replication (CDC) approach. Many of the concepts covered are also applicable to manual bulk data transfers from PostgreSQL to ClickHouse. | |[Rewriting PostgreSQL Queries](/migrations/postgresql/rewriting-queries)|Part 2 of a guide on migrating from PostgreSQL to ClickHouse. Using a practical example, it demonstrates how to efficiently carry out the migration with a real-time replication (CDC) approach. Many of the concepts covered are also applicable to manual bulk data transfers from PostgreSQL to ClickHouse.| diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md index fc97c8a76dc..a2260255e9b 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md @@ -178,4 +178,4 @@ INSERT INTO stackoverflow.posts SELECT * FROM postgresql('', 'postgres', ' > A possible method to detect UPDATE operations when using query replication is using the [`XMIN` system column](https://www.postgresql.org/docs/9.1/ddl-system-columns.html) (transaction IDs) as a watermark - a change in this column is indicative of a change and therefore can be applied to the destination table. Users employing this approach should be aware that `XMIN` values can wrap around and comparisons require a full table scan, making tracking changes more complex. -[Click here for Part 2](./rewriting-queries.md) +[Click here for Part 2](/migrations/postgresql/rewriting-queries) diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md index a77b38ed5e5..8866fb91cd9 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md @@ -270,4 +270,4 @@ LIMIT 5; Time: 116750.131 ms (01:56.750) ``` -[Click here for Part 3](./data-modeling-techniques.md) +[Click here for Part 3](/migrations/postgresql/data-modeling-techniques) diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/index.md b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/index.md index fdb90ce1ab8..9b793545e38 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/index.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/index.md @@ -11,6 +11,6 @@ In this section of the docs, learn more about the similarities and differences b | Page | Description | |-----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------| -| [BigQuery vs ClickHouse Cloud](./equivalent-concepts.md) | The way resources are organized in ClickHouse Cloud is similar to BigQuery's resource hierarchy. We describe the specific differences in this article. | -| [Migrating from BigQuery to ClickHouse Cloud](./migrating-to-clickhouse-cloud.md) | Learn about why you might want to migrate from BigQuery to ClickHouse Cloud. | -| [Loading Data](./loading-data.md) | A guide showing you how to migrate data from BigQuery to ClickHouse. | +| [BigQuery vs ClickHouse Cloud](/migrations/bigquery/biquery-vs-clickhouse-cloud) | The way resources are organized in ClickHouse Cloud is similar to BigQuery's resource hierarchy. We describe the specific differences in this article. | +| [Migrating from BigQuery to ClickHouse Cloud](/migrations/bigquery/migrating-to-clickhouse-cloud) | Learn about why you might want to migrate from BigQuery to ClickHouse Cloud. | +| [Loading Data](/migrations/bigquery/loading-data) | A guide showing you how to migrate data from BigQuery to ClickHouse. | diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md index 980cfed6061..6139ff66887 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -145,9 +145,9 @@ ClickHouse outperforms Snowflake for real-time analytics applications in the fol node specific and not [transactionally consistent](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design), making it [better suited ](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design) to real-time analytics. Users also have granular control over its use - with the ability to control its use on a [per-query basis](/operations/settings/settings#use-query-cache), - its [precise size](/operations/settings/settings#query-cache-max-size-in-bytes), - whether a [query is cached](/operations/settings/settings#enable-writes-to-query-cache) + with the ability to control its use on a [per-query basis](/operations/settings/settings#use_query_cache), + its [precise size](/operations/settings/settings#query_cache_max_size_in_bytes), + whether a [query is cached](/operations/settings/settings#enable_writes_to_query_cache) (limits on duration or required number of executions), and whether it is only [passively used](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design#using-logs-and-settings). diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md index a5f41b52605..450a58fe32f 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -90,8 +90,8 @@ for these data types. | [`DATE`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#date) | [`Date`](/sql-reference/data-types/date), [`Date32`](/sql-reference/data-types/date32) | `DATE` in Snowflake offers a wider date range than ClickHouse e.g. min for `Date32` is `1900-01-01` and `Date` `1970-01-01`. `Date` in ClickHouse provides more cost efficient (two byte) storage. | | [`TIME(N)`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#time) | No direct equivalent but can be represented by [`DateTime`](/sql-reference/data-types/datetime) and [`DateTime64(N)`](/sql-reference/data-types/datetime64). | `DateTime64` uses the same concepts of precision. | | [`TIMESTAMP`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp) - [`TIMESTAMP_LTZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz), [`TIMESTAMP_NTZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz), [`TIMESTAMP_TZ`](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz) | [`DateTime`](/sql-reference/data-types/datetime) and [`DateTime64`](/sql-reference/data-types/datetime64) | `DateTime` and `DateTime64` can optionally have a TZ parameter defined for the column. If not present, the server's timezone is used. Additionally a `--use_client_time_zone` parameter is available for the client. | -| [`VARIANT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#variant) | [`JSON`, `Tuple`, `Nested`](/integrations/data-formats/json) | `JSON` type is experimental in ClickHouse. This type infers the column types at insert time. `Tuple`, `Nested` and `Array` can also be used to build explicitly type structures as an alternative. | -| [`OBJECT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#object) | [`Tuple`, `Map`, `JSON`](/integrations/data-formats/json) | Both `OBJECT` and `Map` are analogous to `JSON` type in ClickHouse where the keys are a `String`. ClickHouse requires the value to be consistent and strongly typed whereas Snowflake uses `VARIANT`. This means the values of different keys can be a different type. If this is required in ClickHouse, explicitly define the hierarchy using `Tuple` or rely on `JSON` type. | +| [`VARIANT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#variant) | [`JSON`, `Tuple`, `Nested`](/interfaces/formats) | `JSON` type is experimental in ClickHouse. This type infers the column types at insert time. `Tuple`, `Nested` and `Array` can also be used to build explicitly type structures as an alternative. | +| [`OBJECT`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#object) | [`Tuple`, `Map`, `JSON`](/interfaces/formats) | Both `OBJECT` and `Map` are analogous to `JSON` type in ClickHouse where the keys are a `String`. ClickHouse requires the value to be consistent and strongly typed whereas Snowflake uses `VARIANT`. This means the values of different keys can be a different type. If this is required in ClickHouse, explicitly define the hierarchy using `Tuple` or rely on `JSON` type. | | [`ARRAY`](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#array) | [`Array`](/sql-reference/data-types/array), [`Nested`](/sql-reference/data-types/nested-data-structures/nested) | `ARRAY` in Snowflake uses `VARIANT` for the elements - a super type. Conversely these are strongly typed in ClickHouse. | | [`GEOGRAPHY`](https://docs.snowflake.com/en/sql-reference/data-types-geospatial#geography-data-type) | [`Point`, `Ring`, `Polygon`, `MultiPolygon`](/sql-reference/data-types/geo) | Snowflake imposes a coordinate system (WGS 84) while ClickHouse applies at query time. | | [`GEOMETRY`](https://docs.snowflake.com/en/sql-reference/data-types-geospatial#geometry-data-type) | [`Point`, `Ring`, `Polygon`, `MultiPolygon`](/sql-reference/data-types/geo) | | | diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md b/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md index 08ffe526dd7..fed90c525c3 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md @@ -18,7 +18,7 @@ import self_managed_06 from '@site/static/images/integrations/migration/self-man Migrating Self-managed ClickHouse -This guide will show how to migrate from a self-managed ClickHouse server to ClickHouse Cloud, and also how to migrate between ClickHouse Cloud services. The [`remoteSecure`](../../sql-reference/table-functions/remote.md) function is used in `SELECT` and `INSERT` queries to allow access to remote ClickHouse servers, which makes migrating tables as simple as writing an `INSERT INTO` query with an embedded `SELECT`. +This guide will show how to migrate from a self-managed ClickHouse server to ClickHouse Cloud, and also how to migrate between ClickHouse Cloud services. The [`remoteSecure`](/sql-reference/table-functions/remote) function is used in `SELECT` and `INSERT` queries to allow access to remote ClickHouse servers, which makes migrating tables as simple as writing an `INSERT INTO` query with an embedded `SELECT`. ## Migrating from Self-managed ClickHouse to ClickHouse Cloud {#migrating-from-self-managed-clickhouse-to-clickhouse-cloud} diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md b/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md index 5638fb48571..a0788a80aa0 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md @@ -20,7 +20,7 @@ table functions for migrating data stored in Cloud Object Storage into a ClickHo - [gcs](/sql-reference/table-functions/gcs) - [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) -If your current database system is not able to directly offload data into a Cloud Object Storage, you could use a [third-party ETL/ELT tool](./etl-tool-to-clickhouse.md) or [clickhouse-local](./clickhouse-local-etl.md) for moving data +If your current database system is not able to directly offload data into a Cloud Object Storage, you could use a [third-party ETL/ELT tool](/cloud/migration/etl-tool-to-clickhouse) or [clickhouse-local](/cloud/migration/clickhouse-local) for moving data from you current database system to Cloud Object Storage, in order to migrate that data in a second step into a ClickHouse Cloud table. Although this is a two steps process (offload data into a Cloud Object Storage, then load into ClickHouse), the advantage is that this diff --git a/docs/cloud/reference/01_changelog/01_changelog.md b/docs/cloud/reference/01_changelog/01_changelog.md index c792b3f4f93..b506055836c 100644 --- a/docs/cloud/reference/01_changelog/01_changelog.md +++ b/docs/cloud/reference/01_changelog/01_changelog.md @@ -29,7 +29,7 @@ import share_queries from '@site/static/images/cloud/reference/may-30-share-quer import query_endpoints from '@site/static/images/cloud/reference/may-17-query-endpoints.png'; import dashboards from '@site/static/images/cloud/reference/may-30-dashboards.png'; -In addition to this ClickHouse Cloud changelog, please see the [Cloud Compatibility](/cloud/reference/cloud-compatibility.md) page. +In addition to this ClickHouse Cloud changelog, please see the [Cloud Compatibility](/whats-new/cloud-compatibility) page. ## August 8, 2025 {#august-08-2025} @@ -272,7 +272,7 @@ Safe managed upgrades deliver significant value to our users by allowing them to ### HIPAA support {#hipaa-support} -We now support HIPAA in compliant regions, including AWS `us-east-1`, `us-west-2` and GCP `us-central1`, `us-east1`. Customers wishing to onboard must sign a Business Associate Agreement (BAA) and deploy to the compliant version of the region. For more information on HIPAA, please refer to the [documentation](/cloud/security/security-and-compliance). +We now support HIPAA in compliant regions, including AWS `us-east-1`, `us-west-2` and GCP `us-central1`, `us-east1`. Customers wishing to onboard must sign a Business Associate Agreement (BAA) and deploy to the compliant version of the region. For more information on HIPAA, please refer to the [documentation](/cloud/security/compliance-overview). ### Scheduled upgrades {#scheduled-upgrades} @@ -1420,7 +1420,7 @@ This release enables dictionaries from local ClickHouse table and HTTP sources, ### General changes {#general-changes-5} - Added support for [dictionaries](/sql-reference/dictionaries/index.md) from local ClickHouse table and HTTP sources -- Introduced support for the Mumbai [region](/cloud/reference/supported-regions.md) +- Introduced support for the Mumbai [region](/cloud/reference/supported-regions) ### Console changes {#console-changes-30} @@ -1488,4 +1488,4 @@ This release significantly lowers compute consumption for small workloads, lower ClickHouse Cloud began its public Beta on October 4th, 2022. Learn more in this [blog](https://clickhouse.com/blog/clickhouse-cloud-public-beta). -The ClickHouse Cloud version is based on ClickHouse core v22.10. For a list of compatible features, refer to the [Cloud Compatibility](/cloud/reference/cloud-compatibility.md) guide. +The ClickHouse Cloud version is based on ClickHouse core v22.10. For a list of compatible features, refer to the [Cloud Compatibility](/whats-new/cloud-compatibility) guide. diff --git a/docs/cloud/reference/01_changelog/02_release_notes/index.md b/docs/cloud/reference/01_changelog/02_release_notes/index.md index c7e32f843b5..ab87960c306 100644 --- a/docs/cloud/reference/01_changelog/02_release_notes/index.md +++ b/docs/cloud/reference/01_changelog/02_release_notes/index.md @@ -10,4 +10,15 @@ description: 'Landing page for Cloud release notes' --> +| Page | Description | +|-----|-----| +| [v25.6 Changelog for Cloud](/changelogs/25.6) | Fast release changelog for v25.6 | +| [v25.4 Changelog for Cloud](/changelogs/25.4) | Fast release changelog for v25.4 | +| [v24.12 Changelog for Cloud](/changelogs/24.12) | Fast release changelog for v24.12 | +| [v24.10 Changelog for Cloud](/changelogs/24.10) | Fast release changelog for v24.10 | +| [v24.8 Changelog for Cloud](/changelogs/24.8) | Fast release changelog for v24.8 | +| [v24.6 Changelog for Cloud](/changelogs/24.6) | Fast release changelog for v24.6 | +| [v24.5 Changelog for Cloud](/changelogs/24.5) | Fast release changelog for v24.5 | +| [v24.2 Changelog](/whats-new/changelog/24.2-fast-release) | Fast release changelog for v24.2 | +| [Cloud Changelog](/whats-new/cloud) | ClickHouse Cloud changelog providing descriptions of what is new in each ClickHouse Cloud release | diff --git a/docs/cloud/reference/03_billing/01_billing_overview.md b/docs/cloud/reference/03_billing/01_billing_overview.md index 0d6993702d7..81e237cb4a4 100644 --- a/docs/cloud/reference/03_billing/01_billing_overview.md +++ b/docs/cloud/reference/03_billing/01_billing_overview.md @@ -15,7 +15,7 @@ To understand what can affect your bill, and ways that you can manage your spend :::note - Prices reflect AWS us-east-1 pricing. -- Explore applicable data transfer and ClickPipes charges [here](jan2025_faq/dimensions.md). +- Explore applicable data transfer and ClickPipes charges [here](/cloud/manage/jan-2025-faq/pricing-dimensions). ::: ### Basic: from $66.52 per month {#basic-from-6652-per-month} @@ -191,7 +191,7 @@ Storage costs are the same across tiers and vary by region and cloud service pro Storage and backups are counted towards storage costs and billed separately. All services will default to one backup, retained for a day. -Users who need additional backups can do so by configuring additional [backups](backups/overview.md) under the settings tab of the Cloud console. +Users who need additional backups can do so by configuring additional [backups](/cloud/manage/backups/overview) under the settings tab of the Cloud console. ### How do I estimate compression? {#how-do-i-estimate-compression} @@ -287,7 +287,7 @@ which are metered in the same way and billed accordingly. When creating a service in addition to an existing service, you can choose if this new service should share the same data with the existing one. -If yes, these two services now form a [warehouse](../reference/warehouses.md). +If yes, these two services now form a [warehouse](/cloud/reference/warehouses). A warehouse has the data stored in it with multiple compute services accessing this data. As the data is stored only once, you only pay for one copy of data, though multiple services are accessing it. diff --git a/docs/cloud/reference/03_billing/index.md b/docs/cloud/reference/03_billing/index.md index f940c75a034..1a47fc98417 100644 --- a/docs/cloud/reference/03_billing/index.md +++ b/docs/cloud/reference/03_billing/index.md @@ -12,4 +12,4 @@ This section of the documentation covers topics related to billing, and contains | [Overview](/cloud/marketplace/marketplace-billing) | Overview and FAQ pages for marketplace billing. | | [Payment Thresholds](/cloud/billing/payment-thresholds) | Learn more about how payment thresholds work and how to adjust them. | | [Troubleshooting Billing Issues](/manage/clickhouse-cloud-billing-compliance) | Troubleshoot common billing issues. | -| [Marketplace](/cloud/manage/) | Landing page for further marketplace related topics. | +| [Marketplace](/cloud/manage/marketplace/) | Landing page for further marketplace related topics. | diff --git a/docs/cloud/reference/09_jan2025_faq/index.md b/docs/cloud/reference/09_jan2025_faq/index.md index 840e07c06e7..e7ada80e8ed 100644 --- a/docs/cloud/reference/09_jan2025_faq/index.md +++ b/docs/cloud/reference/09_jan2025_faq/index.md @@ -12,4 +12,14 @@ in the table of contents, please edit the frontmatter of the files directly. --> +| Page | Description | +|-----|-----| +| | | +| [Backup Policy](/cloud/manage/jan-2025-faq/backup) | Backup policy in new tiers | +| [Billing](/cloud/manage/jan-2025-faq/billing) | Billing details for new pricing tiers | +| [Description of new tiers](/cloud/manage/jan-2025-faq/new-tiers) | Description of new tiers and features | +| [Migrating to new plans](/cloud/manage/jan-2025-faq/plan-migrations) | Migrating to new plans, tiers, pricing, how to decide and estimate costs | +| [New pricing dimensions](/cloud/manage/jan-2025-faq/pricing-dimensions) | Pricing dimensions for data transfer and ClickPipes | +| [Scaling](/cloud/manage/jan-2025-faq/scaling) | Scaling behavior in new pricing tiers | +| [Summary](/cloud/manage/jan-2025-faq/summary) | Summary of New ClickHouse Cloud Tiers | diff --git a/docs/cloud/reference/09_security/privacy_and_compliance/index.md b/docs/cloud/reference/09_security/privacy_and_compliance/index.md index e47d422c0a8..9b0b8594fc8 100644 --- a/docs/cloud/reference/09_security/privacy_and_compliance/index.md +++ b/docs/cloud/reference/09_security/privacy_and_compliance/index.md @@ -11,5 +11,5 @@ This section contains the following pages: | Page | Description | |----------------------------------------------------------------------------|--------------------------------------------------------------| -| [Security and Compliance](/cloud/security/security-and-compliance) | Security reports and privacy compliance of ClickHouse Cloud. | +| [Security and Compliance](/cloud/security/compliance-overview) | Security reports and privacy compliance of ClickHouse Cloud. | | [Personal Data Access](/cloud/security/personal-data-access) | Information on how to access your personal data. | diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index ca8b2ee1c18..90d6ae54ca0 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -23,4 +23,31 @@ functions in ClickHouse. The sample datasets include: by https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh --> +| Page | Description | +|-----|-----| +| [NOAA Global Historical Climatology Network](/getting-started/example-datasets/noaa) | 2.5 billion rows of climate data for the last 120 yrs | +| [Writing Queries in ClickHouse using GitHub Data](/getting-started/example-datasets/github) | Dataset containing all of the commits and changes for the ClickHouse repository | +| [Analyzing Stack Overflow data with ClickHouse](/getting-started/example-datasets/stackoverflow) | Analyzing Stack Overflow data with ClickHouse | +| [The UK property prices dataset](/getting-started/example-datasets/uk-price-paid) | Learn how to use projections to improve the performance of queries that you run frequently using the UK property dataset, which contains data about prices paid for real-estate property in England and Wales | +| [Taiwan Historical Weather Datasets](/getting-started/example-datasets/tw-weather) | 131 million rows of weather observation data for the last 128 yrs | +| [New York Taxi Data](/getting-started/example-datasets/nyc-taxi) | Data for billions of taxi and for-hire vehicle (Uber, Lyft, etc.) trips originating in New York City since 2009 | +| [Geo Data using the Cell Tower Dataset](/getting-started/example-datasets/cell-towers) | Learn how to load OpenCelliD data into ClickHouse, connect Apache Superset to ClickHouse and build a dashboard based on data | +| [Amazon Customer Review](/getting-started/example-datasets/amazon-reviews) | Over 150M customer reviews of Amazon products | +| [AMPLab Big Data Benchmark](/getting-started/example-datasets/amplab-benchmark) | A benchmark dataset used for comparing the performance of data warehousing solutions. | +| [Anonymized Web Analytics](/getting-started/example-datasets/metrica) | Dataset consisting of two tables containing anonymized web analytics data with hits and visits | +| [Brown University Benchmark](/getting-started/example-datasets/brown-benchmark) | A new analytical benchmark for machine-generated log data | +| [COVID-19 Open-Data](/getting-started/example-datasets/covid19) | COVID-19 Open-Data is a large, open-source database of COVID-19 epidemiological data and related factors like demographics, economics, and government responses | +| [Environmental Sensors Data](/getting-started/example-datasets/environmental-sensors) | Over 20 billion records of data from Sensor.Community, a contributors-driven global sensor network that creates Open Environmental Data. | +| [Foursquare places](/getting-started/example-datasets/foursquare-places) | Dataset with over 100 million records containing information about places on a map, such as shops, restaurants, parks, playgrounds, and monuments. | +| [GitHub Events Dataset](/getting-started/example-datasets/github-events) | Dataset containing all events on GitHub from 2011 to Dec 6 2020, with a size of 3.1 billion records. | +| [Laion-400M dataset](/getting-started/example-datasets/laion-400m-dataset) | Dataset containing 400 million images with English image captions | +| [New York Public Library "What's on the Menu?" Dataset](/getting-started/example-datasets/menus) | Dataset containing 1.3 million records of historical data on the menus of hotels, restaurants and cafes with the dishes along with their prices. | +| [NYPD Complaint Data](/getting-started/example-datasets/nypd_complaint_data) | Ingest and query Tab Separated Value data in 5 steps | +| [OnTime](/getting-started/example-datasets/ontime) | Dataset containing the on-time performance of airline flights | +| [Star Schema Benchmark (SSB, 2009)](/getting-started/example-datasets/star-schema) | The Star Schema Benchmark (SSB) data set and queries | +| [Terabyte Click Logs from Criteo](/getting-started/example-datasets/criteo) | A terabyte of Click Logs from Criteo | +| [TPC-DS (2012)](/getting-started/example-datasets/tpcds) | The TPC-DS benchmark data set and queries. | +| [TPC-H (1999)](/getting-started/example-datasets/tpch) | The TPC-H benchmark data set and queries. | +| [WikiStat](/getting-started/example-datasets/wikistat) | Explore the WikiStat dataset containing 0.5 trillion records. | +| [YouTube dataset of dislikes](/getting-started/example-datasets/youtube-dislikes) | A collection is dislikes of YouTube videos. | diff --git a/docs/integrations/data-ingestion/clickpipes/kafka/index.md b/docs/integrations/data-ingestion/clickpipes/kafka/index.md index 830168afc93..fd4a2833514 100644 --- a/docs/integrations/data-ingestion/clickpipes/kafka/index.md +++ b/docs/integrations/data-ingestion/clickpipes/kafka/index.md @@ -6,4 +6,11 @@ title: 'Kafka ClickPipes' --- +| Page | Description | +|-----|-----| +| [Reference](/integrations/clickpipes/kafka/reference) | Details supported formats, sources, delivery semantics, authentication and experimental features supported by Kafka ClickPipes | +| [Schema registries for Kafka ClickPipe](/integrations/clickpipes/kafka/schema-registries) | Information on schema registries for Kafka ClickPipe | +| [Creating your first Kafka ClickPipe](/integrations/clickpipes/kafka/create-your-first-kafka-clickpipe) | Step-by-step guide to creating your first Kafka ClickPipe. | +| [Kafka ClickPipes FAQ](/integrations/clickpipes/kafka/faq) | Frequently asked questions about Kafka ClickPipes | +| [Best practices](/integrations/clickpipes/kafka/best-practices) | Details best practices to follow when working with Kafka ClickPipes | \ No newline at end of file diff --git a/docs/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md b/docs/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md index 981a11bad97..8ac322ecd5d 100644 --- a/docs/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md +++ b/docs/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md @@ -17,7 +17,7 @@ import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03 # Connecting ClickHouse to external data sources with JDBC :::note -Using JDBC requires the ClickHouse JDBC bridge, so you will need to use `clickhouse-local` on a local machine to stream the data from your database to ClickHouse Cloud. Visit the [**Using clickhouse-local**](/integrations/migration/clickhouse-local-etl.md#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge) page in the **Migrate** section of the docs for details. +Using JDBC requires the ClickHouse JDBC bridge, so you will need to use `clickhouse-local` on a local machine to stream the data from your database to ClickHouse Cloud. Visit the [**Using clickhouse-local**](/cloud/migration/clickhouse-local#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge) page in the **Migrate** section of the docs for details. ::: **Overview:** The
ClickHouse JDBC Bridge in combination with the [jdbc table function](/sql-reference/table-functions/jdbc.md) or the [JDBC table engine](/engines/table-engines/integrations/jdbc.md) allows ClickHouse to access data from any external data source for which a JDBC driver is available: diff --git a/docs/integrations/data-ingestion/kafka/index.md b/docs/integrations/data-ingestion/kafka/index.md index bde0ca73608..ef85ea20227 100644 --- a/docs/integrations/data-ingestion/kafka/index.md +++ b/docs/integrations/data-ingestion/kafka/index.md @@ -37,7 +37,7 @@ This is the recommended option if you're a ClickHouse Cloud user. ClickPipes is * Optimized for ClickHouse Cloud, delivering blazing-fast performance * Horizontal and vertical scalability for high-throughput workloads * Built-in fault tolerance with configurable replicas and automatic retries -* Deployment and management via ClickHouse Cloud UI, [Open API](../../../cloud/manage/api/api-overview.md), or [Terraform](https://registry.terraform.io/providers/ClickHouse/clickhouse/3.3.3-alpha2/docs/resources/clickpipe) +* Deployment and management via ClickHouse Cloud UI, [Open API](/cloud/manage/api/api-overview), or [Terraform](https://registry.terraform.io/providers/ClickHouse/clickhouse/3.3.3-alpha2/docs/resources/clickpipe) * Enterprise-grade security with support for cloud-native authorization (IAM) and private connectivity (PrivateLink) * Supports a wide range of [data sources](/integrations/clickpipes/kafka/reference/), including Confluent Cloud, Amazon MSK, Redpanda Cloud, and Azure Event Hubs * Supports most common serialization formats (JSON, Avro, Protobuf coming soon!) @@ -100,6 +100,6 @@ To get started using the Kafka table engine, see the [reference documentation](. * **Custom code** - Custom code using Kafka and ClickHouse [client libraries](../../language-clients/index.md) may be appropriate in cases where custom processing of events is required. -[BYOC]: ../../../cloud/reference/byoc.md -[Cloud]: ../../../cloud-index.md +[BYOC]: /cloud/reference/byoc +[Cloud]: /cloud/get-started [Self-hosted]: ../../../intro.md diff --git a/docs/integrations/migration/index.md b/docs/integrations/migration/index.md index f58f3bb14f8..12819727022 100644 --- a/docs/integrations/migration/index.md +++ b/docs/integrations/migration/index.md @@ -17,4 +17,4 @@ Take a look at the pages below for further information. | [ClickHouse to ClickHouse Cloud](/cloud/migration/clickhouse-to-cloud) | This guide will show how to migrate from a self-managed ClickHouse server to ClickHouse Cloud, and also how to migrate between ClickHouse Cloud services. | | [Using a 3rd-party ETL Tool](/cloud/migration/etl-tool-to-clickhouse) | Learn more about the popular ETL and ELT tools for moving data from an external data source into ClickHouse. | | [Object Storage to ClickHouse Cloud](/integrations/migration/object-storage-to-clickhouse) | Learn how to use various table functions to import data from Cloud Object Storage into ClickHouse Cloud. | -| [Upload a CSV File](/cloud/migrate/upload-a-csv-file) | Learn how to upload data to ClickHouse Cloud using a CSV or TSV file. | +| [Upload a CSV File](/integrations/data-formats/csv-tsv) | Learn how to upload data to ClickHouse Cloud using a CSV or TSV file. | diff --git a/docs/use-cases/AI_ML/MCP/index.md b/docs/use-cases/AI_ML/MCP/index.md index 353d777de53..4e98d9531e6 100644 --- a/docs/use-cases/AI_ML/MCP/index.md +++ b/docs/use-cases/AI_ML/MCP/index.md @@ -62,6 +62,7 @@ Below are some guides showing how to use the ClickHouse MCP Server. | [How to build an OpenAI agent using ClickHouse MCP Server.](/use-cases/AI/MCP/ai-agent-libraries/openai-agents) | Learn how to build an OpenAI agent that can interact with ClickHouse MCP Server. | | [Set Up ClickHouse MCP Server with AnythingLLM and ClickHouse Cloud](/use-cases/AI/MCP/anythingllm) | This guide explains how to set up AnythingLLM with a ClickHouse MCP server using Docker. | | [Set Up ClickHouse MCP Server with Claude Desktop](/use-cases/AI/MCP/claude-desktop) | This guide explains how to set up Claude Desktop with a ClickHouse MCP server. | +| [Set Up ClickHouse MCP Server with Jan.ai](/use-cases/AI/MCP/janai) | This guide explains how to set up Jan.ai with a ClickHouse MCP server. | | [Set Up ClickHouse MCP Server with LibreChat and ClickHouse Cloud](/use-cases/AI/MCP/librechat) | This guide explains how to set up LibreChat with a ClickHouse MCP server using Docker. | | [Set Up ClickHouse MCP Server with Ollama](/use-cases/AI/MCP/ollama) | This guide explains how to set up Ollama with a ClickHouse MCP server. | | [Set Up ClickHouse MCP Server with Open WebUI and ClickHouse Cloud](/use-cases/AI/MCP/open-webui) | This guide explains how to set up Open WebUI with a ClickHouse MCP server using Docker. | diff --git a/docs/use-cases/observability/clickstack/production.md b/docs/use-cases/observability/clickstack/production.md index 4fd11eadf10..3fa9c0fe0b8 100644 --- a/docs/use-cases/observability/clickstack/production.md +++ b/docs/use-cases/observability/clickstack/production.md @@ -85,7 +85,7 @@ Additionally, we recommend enabling TLS for OTLP endpoints and creating a [dedic ## ClickHouse {#clickhouse} -For production deployments, we recommend using [ClickHouse Cloud](https://clickhouse.com/cloud), which applies industry-standard [security practices](/cloud/security) by default - including [enhanced encryption](/cloud/security/cmek), [authentication and connectivity](/cloud/security/connectivity), and [managed access controls](/cloud/security/cloud-access-management). See ["ClickHouse Cloud"](#clickhouse-cloud-production) for a step-by-step guide of using ClickHouse Cloud with best practices. +For production deployments, we recommend using [ClickHouse Cloud](https://clickhouse.com/cloud), which applies industry-standard [security practices](/cloud/security/shared-responsibility-model) by default - including [enhanced encryption](/cloud/security/cmek), [authentication and connectivity](/cloud/security/connectivity), and [managed access controls](/cloud/security/cloud-access-management). See ["ClickHouse Cloud"](#clickhouse-cloud-production) for a step-by-step guide of using ClickHouse Cloud with best practices. ### User permissions {#user-permissions} diff --git a/docs/whats-new/changelog/index.md b/docs/whats-new/changelog/index.md index 4a14fcb7dbf..228253dba36 100644 --- a/docs/whats-new/changelog/index.md +++ b/docs/whats-new/changelog/index.md @@ -7,3 +7,1380 @@ sidebar_label: '2025' title: '2025 Changelog' --- +### Table of Contents +**[ClickHouse release v25.7, 2025-07-24](#257)**
+**[ClickHouse release v25.6, 2025-06-26](#256)**
+**[ClickHouse release v25.5, 2025-05-22](#255)**
+**[ClickHouse release v25.4, 2025-04-22](#254)**
+**[ClickHouse release v25.3 LTS, 2025-03-20](#253)**
+**[ClickHouse release v25.2, 2025-02-27](#252)**
+**[ClickHouse release v25.1, 2025-01-28](#251)**
+**[Changelog for 2024](https://clickhouse.com/docs/whats-new/changelog/2024/)**
+**[Changelog for 2023](https://clickhouse.com/docs/whats-new/changelog/2023/)**
+**[Changelog for 2022](https://clickhouse.com/docs/whats-new/changelog/2022/)**
+**[Changelog for 2021](https://clickhouse.com/docs/whats-new/changelog/2021/)**
+**[Changelog for 2020](https://clickhouse.com/docs/whats-new/changelog/2020/)**
+**[Changelog for 2019](https://clickhouse.com/docs/whats-new/changelog/2019/)**
+**[Changelog for 2018](https://clickhouse.com/docs/whats-new/changelog/2018/)**
+**[Changelog for 2017](https://clickhouse.com/docs/whats-new/changelog/2017/)**
+ + +### ClickHouse release 25.7, 2025-07-24 {#257} + +#### Backward Incompatible Change +* Changes to `extractKeyValuePairs` function: introduce a new argument `unexpected_quoting_character_strategy` that controls what happens when a `quoting_character` is unexpectedly found when reading a non quoted key or value. The value can be one of: `invalid`, `accept` or `promote`. Invalid will discard the key and go back to waiting key state. Accept will treat it as part of the key. Promote will discard previous character and start parsing as a quoted key. In addition, after parsing a quoted value, only parse the next key if a pair delimiter is found. [#80657](https://github.com/ClickHouse/ClickHouse/pull/80657) ([Arthur Passos](https://github.com/arthurpassos)). +* Support zero-byte match in `countMatches` function. Users who like to retain the old behavior can enable setting `count_matches_stop_at_empty_match`. [#81676](https://github.com/ClickHouse/ClickHouse/pull/81676) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Use server-wide throttlers for local (`max_local_read_bandwidth_for_server` and `max_local_write_bandwidth_for_server`) and remote (`max_remote_read_network_bandwidth_for_server` and `max_remote_write_network_bandwidth_for_server`) when generating BACKUPs in addition to their dedicated server settings (`max_backup_bandwidth_for_server`, `max_mutations_bandwidth_for_server` and `max_merges_bandwidth_for_server`). [#81753](https://github.com/ClickHouse/ClickHouse/pull/81753) ([Sergei Trifonov](https://github.com/serxa)). +* Forbid the creation of a table without insertable columns. [#81835](https://github.com/ClickHouse/ClickHouse/pull/81835) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Parallelize cluster functions by files within archives. In previous versions, the whole archive (such as zip, tar, or 7z) was a unit of work. Added a new setting `cluster_function_process_archive_on_multiple_nodes`, by default equal to `true`. If set to `true`, increases performance of processing archives in cluster functions. Should be set to `false` for compatibility and to avoid errors during upgrade to 25.7+ if using cluster functions with archives on earlier versions. [#82355](https://github.com/ClickHouse/ClickHouse/pull/82355) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `SYSTEM RESTART REPLICAS` query led to the wakeup of tables in the Lazy database, even without access to that database, and it happened while these tables were being concurrently dropped. Note: Now `SYSTEM RESTART REPLICAS` will only restart replicas in the databases where you have permission to `SHOW TABLES`, which is natural. [#83321](https://github.com/ClickHouse/ClickHouse/pull/83321) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Added support for lightweight updates for `MergeTree`-family tables. Lightweight updates can be used by a new syntax: `UPDATE SET col1 = val1, col2 = val2, ... WHERE `. Added implementation of lightweight deletes via lightweight updates. It can be enabled by setting `lightweight_delete_mode = 'lightweight_update'`. [#82004](https://github.com/ClickHouse/ClickHouse/pull/82004) ([Anton Popov](https://github.com/CurtizJ)). +* Support complex types in Iceberg schema evolution. [#73714](https://github.com/ClickHouse/ClickHouse/pull/73714) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Introduce support for INSERTs into Iceberg tables. [#82692](https://github.com/ClickHouse/ClickHouse/pull/82692) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Read Iceberg data files by field ids. This improves compatibility with Iceberg: the fields can be renamed in the metadata while being mapped to the different names in the underlying Parquet files. This closes [#83065](https://github.com/ClickHouse/ClickHouse/issues/83065). [#83653](https://github.com/ClickHouse/ClickHouse/pull/83653) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Now clickhouse supports compressed `metadata.json` files for Iceberg. Fixes [#70874](https://github.com/ClickHouse/ClickHouse/issues/70874). [#81451](https://github.com/ClickHouse/ClickHouse/pull/81451) ([alesapin](https://github.com/alesapin)). +* Support `TimestampTZ` in Glue catalog. This closes [#81654](https://github.com/ClickHouse/ClickHouse/issues/81654). [#83132](https://github.com/ClickHouse/ClickHouse/pull/83132) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Add AI-powered SQL generation to ClickHouse client. Users can now generate SQL queries from natural language descriptions by prefixing their query with `??`. Supports OpenAI and Anthropic providers with automatic schema discovery. [#83314](https://github.com/ClickHouse/ClickHouse/pull/83314) ([Kaushik Iska](https://github.com/iskakaushik)). +* Add a function to write Geo types into WKB format. [#82935](https://github.com/ClickHouse/ClickHouse/pull/82935) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Introduced two new access types: `READ` and `WRITE` for sources and deprecates all previous access types related to sources. Before `GRANT S3 ON *.* TO user`, now: `GRANT READ, WRITE ON S3 TO user`. This also allows to separate `READ` and `WRITE` permissions for sources, e.g.: `GRANT READ ON * TO user`, `GRANT WRITE ON S3 TO user`. The feature is controlled by a setting `access_control_improvements.enable_read_write_grants` and disabled by default. [#73659](https://github.com/ClickHouse/ClickHouse/pull/73659) ([pufit](https://github.com/pufit)). +* NumericIndexedVector: new vector data-structure backed by bit-sliced, Roaring-bitmap compression, together with more than 20 functions for building, analysing and point-wise arithmetic. Can cut storage and speed up joins, filters and aggregations on sparse data. Implements [#70582](https://github.com/ClickHouse/ClickHouse/issues/70582) and [“Large-Scale Metric Computation in Online Controlled Experiment Platform” paper](https://arxiv.org/abs/2405.08411) by T. Xiong and Y. Wang from VLDB 2024. [#74193](https://github.com/ClickHouse/ClickHouse/pull/74193) ([FriendLey](https://github.com/FriendLey)). +* The workload setting `max_waiting_queries` is now supported. It can be used to limit the size of the query queue. If the limit is reached, all subsequent queries will be terminated with the `SERVER_OVERLOADED` error. [#81250](https://github.com/ClickHouse/ClickHouse/pull/81250) ([Oleg Doronin](https://github.com/dorooleg)). +* Add financial functions: `financialInternalRateOfReturnExtended` (`XIRR`), `financialInternalRateOfReturn` (`IRR`), `financialNetPresentValueExtended` (`XNPV`), `financialNetPresentValue` (`NPV`). [#81599](https://github.com/ClickHouse/ClickHouse/pull/81599) ([Joanna Hulboj](https://github.com/jh0x)). +* Add the geospatial functions `polygonsIntersectCartesian` and `polygonsIntersectSpherical` to check if two polygons intersect. [#81882](https://github.com/ClickHouse/ClickHouse/pull/81882) ([Paul Lamb](https://github.com/plamb)). +* Support `_part_granule_offset` virtual column in MergeTree-family tables. This column indicates the zero-based index of the granule/mark each row belongs to within its data part. This addresses [#79572](https://github.com/ClickHouse/ClickHouse/issues/79572). [#82341](https://github.com/ClickHouse/ClickHouse/pull/82341) ([Amos Bird](https://github.com/amosbird)). [#82341](https://github.com/ClickHouse/ClickHouse/pull/82341) ([Amos Bird](https://github.com/amosbird)) +* Added SQL functions `colorSRGBToOkLCH` and `colorOkLCHToSRGB` for converting colours between the sRGB and OkLCH colour spaces. [#83679](https://github.com/ClickHouse/ClickHouse/pull/83679) ([Fgrtue](https://github.com/Fgrtue)). +* Allow parameters in `CREATE USER` queries for usernames. [#81387](https://github.com/ClickHouse/ClickHouse/pull/81387) ([Diskein](https://github.com/Diskein)). +* The `system.formats` table now contains extended information about formats, such as HTTP content type, the capabilities of schema inference, etc. [#81505](https://github.com/ClickHouse/ClickHouse/pull/81505) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Experimental Feature +* Added functions `searchAny` and `searchAll` which are general purpose tools to search text indexes. [#80641](https://github.com/ClickHouse/ClickHouse/pull/80641) ([Elmi Ahmadov](https://github.com/ahmadov)). +* The text index now supports the new `split` tokenizer. [#81752](https://github.com/ClickHouse/ClickHouse/pull/81752) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Changed the default index granularity value for `text` indexes to 64. This improves the expected performance for the average test query in internal benchmarks. [#82162](https://github.com/ClickHouse/ClickHouse/pull/82162) ([Jimmy Aguilar Mena](https://github.com/Ergus)). +* The 256-bit bitmap stores the outgoing labels of a state ordered, but outgoing states are saved into disk in the order they appear in the hash table. Therefore, a label would point to a wrong next state while reading from disk. [#82783](https://github.com/ClickHouse/ClickHouse/pull/82783) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Enable zstd compression for FST tree blob in text indices. [#83093](https://github.com/ClickHouse/ClickHouse/pull/83093) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Promote vector similarity index to beta. Introduced alias setting `enable_vector_similarity_index` which must be enabled to use the vector similarity index. [#83459](https://github.com/ClickHouse/ClickHouse/pull/83459) ([Robert Schulze](https://github.com/rschu1ze)). +* Removed experimental `send_metadata` logic related to experimental zero-copy replication. It wasn't ever used and nobody supports this code. Since there were even no tests related to it, there is a high chance that it's broken long time ago. [#82508](https://github.com/ClickHouse/ClickHouse/pull/82508) ([alesapin](https://github.com/alesapin)). +* Integrate `StorageKafka2` to `system.kafka_consumers`. [#82652](https://github.com/ClickHouse/ClickHouse/pull/82652) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Estimate complex CNF/DNF, for example, `(a < 1 and a > 0) or b = 3`, by statistics. [#82663](https://github.com/ClickHouse/ClickHouse/pull/82663) ([Han Fei](https://github.com/hanfei1991)). + +#### Performance Improvement +* Introduce async logging. When logs are output to a slow device, it no longer delays queries. [#82516](https://github.com/ClickHouse/ClickHouse/pull/82516) ([Raúl Marín](https://github.com/Algunenano)). Limit the max number of entries that are hold in the queue. [#83214](https://github.com/ClickHouse/ClickHouse/pull/83214) ([Raúl Marín](https://github.com/Algunenano)). +* Parallel distributed INSERT SELECT is enabled by default in mode where INSERT SELECT executed on each shard independently, see `parallel_distributed_insert_select` setting. [#83040](https://github.com/ClickHouse/ClickHouse/pull/83040) ([Igor Nikonov](https://github.com/devcrafter)). +* When the aggregation query contains only a single `count()` function on a not-`Nullable` column, the aggregation logic is fully inlined during hash table probing. This avoids allocating and maintaining any aggregation state, significantly reducing memory usage and CPU overhead. This partially addresses [#81982](https://github.com/ClickHouse/ClickHouse/issues/81982). [#82104](https://github.com/ClickHouse/ClickHouse/pull/82104) ([Amos Bird](https://github.com/amosbird)). +* Performance of `HashJoin` optimised by removing the additional loop over hash maps in the typical case of only one key column, also `null_map` and `join_mask` checks are eliminated when they're always `true`/`false`. [#82308](https://github.com/ClickHouse/ClickHouse/pull/82308) ([Nikita Taranov](https://github.com/nickitat)). +* Trivial optimization for `-If` combinator. [#78454](https://github.com/ClickHouse/ClickHouse/pull/78454) ([李扬](https://github.com/taiyang-li)). +* Vector search queries using a vector similarity index complete with lower latency due to reduced storage reads and reduced CPU usage. [#79103](https://github.com/ClickHouse/ClickHouse/pull/79103) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Respect `merge_tree_min_{rows,bytes}_for_seek` in `filterPartsByQueryConditionCache` to align it with other methods filtering by indexes. [#80312](https://github.com/ClickHouse/ClickHouse/pull/80312) ([李扬](https://github.com/taiyang-li)). +* Make the pipeline after the `TOTALS` step multithreaded. [#80331](https://github.com/ClickHouse/ClickHouse/pull/80331) ([UnamedRus](https://github.com/UnamedRus)). +* Fix filter by key for `Redis` and `KeeperMap` storages. [#81833](https://github.com/ClickHouse/ClickHouse/pull/81833) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Add new setting `min_joined_block_size_rows` (analogous to `min_joined_block_size_bytes`; defaults to 65409) to control the minimum block size (in rows) for JOIN input and output blocks (if the join algorithm supports it). Small blocks will be squashed. [#81886](https://github.com/ClickHouse/ClickHouse/pull/81886) ([Nikita Taranov](https://github.com/nickitat)). +* `ATTACH PARTITION` no longer leads to the dropping of all caches. [#82377](https://github.com/ClickHouse/ClickHouse/pull/82377) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimize the generated plan for correlated subqueries by removing redundant JOIN operations using equivalence classes. If there are equivalent expressions for all correlated columns, `CROSS JOIN` is not produced if `query_plan_correlated_subqueries_use_substitution` setting is enabled. [#82435](https://github.com/ClickHouse/ClickHouse/pull/82435) ([Dmitry Novik](https://github.com/novikd)). +* Read only required columns in correlated subquery when it appears to be an argument of function `EXISTS`. [#82443](https://github.com/ClickHouse/ClickHouse/pull/82443) ([Dmitry Novik](https://github.com/novikd)). +* Speedup comparisons of query trees during the query analysis a bit. [#82617](https://github.com/ClickHouse/ClickHouse/pull/82617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add alignment in the Counter of ProfileEvents to reduce false sharing. [#82697](https://github.com/ClickHouse/ClickHouse/pull/82697) ([Jiebin Sun](https://github.com/jiebinn)). +* The optimizations for `null_map` and `JoinMask` from [#82308](https://github.com/ClickHouse/ClickHouse/issues/82308) were applied to the case of JOIN with multiple disjuncts. Also, the `KnownRowsHolder` data structure was optimized. [#83041](https://github.com/ClickHouse/ClickHouse/pull/83041) ([Nikita Taranov](https://github.com/nickitat)). +* Plain `std::vector` is used for join flags to avoid calculating a hash on each access to flags. [#83043](https://github.com/ClickHouse/ClickHouse/pull/83043) ([Nikita Taranov](https://github.com/nickitat)). +* Don't pre-allocate memory for result columns beforehand when `HashJoin` uses `lazy` output mode. It is suboptimal, especially when the number of matches is low. Moreover, we know the exact amount of matches after joining is done, so we can preallocate more precisely. [#83304](https://github.com/ClickHouse/ClickHouse/pull/83304) ([Nikita Taranov](https://github.com/nickitat)). +* Minimize memory copy in port headers during pipeline construction. Original [PR](https://github.com/ClickHouse/ClickHouse/pull/70105) by [heymind](https://github.com/heymind). [#83381](https://github.com/ClickHouse/ClickHouse/pull/83381) ([Raúl Marín](https://github.com/Algunenano)). +* Improve the startup of clickhouse-keeper when it uses rocksdb storage. [#83390](https://github.com/ClickHouse/ClickHouse/pull/83390) ([Antonio Andelic](https://github.com/antonio2368)). +* Avoid holding the lock while creating storage snapshot data to reduce lock contention with high concurrent load. [#83510](https://github.com/ClickHouse/ClickHouse/pull/83510) ([Duc Canh Le](https://github.com/canhld94)). +* Improved performance of the `ProtobufSingle` input format by reusing the serializer when no parsing errors occur. [#83613](https://github.com/ClickHouse/ClickHouse/pull/83613) ([Eduard Karacharov](https://github.com/korowa)). +* Improve the performance of pipeline building that speeds up short queries. [#83631](https://github.com/ClickHouse/ClickHouse/pull/83631) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize `MergeTreeReadersChain::getSampleBlock` that speeds up short queries. [#83875](https://github.com/ClickHouse/ClickHouse/pull/83875) ([Raúl Marín](https://github.com/Algunenano)). +* Speedup tables listing in data catalogs by asynchronous requests. [#81084](https://github.com/ClickHouse/ClickHouse/pull/81084) ([alesapin](https://github.com/alesapin)). +* Introduce jitter to the S3 retry mechanism when the `s3_slow_all_threads_after_network_error` configuration is enabled. [#81849](https://github.com/ClickHouse/ClickHouse/pull/81849) ([zoomxi](https://github.com/zoomxi)). + +#### Improvement +* Color parenthesis in multiple colors for better readability. [#82538](https://github.com/ClickHouse/ClickHouse/pull/82538) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Highlight metacharacters in LIKE/REGEXP patterns as you type. We already have it in `clickhouse-format` and in the echo in `clickhouse-client`, but now it is done in the command prompt as well. [#82871](https://github.com/ClickHouse/ClickHouse/pull/82871) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Highlighting in `clickhouse-format` and in the client's echo will work in the same way as the highlighting in the command line prompt. [#82874](https://github.com/ClickHouse/ClickHouse/pull/82874) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now `plain_rewritable` disks are allowed as disks for database metadata. Implement methods `moveFile` and `replaceFile` in `plain_rewritable` to support it as a database disk. [#79424](https://github.com/ClickHouse/ClickHouse/pull/79424) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Allow backups for `PostgreSQL`, `MySQL` and `DataLake` databases. A backup of such a database would only save the definition and not the data inside of it. [#79982](https://github.com/ClickHouse/ClickHouse/pull/79982) ([Nikolay Degterinsky](https://github.com/evillique)). +* Setting `allow_experimental_join_condition` marked as obsolete, because it is now always allowed. [#80566](https://github.com/ClickHouse/ClickHouse/pull/80566) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Add pressure metrics to ClickHouse async metrics. [#80779](https://github.com/ClickHouse/ClickHouse/pull/80779) ([Xander Garbett](https://github.com/Garbett1)). +* Added metrics `MarkCacheEvictedBytes`, `MarkCacheEvictedMarks`, `MarkCacheEvictedFiles` for tracking evictions from the mark cache. (issue [#60989](https://github.com/ClickHouse/ClickHouse/issues/60989)). [#80799](https://github.com/ClickHouse/ClickHouse/pull/80799) ([Shivji Kumar Jha](https://github.com/shiv4289)). +* Support writing Parquet enum as byte array as the [spec](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#enum) dictates. [#81090](https://github.com/ClickHouse/ClickHouse/pull/81090) ([Arthur Passos](https://github.com/arthurpassos)). +* An improvement for `DeltaLake` table engine: delta-kernel-rs has `ExpressionVisitor` API which is implemented in this PR and is applied to partition column expressions transform (it will replace an old deprecated within the delta-kernel-rs way, which was used before in our code). In the future this `ExpressionVisitor` will also allow to implement statistics based pruning and some delta-lake proprietary features. Additionally the purpose of this change is to support partition pruning in `DeltaLakeCluster` table engine (the result of a parsed expression - ActionsDAG - will be serialized and sent from the initiator along with the data path, because this kind of information, which is needed for pruning, is only available as meta information on data files listing, which is done by initiator only, but it has to be applied to data on each reading server). [#81136](https://github.com/ClickHouse/ClickHouse/pull/81136) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Preserve element names when deriving supertypes for named tuples. [#81345](https://github.com/ClickHouse/ClickHouse/pull/81345) ([lgbo](https://github.com/lgbo-ustc)). +* Count consumed messages manually to avoid depending on previous committed offset in StorageKafka2. [#81662](https://github.com/ClickHouse/ClickHouse/pull/81662) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Added `clickhouse-keeper-utils`, a new command-line tool for managing and analyzing ClickHouse Keeper data. The tool supports dumping state from snapshots and changelogs, analyzing changelog files, and extracting specific log ranges. [#81677](https://github.com/ClickHouse/ClickHouse/pull/81677) ([Antonio Andelic](https://github.com/antonio2368)). +* The total and per-user network throttlers are never reset, which ensures that `max_network_bandwidth_for_all_users` and `max_network_bandwidth_for_all_users` limits are never exceeded. [#81729](https://github.com/ClickHouse/ClickHouse/pull/81729) ([Sergei Trifonov](https://github.com/serxa)). +* Support writing geoparquets as output format. [#81784](https://github.com/ClickHouse/ClickHouse/pull/81784) ([Konstantin Vedernikov](https://github.com/scanhex12)). +* Forbid to start `RENAME COLUMN` alter mutation if it will rename some column that right now affected by incomplete data mutation. [#81823](https://github.com/ClickHouse/ClickHouse/pull/81823) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Header Connection is send at the end of headers. When we know is the connection should be preserved. [#81951](https://github.com/ClickHouse/ClickHouse/pull/81951) ([Sema Checherinda](https://github.com/CheSema)). +* Tune TCP servers queue (64 by default) based on listen_backlog (4096 by default). [#82045](https://github.com/ClickHouse/ClickHouse/pull/82045) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to reload `max_local_read_bandwidth_for_server` and `max_local_write_bandwidth_for_server` on fly without restart server. [#82083](https://github.com/ClickHouse/ClickHouse/pull/82083) ([Kai Zhu](https://github.com/nauu)). +* Add support for clearing all warnings from the `system.warnings` table using `TRUNCATE TABLE system.warnings`. [#82087](https://github.com/ClickHouse/ClickHouse/pull/82087) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix partition pruning with data lake cluster functions. [#82131](https://github.com/ClickHouse/ClickHouse/pull/82131) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix reading partitioned data in DeltaLakeCluster table function. In this PR cluster functions protocol version is increased, allowing to send extra info from initiator to replicas. This extra info contains delta-kernel transform expression, which is needed to parse partition columns (and some other staff in the future, like generated columns, etc). [#82132](https://github.com/ClickHouse/ClickHouse/pull/82132) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Function `reinterpret` function now supports conversion to `Array(T)` where `T` is a fixed-size data type (issue [#82621](https://github.com/ClickHouse/ClickHouse/issues/82621)). [#83399](https://github.com/ClickHouse/ClickHouse/pull/83399) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Now database Datalake throw more convenient exception. Fixes [#81211](https://github.com/ClickHouse/ClickHouse/issues/81211). [#82304](https://github.com/ClickHouse/ClickHouse/pull/82304) ([alesapin](https://github.com/alesapin)). +* Improve CROSS JOIN by returning false from `HashJoin::needUsedFlagsForPerRightTableRow`. [#82379](https://github.com/ClickHouse/ClickHouse/pull/82379) ([lgbo](https://github.com/lgbo-ustc)). +* Allow write/read map columns as Array of Tuples. [#82408](https://github.com/ClickHouse/ClickHouse/pull/82408) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* List the licenses of [Rust](https://clickhouse.com/blog/rust) crates in `system.licenses`. [#82440](https://github.com/ClickHouse/ClickHouse/pull/82440) ([Raúl Marín](https://github.com/Algunenano)). +* Macros like `{uuid}` can now be used in the `keeper_path` setting of the S3Queue table engine. [#82463](https://github.com/ClickHouse/ClickHouse/pull/82463) ([Nikolay Degterinsky](https://github.com/evillique)). +* Keeper improvement: move changelog files between disk in a background thread. Previously, moving changelog to a different disk would block Keeper globally until the move is finished. This lead to performance degradation if moving is a long operation (e.g. to S3 disk). [#82485](https://github.com/ClickHouse/ClickHouse/pull/82485) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper improvement: add new config `keeper_server.cleanup_old_and_ignore_new_acl`. If enabled, all nodes will have their ACLs cleared while ACL for new requests will be ignored. If the goal is to completely remove ACL from nodes, it's important to leave the config enabled until a new snapshot is created. [#82496](https://github.com/ClickHouse/ClickHouse/pull/82496) ([Antonio Andelic](https://github.com/antonio2368)). +* Added a new server setting `s3queue_disable_streaming` which disables streaming in tables with S3Queue table engine. This setting is changeable without server restart. [#82515](https://github.com/ClickHouse/ClickHouse/pull/82515) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Refactor dynamic resize feature of filesystem cache. Added more logs for introspection. [#82556](https://github.com/ClickHouse/ClickHouse/pull/82556) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `clickhouse-server` without a configuration file will also listen to the PostgreSQL port 9005, like with the default config. [#82633](https://github.com/ClickHouse/ClickHouse/pull/82633) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* In `ReplicatedMergeTree::executeMetadataAlter`, we get the StorageID, and without taking DDLGuard, we try to call `IDatabase::alterTable`. In between this time we could have technically exchanged the table in question with another table, so when we get the definiton we would get the wrong one. To avoid this we add a separate check for UUIDs to match when we try to call `IDatabase::alterTable`. [#82666](https://github.com/ClickHouse/ClickHouse/pull/82666) ([Nikolay Degterinsky](https://github.com/evillique)). +* When attaching a database with a read-only remote disk, manually add table UUIDs into DatabaseCatalog. [#82670](https://github.com/ClickHouse/ClickHouse/pull/82670) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Prevent user from using `nan` and `inf` with `NumericIndexedVector`. Fixes [#82239](https://github.com/ClickHouse/ClickHouse/issues/82239) and a little more. [#82681](https://github.com/ClickHouse/ClickHouse/pull/82681) ([Raufs Dunamalijevs](https://github.com/rienath)). +* Do not omit zero values in the `X-ClickHouse-Progress` and `X-ClickHouse-Summary` header formats. [#82727](https://github.com/ClickHouse/ClickHouse/pull/82727) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Keeper improvement: support specific permissions for world:anyone ACL. [#82755](https://github.com/ClickHouse/ClickHouse/pull/82755) ([Antonio Andelic](https://github.com/antonio2368)). +* Do not allow `RENAME COLUMN` or `DROP COLUMN` involving explicitly listed columns to sum in SummingMergeTree. Closes [#81836](https://github.com/ClickHouse/ClickHouse/issues/81836). [#82821](https://github.com/ClickHouse/ClickHouse/pull/82821) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the precision of conversion from `Decimal` to `Float32`. Implement conversion from `Decimal` to `BFloat16`. Closes [#82660](https://github.com/ClickHouse/ClickHouse/issues/82660). [#82823](https://github.com/ClickHouse/ClickHouse/pull/82823) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Scrollbars in the Web UI will look slightly better. [#82869](https://github.com/ClickHouse/ClickHouse/pull/82869) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `clickhouse-server` with embedded configuration will allow using the Web UI by providing an HTTP OPTIONS response. [#82870](https://github.com/ClickHouse/ClickHouse/pull/82870) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add support for specifying extra Keeper ACL for paths in config. If you want to add extra ACL for a specific path you define it in the config under `zookeeper.path_acls`. [#82898](https://github.com/ClickHouse/ClickHouse/pull/82898) ([Antonio Andelic](https://github.com/antonio2368)). +* Now mutations snapshot will be built from the visible parts snapshot. Also mutation counters used in snapshot will be recalculated from the included mutations. [#82945](https://github.com/ClickHouse/ClickHouse/pull/82945) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Adds ProfileEvent when Keeper rejects a write due to soft memory limit. [#82963](https://github.com/ClickHouse/ClickHouse/pull/82963) ([Xander Garbett](https://github.com/Garbett1)). +* Add columns `commit_time`, `commit_id` to `system.s3queue_log`. [#83016](https://github.com/ClickHouse/ClickHouse/pull/83016) ([Kseniia Sumarokova](https://github.com/kssenii)). +* In some cases, we need to have multiple dimensions to our metrics. For example, counting failed merges or mutations by error codes rather than having a single counter. Introduce `system.dimensional_metrics`, which does precisely that and adds the first dimensional metric called `failed_merges`. [#83030](https://github.com/ClickHouse/ClickHouse/pull/83030) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Consolidate unknown settings warnings in clickhouse client and log them as a summary. [#83042](https://github.com/ClickHouse/ClickHouse/pull/83042) ([Bharat Nallan](https://github.com/bharatnc)). +* Clickhouse client now reports the local port when connection error happens. [#83050](https://github.com/ClickHouse/ClickHouse/pull/83050) ([Jianfei Hu](https://github.com/incfly)). +* Slightly better error handling in `AsynchronousMetrics`. If the `/sys/block` directory exists but is not accessible, the server will start without monitoring the block devices. Closes [#79229](https://github.com/ClickHouse/ClickHouse/issues/79229). [#83115](https://github.com/ClickHouse/ClickHouse/pull/83115) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Shutdown SystemLogs after ordinary tables (and before system tables, instead of before ordinary). [#83134](https://github.com/ClickHouse/ClickHouse/pull/83134) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add logs for `S3Queue` shutdown process. [#83163](https://github.com/ClickHouse/ClickHouse/pull/83163) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Possibility to parse `Time` and `Time64` as `MM:SS`, `M:SS`, `SS`, or `S`. [#83299](https://github.com/ClickHouse/ClickHouse/pull/83299) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* When `distributed_ddl_output_mode='*_only_active'`, don't wait for new or recovered replicas that have replication lag bigger than `max_replication_lag_to_enqueue`. This should help to avoid `DDL task is not finished on some hosts` when a new replica becomes active after finishing initialization or recovery, but it accumulated huge replication log while initializing. Also, implement `SYSTEM SYNC DATABASE REPLICA STRICT` query that waits for replication log to become below `max_replication_lag_to_enqueue`. [#83302](https://github.com/ClickHouse/ClickHouse/pull/83302) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Do not output too long descriptions of expression actions in exception messages. Closes [#83164](https://github.com/ClickHouse/ClickHouse/issues/83164). [#83350](https://github.com/ClickHouse/ClickHouse/pull/83350) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to parse part's prefix and suffix and also check coverage for non constant columns. [#83377](https://github.com/ClickHouse/ClickHouse/pull/83377) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Unify parameter names in ODBC and JDBC when using named collections. [#83410](https://github.com/ClickHouse/ClickHouse/pull/83410) ([Andrey Zvonov](https://github.com/zvonand)). +* When the storage is shutting down, `getStatus` throws an `ErrorCodes::ABORTED` exception. Previously, this would fail the select query. Now we catch the `ErrorCodes::ABORTED` exceptions and intentionally ignore them instead. [#83435](https://github.com/ClickHouse/ClickHouse/pull/83435) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Add process resource metrics (such as `UserTimeMicroseconds`, `SystemTimeMicroseconds`, `RealTimeMicroseconds`) to part_log profile events for `MergeParts` entries. [#83460](https://github.com/ClickHouse/ClickHouse/pull/83460) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Enable `create_if_not_exists`, `check_not_exists`, `remove_recursive` feature flags in Keeper by default which enable new types of requests. [#83488](https://github.com/ClickHouse/ClickHouse/pull/83488) ([Antonio Andelic](https://github.com/antonio2368)). +* Shutdown S3(Azure/etc)Queue streaming before shutting down any tables on server shutdown. [#83530](https://github.com/ClickHouse/ClickHouse/pull/83530) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Enable `Date`/`Date32` as integers in `JSON` input formats. [#83597](https://github.com/ClickHouse/ClickHouse/pull/83597) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Made exception messages for certain situations for loading and adding projections easier to read. [#83728](https://github.com/ClickHouse/ClickHouse/pull/83728) ([Robert Schulze](https://github.com/rschu1ze)). +* Introduce a configuration option to skip binary checksum integrity checks for `clickhouse-server`. Resolves [#83637](https://github.com/ClickHouse/ClickHouse/issues/83637). [#83749](https://github.com/ClickHouse/ClickHouse/pull/83749) ([Rafael Roquetto](https://github.com/rafaelroquetto)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix the wrong default value for the `--reconnect` option in `clickhouse-benchmark`. It was changed by mistake in [#79465](https://github.com/ClickHouse/ClickHouse/issues/79465). [#82677](https://github.com/ClickHouse/ClickHouse/pull/82677) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of `CREATE DICTIONARY`. Closes [#82105](https://github.com/ClickHouse/ClickHouse/issues/82105). [#82829](https://github.com/ClickHouse/ClickHouse/pull/82829) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of TTL when it contains a `materialize` function. Closes [#82828](https://github.com/ClickHouse/ClickHouse/issues/82828). [#82831](https://github.com/ClickHouse/ClickHouse/pull/82831) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of EXPLAIN AST in a subquery when it contains output options such as INTO OUTFILE. Closes [#82826](https://github.com/ClickHouse/ClickHouse/issues/82826). [#82840](https://github.com/ClickHouse/ClickHouse/pull/82840) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of parenthesized expressions with aliases in the context when no aliases are allowed. Closes [#82836](https://github.com/ClickHouse/ClickHouse/issues/82836). Closes [#82837](https://github.com/ClickHouse/ClickHouse/issues/82837). [#82867](https://github.com/ClickHouse/ClickHouse/pull/82867) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use the proper error code when multiplying an aggregate function state with IPv4. Closes [#82817](https://github.com/ClickHouse/ClickHouse/issues/82817). [#82818](https://github.com/ClickHouse/ClickHouse/pull/82818) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix logical error in filesystem cache: "Having zero bytes but range is not finished". [#81868](https://github.com/ClickHouse/ClickHouse/pull/81868) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Recalculate the min-max index when TTL reduces rows to ensure the correctness of algorithms relying on it, such as `minmax_count_projection`. This resolves [#77091](https://github.com/ClickHouse/ClickHouse/issues/77091). [#77166](https://github.com/ClickHouse/ClickHouse/pull/77166) ([Amos Bird](https://github.com/amosbird)). +* For queries with combination of `ORDER BY ... LIMIT BY ... LIMIT N`, when ORDER BY is executed as a PartialSorting, the counter `rows_before_limit_at_least` now reflects the number of rows consumed by LIMIT clause instead of number of rows consumed by sorting transform. [#78999](https://github.com/ClickHouse/ClickHouse/pull/78999) ([Eduard Karacharov](https://github.com/korowa)). +* Fix excessive granule skipping for filtering over token/ngram indexes with regexp which contains alternation and non-literal first alternative. [#79373](https://github.com/ClickHouse/ClickHouse/pull/79373) ([Eduard Karacharov](https://github.com/korowa)). +* Fix logical error with `<=>` operator and Join storage, now query returns proper error code. [#80165](https://github.com/ClickHouse/ClickHouse/pull/80165) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix a crash in the `loop` function when used with the `remote` function family. Ensure the LIMIT clause is respected in `loop(remote(...))`. [#80299](https://github.com/ClickHouse/ClickHouse/pull/80299) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix incorrect behavior of `to_utc_timestamp` and `from_utc_timestamp` functions when handling dates before Unix epoch (1970-01-01) and after maximum date (2106-02-07 06:28:15). Now these functions properly clamp values to epoch start and maximum date respectively. [#80498](https://github.com/ClickHouse/ClickHouse/pull/80498) ([Surya Kant Ranjan](https://github.com/iit2009046)). +* For some queries executed with parallel replicas, reading in order optimization(s) could be applied on initiator while can't be applied on remote nodes. It leads to different reading modes used by parallel replicas coordinator (on initiator) and on remoted nodes, which is a logical error. [#80652](https://github.com/ClickHouse/ClickHouse/pull/80652) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix logical error during materialize projection when column type was changed to Nullable. [#80741](https://github.com/ClickHouse/ClickHouse/pull/80741) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix incorrect TTL recalculation in TTL GROUP BY when updating TTL. [#81222](https://github.com/ClickHouse/ClickHouse/pull/81222) ([Evgeniy Ulasik](https://github.com/H0uston)). +* Fixed Parquet bloom filter incorrectly applying condition like `WHERE function(key) IN (...)` as if it were `WHERE key IN (...)`. [#81255](https://github.com/ClickHouse/ClickHouse/pull/81255) ([Michael Kolupaev](https://github.com/al13n321)). +* Fixed possible crash in `Aggregator` in case of exception during merge. [#81450](https://github.com/ClickHouse/ClickHouse/pull/81450) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed `InterpreterInsertQuery::extendQueryLogElemImpl` to add backquotes to database and table names when needed (f.g., when names contain special characters like `-`). [#81528](https://github.com/ClickHouse/ClickHouse/pull/81528) ([Ilia Shvyrialkin](https://github.com/Harzu)). +* Fix `IN` execution with `transform_null_in=1` with null in the left argument and non-nullable subquery result. [#81584](https://github.com/ClickHouse/ClickHouse/pull/81584) ([Pavel Kruglov](https://github.com/Avogar)). +* Don't validate experimental/suspicious types in default/materialize expression execution during reading from existing table. [#81618](https://github.com/ClickHouse/ClickHouse/pull/81618) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix "Context has expired" during merges when dict used in TTL expression. [#81690](https://github.com/ClickHouse/ClickHouse/pull/81690) ([Azat Khuzhin](https://github.com/azat)). +* Fix monotonicity of the cast function. [#81722](https://github.com/ClickHouse/ClickHouse/pull/81722) ([zoomxi](https://github.com/zoomxi)). +* Fix the issue where required columns are not read during scalar correlated subquery processing. Fixes [#81716](https://github.com/ClickHouse/ClickHouse/issues/81716). [#81805](https://github.com/ClickHouse/ClickHouse/pull/81805) ([Dmitry Novik](https://github.com/novikd)). +* In previous versions, the server returned excessive content for requests to `/js`. This closes [#61890](https://github.com/ClickHouse/ClickHouse/issues/61890). [#81895](https://github.com/ClickHouse/ClickHouse/pull/81895) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Previously, `MongoDB` table engine definitions could include a path component in the `host:port` argument which was silently ignored. The mongodb integration refuses to load such tables. With this fix *we allow loading such tables and ignore path component* if `MongoDB` engine has five arguments, using the database name from arguments. *Note:* The fix is not applied for newly created tables or queries with `mongo` table function, as well as for dictionary sources and named collections. [#81942](https://github.com/ClickHouse/ClickHouse/pull/81942) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fixed possible crash in `Aggregator` in case of exception during merge. [#82022](https://github.com/ClickHouse/ClickHouse/pull/82022) ([Nikita Taranov](https://github.com/nickitat)). +* Fix filter analysis when only a constant alias column is used in the query. Fixes [#79448](https://github.com/ClickHouse/ClickHouse/issues/79448). [#82037](https://github.com/ClickHouse/ClickHouse/pull/82037) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR and following crash when using the same column in the TTL for GROUP BY and SET. [#82054](https://github.com/ClickHouse/ClickHouse/pull/82054) ([Pablo Marcos](https://github.com/pamarcos)). +* Fix S3 table function argument validation in secret masking, preventing possible `LOGICAL_ERROR`, close [#80620](https://github.com/ClickHouse/ClickHouse/issues/80620). [#82056](https://github.com/ClickHouse/ClickHouse/pull/82056) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix data races in Iceberg. [#82088](https://github.com/ClickHouse/ClickHouse/pull/82088) ([Azat Khuzhin](https://github.com/azat)). +* Fix `DatabaseReplicated::getClusterImpl`. If the first element (or elements) of `hosts` has `id == DROPPED_MARK` and there are no other elements for the same shard, the first element of `shards` will be an empty vector, leading to `std::out_of_range`. [#82093](https://github.com/ClickHouse/ClickHouse/pull/82093) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Fixing copy-paste error in arraySimilarity, disallowing the use of UInt32 and Int32 weights. Update tests and docs. [#82103](https://github.com/ClickHouse/ClickHouse/pull/82103) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix the `Not found column` error for queries with `arrayJoin` under `WHERE` condition and `IndexSet`. [#82113](https://github.com/ClickHouse/ClickHouse/pull/82113) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug in glue catalog integration. Now clickhouse can read tables with nested data types where some of subcolumns contain decimals, for example: `map`. Fixes [#81301](https://github.com/ClickHouse/ClickHouse/issues/81301). [#82114](https://github.com/ClickHouse/ClickHouse/pull/82114) ([alesapin](https://github.com/alesapin)). +* Fix performance degradation in SummingMergeTree that was intorduced in 25.5 in https://github.com/ClickHouse/ClickHouse/pull/79051. [#82130](https://github.com/ClickHouse/ClickHouse/pull/82130) ([Pavel Kruglov](https://github.com/Avogar)). +* When passing settings over uri the last value is considered. [#82137](https://github.com/ClickHouse/ClickHouse/pull/82137) ([Sema Checherinda](https://github.com/CheSema)). +* Fix "Context has expired" for Iceberg. [#82146](https://github.com/ClickHouse/ClickHouse/pull/82146) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible deadlock for remote queries when server is under memory pressure. [#82160](https://github.com/ClickHouse/ClickHouse/pull/82160) ([Kirill](https://github.com/kirillgarbar)). +* Fixes overflow in `numericIndexedVectorPointwiseAdd`, `numericIndexedVectorPointwiseSubtract`, `numericIndexedVectorPointwiseMultiply`, `numericIndexedVectorPointwiseDivide` functions that happened when we applied them to large numbers. [#82165](https://github.com/ClickHouse/ClickHouse/pull/82165) ([Raufs Dunamalijevs](https://github.com/rienath)). +* Fix a bug in table dependencies causing Materialized Views to miss INSERT queries. [#82222](https://github.com/ClickHouse/ClickHouse/pull/82222) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix possible data-race between suggestion thread and main client thread. [#82233](https://github.com/ClickHouse/ClickHouse/pull/82233) ([Azat Khuzhin](https://github.com/azat)). +* Now ClickHouse can read iceberg tables from Glue catalog after schema evolution. Fixes [#81272](https://github.com/ClickHouse/ClickHouse/issues/81272). [#82301](https://github.com/ClickHouse/ClickHouse/pull/82301) ([alesapin](https://github.com/alesapin)). +* Fix the validation of async metrics settings `asynchronous_metrics_update_period_s` and `asynchronous_heavy_metrics_update_period_s`. [#82310](https://github.com/ClickHouse/ClickHouse/pull/82310) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix logical error when resolving matcher in query with multiple JOINs, close [#81969](https://github.com/ClickHouse/ClickHouse/issues/81969). [#82421](https://github.com/ClickHouse/ClickHouse/pull/82421) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Add expiration to AWS ECS token so it can be reloaded. [#82422](https://github.com/ClickHouse/ClickHouse/pull/82422) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fixes a bug for `NULL` arguments in `CASE` function. [#82436](https://github.com/ClickHouse/ClickHouse/pull/82436) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix data-races in client (by not using global context) and `session_timezone` overrides (previously in case of `session_timezone` was set in i.e. `users.xml`/client options to non empty and in query context to empty, then, value from `users.xml` was used, while this is wrong, now query context will always have a priority over global context). [#82444](https://github.com/ClickHouse/ClickHouse/pull/82444) ([Azat Khuzhin](https://github.com/azat)). +* Fix disabling boundary alignment for cached buffer in external table engines. It was broken in https://github.com/ClickHouse/ClickHouse/pull/81868. [#82493](https://github.com/ClickHouse/ClickHouse/pull/82493) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix the crash if key-value storage is joined with a type-casted key. [#82497](https://github.com/ClickHouse/ClickHouse/pull/82497) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix hiding named collection values in logs/query_log. Closes [#82405](https://github.com/ClickHouse/ClickHouse/issues/82405). [#82510](https://github.com/ClickHouse/ClickHouse/pull/82510) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix a possible crash in logging while terminating a session as the user_id might sometimes be empty. [#82513](https://github.com/ClickHouse/ClickHouse/pull/82513) ([Bharat Nallan](https://github.com/bharatnc)). +* Fixes cases where parsing of Time could cause msan issues. This fixes: [#82477](https://github.com/ClickHouse/ClickHouse/issues/82477). [#82514](https://github.com/ClickHouse/ClickHouse/pull/82514) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Disallow setting `threadpool_writer_pool_size` to zero to ensure that server operations don't get stuck. [#82532](https://github.com/ClickHouse/ClickHouse/pull/82532) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix `LOGICAL_ERROR` during row policy expression analysis for correlated columns. [#82618](https://github.com/ClickHouse/ClickHouse/pull/82618) ([Dmitry Novik](https://github.com/novikd)). +* Fix incorrect usage of parent metadata in `mergeTreeProjection` table function when `enable_shared_storage_snapshot_in_query = 1`. This is for [#82634](https://github.com/ClickHouse/ClickHouse/issues/82634). [#82638](https://github.com/ClickHouse/ClickHouse/pull/82638) ([Amos Bird](https://github.com/amosbird)). +* Functions `trim{Left,Right,Both}` now support input strings of type "FixedString(N)". For example, `SELECT trimBoth(toFixedString('abc', 3), 'ac')` now works. [#82691](https://github.com/ClickHouse/ClickHouse/pull/82691) ([Robert Schulze](https://github.com/rschu1ze)). +* In AzureBlobStorage, for native copy we compare authentication methods, during which if we get an exception, updated the code to fallback to read and copy (i.e. non native copy). [#82693](https://github.com/ClickHouse/ClickHouse/pull/82693) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Fix deserialization of `groupArraySample`/`groupArrayLast` in case of empty elements (deserialization could skip part of the binary if the input was empty, this can lead to corruption during data read and UNKNOWN_PACKET_FROM_SERVER in TCP protocol). This does not affect numbers and date time types. [#82763](https://github.com/ClickHouse/ClickHouse/pull/82763) ([Pedro Ferreira](https://github.com/PedroTadim)). +* Fix backup of an empty `Memory` table, causing the backup restore to fail with with `BACKUP_ENTRY_NOT_FOUND` error. [#82791](https://github.com/ClickHouse/ClickHouse/pull/82791) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix exception safety in union/intersect/except_default_mode rewrite. Closes [#82664](https://github.com/ClickHouse/ClickHouse/issues/82664). [#82820](https://github.com/ClickHouse/ClickHouse/pull/82820) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Keep track of the number of async tables loading jobs. If there are some running jobs, do not update `tail_ptr` in `TransactionLog::removeOldEntries`. [#82824](https://github.com/ClickHouse/ClickHouse/pull/82824) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Fix data races in Iceberg. [#82841](https://github.com/ClickHouse/ClickHouse/pull/82841) ([Azat Khuzhin](https://github.com/azat)). +* Setting `use_skip_indexes_if_final_exact_mode` optimization (introduced in 25.6) could fail to select a relevant candidate range depending upon `MergeTree` engine settings / data distribution. That has been resolved now. [#82879](https://github.com/ClickHouse/ClickHouse/pull/82879) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Set salt for auth data when parsing from AST with type SCRAM_SHA256_PASSWORD. [#82888](https://github.com/ClickHouse/ClickHouse/pull/82888) ([Tuan Pham Anh](https://github.com/tuanpach)). +* When using a non-caching Database implementation, the metadata of the corresponding table is deleted after the columns are returned and the reference is invalidated. [#82939](https://github.com/ClickHouse/ClickHouse/pull/82939) ([buyval01](https://github.com/buyval01)). +* Fix filter modification for queries with a JOIN expression with a table with storage `Merge`. Fixes [#82092](https://github.com/ClickHouse/ClickHouse/issues/82092). [#82950](https://github.com/ClickHouse/ClickHouse/pull/82950) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR in QueryMetricLog: Mutex cannot be NULL. [#82979](https://github.com/ClickHouse/ClickHouse/pull/82979) ([Pablo Marcos](https://github.com/pamarcos)). +* Fixed incorrect output of function `formatDateTime` when formatter `%f` is used together with variable-size formatters (e.g. `%M`). [#83020](https://github.com/ClickHouse/ClickHouse/pull/83020) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix performance degradation with the enabled analyzer when secondary queries always read all columns from the VIEWs. Fixes [#81718](https://github.com/ClickHouse/ClickHouse/issues/81718). [#83036](https://github.com/ClickHouse/ClickHouse/pull/83036) ([Dmitry Novik](https://github.com/novikd)). +* Fix misleading error message when restoring a backup on a read-only disk. [#83051](https://github.com/ClickHouse/ClickHouse/pull/83051) ([Julia Kartseva](https://github.com/jkartseva)). +* Do not check for cyclic dependencies on create table with no dependencies. It fixes performance degradation of the use cases with creation of thousands of tables that was introduced in https://github.com/ClickHouse/ClickHouse/pull/65405. [#83077](https://github.com/ClickHouse/ClickHouse/pull/83077) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixes issue with implicit reading of negative Time values into the table and make the docs not confusing. [#83091](https://github.com/ClickHouse/ClickHouse/pull/83091) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Do not use unrelated parts of a shared dictionary in the `lowCardinalityKeys` function. [#83118](https://github.com/ClickHouse/ClickHouse/pull/83118) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix the regression in use of subcolumns with Materialized Views. This fixes: [#82784](https://github.com/ClickHouse/ClickHouse/issues/82784). [#83221](https://github.com/ClickHouse/ClickHouse/pull/83221) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix crash in client due to connection left in disconnected state after bad INSERT. [#83253](https://github.com/ClickHouse/ClickHouse/pull/83253) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash when calculating the size of a block with empty columns. [#83271](https://github.com/ClickHouse/ClickHouse/pull/83271) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible crash in Variant type in UNION. [#83295](https://github.com/ClickHouse/ClickHouse/pull/83295) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix LOGICAL_ERROR in clickhouse-local for unsupported SYSTEM queries. [#83333](https://github.com/ClickHouse/ClickHouse/pull/83333) ([Surya Kant Ranjan](https://github.com/iit2009046)). +* Fix `no_sign_request` for S3 client. It can be used to explicitly avoid signing S3 requests. It can also be defined for specific endpoints using endpoint-based settings. [#83379](https://github.com/ClickHouse/ClickHouse/pull/83379) ([Antonio Andelic](https://github.com/antonio2368)). +* Fixes a crash that may happen for a query with a setting 'max_threads=1' when executed under load with CPU scheduling enabled. [#83387](https://github.com/ClickHouse/ClickHouse/pull/83387) ([Fan Ziqi](https://github.com/f2quantum)). +* Fix `TOO_DEEP_SUBQUERIES` exception when CTE definition references another table expression with the same name. [#83413](https://github.com/ClickHouse/ClickHouse/pull/83413) ([Dmitry Novik](https://github.com/novikd)). +* Fix incorrect behavior when executing `REVOKE S3 ON system.*` revokes S3 permissions for `*.*`. This fixes [#83417](https://github.com/ClickHouse/ClickHouse/issues/83417). [#83420](https://github.com/ClickHouse/ClickHouse/pull/83420) ([pufit](https://github.com/pufit)). +* Do not share async_read_counters between queries. [#83423](https://github.com/ClickHouse/ClickHouse/pull/83423) ([Azat Khuzhin](https://github.com/azat)). +* Disable parallel replicas when a subquery contains the FINAL. [#83455](https://github.com/ClickHouse/ClickHouse/pull/83455) ([zoomxi](https://github.com/zoomxi)). +* Resolve minor integer overflow in configuration of setting `role_cache_expiration_time_seconds` (issue [#83374](https://github.com/ClickHouse/ClickHouse/issues/83374)). [#83461](https://github.com/ClickHouse/ClickHouse/pull/83461) ([wushap](https://github.com/wushap)). +* Fix a bug introduced in https://github.com/ClickHouse/ClickHouse/pull/79963. When inserting into an MV with a definer, the permission check should use the definer's grants. This fixes [#79951](https://github.com/ClickHouse/ClickHouse/issues/79951). [#83502](https://github.com/ClickHouse/ClickHouse/pull/83502) ([pufit](https://github.com/pufit)). +* Disable bounds-based file pruning for iceberg array element and iceberg map values, including all their nested subfields. [#83520](https://github.com/ClickHouse/ClickHouse/pull/83520) ([Daniil Ivanik](https://github.com/divanik)). +* Fix possible file cache not initialized errors when it's used as a temporary data storage. [#83539](https://github.com/ClickHouse/ClickHouse/pull/83539) ([Bharat Nallan](https://github.com/bharatnc)). +* Keeper fix: update total watch count correctly when ephemeral nodes are deleted on session close. [#83583](https://github.com/ClickHouse/ClickHouse/pull/83583) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix incorrect memory around max_untracked_memory. [#83607](https://github.com/ClickHouse/ClickHouse/pull/83607) ([Azat Khuzhin](https://github.com/azat)). +* INSERT SELECT with UNION ALL could lead to a null pointer dereference in a corner case. This closes [#83618](https://github.com/ClickHouse/ClickHouse/issues/83618). [#83643](https://github.com/ClickHouse/ClickHouse/pull/83643) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disallow zero value for max_insert_block_size as it could cause logical error. [#83688](https://github.com/ClickHouse/ClickHouse/pull/83688) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix endless loop in estimateCompressionRatio() with block_size_bytes=0. [#83704](https://github.com/ClickHouse/ClickHouse/pull/83704) ([Azat Khuzhin](https://github.com/azat)). +* Fix `IndexUncompressedCacheBytes`/`IndexUncompressedCacheCells`/`IndexMarkCacheBytes`/`IndexMarkCacheFiles` metrics (previously they were included into metric w/o `Cache` prefix). [#83730](https://github.com/ClickHouse/ClickHouse/pull/83730) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible abort (due to joining threads from the task) and hopefully hungs (in unit tests) during `BackgroundSchedulePool` shutdown. [#83769](https://github.com/ClickHouse/ClickHouse/pull/83769) ([Azat Khuzhin](https://github.com/azat)). +* Introduce backward compatibility setting to allow new analyzer to reference outer alias in WITH clause in the case of name clashes. Fixes [#82700](https://github.com/ClickHouse/ClickHouse/issues/82700). [#83797](https://github.com/ClickHouse/ClickHouse/pull/83797) ([Dmitry Novik](https://github.com/novikd)). +* Fix deadlock on shutdown due to recursive context locking during library bridge cleanup. [#83824](https://github.com/ClickHouse/ClickHouse/pull/83824) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement +* Build a minimal C library (10 KB) for the ClickHouse lexer. This is needed for [#80977](https://github.com/ClickHouse/ClickHouse/issues/80977). [#81347](https://github.com/ClickHouse/ClickHouse/pull/81347) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Add test for standalone lexer, add test tag `fasttest-only`. [#82472](https://github.com/ClickHouse/ClickHouse/pull/82472) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add a check for Nix submodule inputs. [#81691](https://github.com/ClickHouse/ClickHouse/pull/81691) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix a list of problems that can occur when trying to run integration tests on a localhost. [#82135](https://github.com/ClickHouse/ClickHouse/pull/82135) ([Oleg Doronin](https://github.com/dorooleg)). +* Compile SymbolIndex on Mac and FreeBSD. (But it will work only on ELF systems, Linux and FreeBSD). [#82347](https://github.com/ClickHouse/ClickHouse/pull/82347) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bumped Azure SDK to v1.15.0. [#82747](https://github.com/ClickHouse/ClickHouse/pull/82747) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Add storage module from google-cloud-cpp to build system. [#82881](https://github.com/ClickHouse/ClickHouse/pull/82881) ([Pablo Marcos](https://github.com/pamarcos)). +* Change `Dockerfile.ubuntu` for clickhouse-server to fit requirements in Docker Official Library. [#83039](https://github.com/ClickHouse/ClickHouse/pull/83039) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* A follow-up for [#83158](https://github.com/ClickHouse/ClickHouse/issues/83158) to fix uploading builds to `curl clickhouse.com`. [#83463](https://github.com/ClickHouse/ClickHouse/pull/83463) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Adding `busybox` binary and install tools in `clickhouse/clickhouse-server` and official `clickhouse` images. [#83735](https://github.com/ClickHouse/ClickHouse/pull/83735) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Added support for the `CLICKHOUSE_HOST` environment variable to specify the ClickHouse server host, aligning with existing `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD` environment variables. This allows for easier configuration without modifying client or configuration files directly. [#83659](https://github.com/ClickHouse/ClickHouse/pull/83659) ([Doron David](https://github.com/dorki)). + + +### ClickHouse release 25.6, 2025-06-26 {#256} + +#### Backward Incompatible Change +* Previously, function `countMatches` would stop counting at the first empty match even if the pattern accepts it. To overcome this issue, `countMatches` now continues execution by advancing by a single character when an empty match occurs. Users who like to retain the old behavior can enable setting `count_matches_stop_at_empty_match`. [#81676](https://github.com/ClickHouse/ClickHouse/pull/81676) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Minor: Force `backup_threads` and `restore_threads` server settings to be non zero. [#80224](https://github.com/ClickHouse/ClickHouse/pull/80224) ([Raúl Marín](https://github.com/Algunenano)). +* Minor: Fix `bitNot` for `String` will return a zero-terminated string in the internal memory representation. This should not affect any user visible behavior, however the author wanted to highlight this change. [#80791](https://github.com/ClickHouse/ClickHouse/pull/80791) ([Azat Khuzhin](https://github.com/azat)). + +#### New Feature +* New data types: `Time` (\[H\]HH:MM:SS) and `Time64` (\[H\]HH:MM:SS\[.fractional\]), and some basic cast functions and functions to interact with other data types. Added settings for compatibility with the existing function `toTime`. The setting `use_legacy_to_time` is set to keep the old behavior for now. [#81217](https://github.com/ClickHouse/ClickHouse/pull/81217) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). Support comparison between Time/Time64. [#80327](https://github.com/ClickHouse/ClickHouse/pull/80327) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* A new CLI tool, [`chdig`](https://github.com/azat/chdig/) - TUI interface for ClickHouse (top like) as part of ClickHouse. [#79666](https://github.com/ClickHouse/ClickHouse/pull/79666) ([Azat Khuzhin](https://github.com/azat)). +* Support `disk` setting for `Atomic` and `Ordinary` database engines, specifying the disk to store table metadata files. [#80546](https://github.com/ClickHouse/ClickHouse/pull/80546) ([Tuan Pham Anh](https://github.com/tuanpach)). This allows attaching databases from external sources. +* A new type of MergeTree, `CoalescingMergeTree` - the engine takes the first non-Null value during background merges. This closes [#78869](https://github.com/ClickHouse/ClickHouse/issues/78869). [#79344](https://github.com/ClickHouse/ClickHouse/pull/79344) ([scanhex12](https://github.com/scanhex12)). +* Support functions to read WKB ("Well-Known Binary" is a format for binary encoding of various geometry types, used in GIS applications). See [#43941](https://github.com/ClickHouse/ClickHouse/issues/43941). [#80139](https://github.com/ClickHouse/ClickHouse/pull/80139) ([scanhex12](https://github.com/scanhex12)). +* Added query slot scheduling for workloads, see [workload scheduling](https://clickhouse.com/docs/operations/workload-scheduling#query_scheduling) for details. [#78415](https://github.com/ClickHouse/ClickHouse/pull/78415) ([Sergei Trifonov](https://github.com/serxa)). +* `timeSeries*` helper functions to speedup some scenarios when working with time series data: - re-sample the data to the time grid with specified start timestamp, end timestamp and step - calculate PromQL-like `delta`, `rate`, `idelta` and `irate`. [#80590](https://github.com/ClickHouse/ClickHouse/pull/80590) ([Alexander Gololobov](https://github.com/davenger)). +* Add `mapContainsValuesLike`/`mapContainsValues`/`mapExtractValuesLike` functions to filter on map values and their support in bloom filter based indexes. [#78171](https://github.com/ClickHouse/ClickHouse/pull/78171) ([UnamedRus](https://github.com/UnamedRus)). +* Now settings constraints can specify a set of disallowed values. [#78499](https://github.com/ClickHouse/ClickHouse/pull/78499) ([Bharat Nallan](https://github.com/bharatnc)). +* Added a setting `enable_shared_storage_snapshot_in_query` to enable sharing the same storage snapshot across all subqueries in a single query. This ensures consistent reads from the same table, even when the table is referenced multiple times within a query. [#79471](https://github.com/ClickHouse/ClickHouse/pull/79471) ([Amos Bird](https://github.com/amosbird)). +* Support writing `JSON` columns to `Parquet` and reading `JSON` columns from `Parquet` directly. [#79649](https://github.com/ClickHouse/ClickHouse/pull/79649) ([Nihal Z. Miaji](https://github.com/nihalzp)). +* Add `MultiPolygon` support for `pointInPolygon`. [#79773](https://github.com/ClickHouse/ClickHouse/pull/79773) ([Nihal Z. Miaji](https://github.com/nihalzp)). +* Add support for querying local filesystem-mounted Delta tables via `deltaLakeLocal` table function. [#79781](https://github.com/ClickHouse/ClickHouse/pull/79781) ([roykim98](https://github.com/roykim98)). +* Add new setting `cast_string_to_date_time_mode` that allows to choose DateTime parsing mode during cast from String. [#80210](https://github.com/ClickHouse/ClickHouse/pull/80210) ([Pavel Kruglov](https://github.com/Avogar)). For example, you can set it to the best effort mode. +* Added `bech32Encode` and `bech32Decode` functions for working with Bitcoin's Bech algorithm (issue [#40381](https://github.com/ClickHouse/ClickHouse/issues/40381)). [#80239](https://github.com/ClickHouse/ClickHouse/pull/80239) ([George Larionov](https://github.com/glarik)). +* Add SQL functions to analyse the names of MergeTree parts. [#80573](https://github.com/ClickHouse/ClickHouse/pull/80573) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Allow filtering parts selected for query by the disk they reside on by introducing a new virtual column, `_disk_name`. [#80650](https://github.com/ClickHouse/ClickHouse/pull/80650) ([tanner-bruce](https://github.com/tanner-bruce)). +* Add a landing page with the list of embedded web tools. It will open when requested by a browser-like user agent. [#81129](https://github.com/ClickHouse/ClickHouse/pull/81129) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Function `arrayFirst`, `arrayFirstIndex`, `arrayLast` and `arrayLastIndex` will filter away NULL values returned by the filter expression. In previous versions, Nullable filter results were not supported. Fixes [#81113](https://github.com/ClickHouse/ClickHouse/issues/81113). [#81197](https://github.com/ClickHouse/ClickHouse/pull/81197) ([Lennard Eijsackers](https://github.com/Blokje5)). +* It's now possible to write `USE DATABASE name` instead of `USE name`. [#81307](https://github.com/ClickHouse/ClickHouse/pull/81307) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Added a new system table `system.codecs` to introspect the available codecs. (issue [#81525](https://github.com/ClickHouse/ClickHouse/issues/81525)). [#81600](https://github.com/ClickHouse/ClickHouse/pull/81600) ([Jimmy Aguilar Mena](https://github.com/Ergus)). +* Support `lag` and `lead` window functions. Closes [#9887](https://github.com/ClickHouse/ClickHouse/issues/9887). [#82108](https://github.com/ClickHouse/ClickHouse/pull/82108) ([Dmitry Novik](https://github.com/novikd)). +* Function `tokens` now supports a new tokenizer, named `split`, which is good for logs. [#80195](https://github.com/ClickHouse/ClickHouse/pull/80195) ([Robert Schulze](https://github.com/rschu1ze)). +* Add support for the `--database` argument in `clickhouse-local`. You can switch to a previously created database. This closes [#44115](https://github.com/ClickHouse/ClickHouse/issues/44115). [#81465](https://github.com/ClickHouse/ClickHouse/pull/81465) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Experimental Feature +* Implement Kafka rebalance like logic for `Kafka2` using ClickHouse Keeper For each replica we support two types of partition locks: permanent locks and temporary locks. The replica tries to hold permanent locks as long as possible, at any given time there are no more than `all_topic_partitions / active_replicas_count` (here `all_topic_partitions` is the number of all partitions, `active_replicas_count` is the number of active replicas) permanent locks on the replica, if there are more, then the replica releases some partitions. Some partitions are temporarily held by the replica. The maximum number of temporary locks on a replica changes dynamically to give other replicas a chance to take some partitions into permanent locks. When updating temporary locks, the replica releases them all and tries to take some others again. [#78726](https://github.com/ClickHouse/ClickHouse/pull/78726) ([Daria Fomina](https://github.com/sinfillo)). +* An improvement for the experimental text index: explicit parameters are supported via key-value pairs. Currently, supported parameters are a mandatory `tokenizer` and two optional `max_rows_per_postings_list` and `ngram_size`. [#80262](https://github.com/ClickHouse/ClickHouse/pull/80262) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Previously, `packed` storage was not supported for the full-text index, because the segment id was updated on-fly by reading and writing (`.gin_sid`) file on disk. In case of packed storage, reading a value from the uncommited file is not supported and this led to an issue. Now it is alright. [#80852](https://github.com/ClickHouse/ClickHouse/pull/80852) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Experimental indexes of type `gin` (which I don't like because it is an inside joke of PostgreSQL hackers) were renamed to `text`. Existing indexes of type `gin` remain loadable but they will throw an exception (suggesting `text` indexes instead) when one tries to use them in searches. [#80855](https://github.com/ClickHouse/ClickHouse/pull/80855) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Enable multiple-projection filtering support, allowing to use more than one projection for part-level filtering. This addresses [#55525](https://github.com/ClickHouse/ClickHouse/issues/55525). This is the second step to implement projection index, following [#78429](https://github.com/ClickHouse/ClickHouse/issues/78429). [#80343](https://github.com/ClickHouse/ClickHouse/pull/80343) ([Amos Bird](https://github.com/amosbird)). +* Use `SLRU` cache policy in filesystem cache by default. [#75072](https://github.com/ClickHouse/ClickHouse/pull/75072) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove contention in the Resize step in query pipeline. [#77562](https://github.com/ClickHouse/ClickHouse/pull/77562) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Introduced an option to offload (de)compression and (de)serialization of blocks into pipeline threads instead of a single thread associated with a network connection. Controlled by the setting `enable_parallel_blocks_marshalling`. It should speed up distributed queries that transfer significant amounts of data between the initiator and remote nodes. [#78694](https://github.com/ClickHouse/ClickHouse/pull/78694) ([Nikita Taranov](https://github.com/nickitat)). +* Performance improvements to all bloom filter types. [Video from the OpenHouse conference](https://www.youtube.com/watch?v=yIVz0NKwQvA&pp=ygUQb3BlbmhvdXNlIG9wZW5haQ%3D%3D) [#79800](https://github.com/ClickHouse/ClickHouse/pull/79800) ([Delyan Kratunov](https://github.com/dkratunov)). +* Introduced a happy path in `UniqExactSet::merge` when one of the sets is empty. Also, now if the LHS set is two-level and the RHS is single-level, we won't do the conversion to two-level for the RHS. [#79971](https://github.com/ClickHouse/ClickHouse/pull/79971) ([Nikita Taranov](https://github.com/nickitat)). +* Improve memory reuse efficiency and reduce page faults when using the two-level hash tables. This meant to speed-up GROUP BY. [#80245](https://github.com/ClickHouse/ClickHouse/pull/80245) ([Jiebin Sun](https://github.com/jiebinn)). +* Avoid unnecessary update and reduce lock contention in query condition cache. [#80247](https://github.com/ClickHouse/ClickHouse/pull/80247) ([Jiebin Sun](https://github.com/jiebinn)). +* Trivial optimization for `concatenateBlocks`. Chances are it's good for parallel hash join. [#80328](https://github.com/ClickHouse/ClickHouse/pull/80328) ([李扬](https://github.com/taiyang-li)). +* When selecting mark ranges from the primary key range, binary search cannot be used if the primary key is wrapped with functions. This PR improves this limitation: binary search can still be applied when the primary key is wrapped with an always monotonic function chain, or when the RPN contains an element that is always true. Closes [#45536](https://github.com/ClickHouse/ClickHouse/issues/45536). [#80597](https://github.com/ClickHouse/ClickHouse/pull/80597) ([zoomxi](https://github.com/zoomxi)). +* Improve shutdown speed of `Kafka` engine (remove extra 3 seconds delay in case of multiple `Kafka` tables). [#80796](https://github.com/ClickHouse/ClickHouse/pull/80796) ([Azat Khuzhin](https://github.com/azat)). +* Async inserts: reduce memory usage and improve performance of insert queries. [#80972](https://github.com/ClickHouse/ClickHouse/pull/80972) ([Raúl Marín](https://github.com/Algunenano)). +* Don't profile processors if the log table is disabled. [#81256](https://github.com/ClickHouse/ClickHouse/pull/81256) ([Raúl Marín](https://github.com/Algunenano)). This speeds up very short queries. +* Speed up `toFixedString` when the source is exactly what's requested. [#81257](https://github.com/ClickHouse/ClickHouse/pull/81257) ([Raúl Marín](https://github.com/Algunenano)). +* Don't process quota values if the user is not limited. [#81549](https://github.com/ClickHouse/ClickHouse/pull/81549) ([Raúl Marín](https://github.com/Algunenano)). This speeds up very short queries. +* Fixed performance regression in memory tracking. [#81694](https://github.com/ClickHouse/ClickHouse/pull/81694) ([Michael Kolupaev](https://github.com/al13n321)). +* Improve sharding key optimization on distributed query. [#78452](https://github.com/ClickHouse/ClickHouse/pull/78452) ([fhw12345](https://github.com/fhw12345)). +* Parallel replicas: avoid waiting for slow unused replicas if all read tasks have been assigned to other replicas. [#80199](https://github.com/ClickHouse/ClickHouse/pull/80199) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas uses separate connection timeout, see `parallel_replicas_connect_timeout_ms` setting. Before `connect_timeout_with_failover_ms`/`connect_timeout_with_failover_secure_ms` settings were used as connection timeout values for parallel replicas queries (1 second by default). [#80421](https://github.com/ClickHouse/ClickHouse/pull/80421) ([Igor Nikonov](https://github.com/devcrafter)). +* In filesystem with journal `mkdir` is written to the journal of filesystem which is persisted to disk. In case of slow disk this can take long time. Move it out from reserve lock scope. [#81371](https://github.com/ClickHouse/ClickHouse/pull/81371) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Postpone reading of Iceberg manifest files until first reading query. [#81619](https://github.com/ClickHouse/ClickHouse/pull/81619) ([Daniil Ivanik](https://github.com/divanik)). +* Allow moving `GLOBAL [NOT] IN` predicate to `PREWHERE` clause if applicable. [#79996](https://github.com/ClickHouse/ClickHouse/pull/79996) ([Eduard Karacharov](https://github.com/korowa)). + +#### Improvement +* `EXPLAIN SYNTAX` now uses a new analyzer. It returns AST built from the query tree. Added option `query_tree_passes` to control the number of passes to executed before converting query tree to the AST. [#74536](https://github.com/ClickHouse/ClickHouse/pull/74536) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Implement flattened serialization for Dynamic and JSON in Native format that allows to serialize/deserialize Dynamic and JSON data without special structures like shared variant for Dynamic and shared data for JSON. This serialization can be enabled by setting `output_format_native_use_flattened_dynamic_and_json_serialization`. This serialization can be used for easier support for Dynamic and JSON in TCP protocol in clients in different languages. [#80499](https://github.com/ClickHouse/ClickHouse/pull/80499) ([Pavel Kruglov](https://github.com/Avogar)). +* Refresh `S3` credentials after error `AuthenticationRequired`. [#77353](https://github.com/ClickHouse/ClickHouse/pull/77353) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added dictionary metrics to `system.asynchronous_metrics` - `DictionaryMaxUpdateDelay` - the maximum delay (in seconds) of dictionary update. - `DictionaryTotalFailedUpdates` - the number of errors since last successful loading in all dictionaries. [#78175](https://github.com/ClickHouse/ClickHouse/pull/78175) ([Vlad](https://github.com/codeworse)). +* Add a warning about databases that were potentially created to save broken tables. [#78841](https://github.com/ClickHouse/ClickHouse/pull/78841) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Add `_time` virtual column in `S3Queue`, `AzureQueue` engine. [#78926](https://github.com/ClickHouse/ClickHouse/pull/78926) ([Anton Ivashkin](https://github.com/ianton-ru)). +* Make settings controlling connection drop on overloaded CPU hot-reloadable. [#79052](https://github.com/ClickHouse/ClickHouse/pull/79052) ([Alexey Katsman](https://github.com/alexkats)). +* Add container prefix to data paths reported in system.tables for plain disks in Azure blob storage, making reporting consistent with S3 and GCP. [#79241](https://github.com/ClickHouse/ClickHouse/pull/79241) ([Julia Kartseva](https://github.com/jkartseva)). +* Now, clickhouse-client and local also accept query parameters as `param-` (dash) along with `param_` (underscore). This closes [#63093](https://github.com/ClickHouse/ClickHouse/issues/63093). [#79429](https://github.com/ClickHouse/ClickHouse/pull/79429) ([Engel Danila](https://github.com/aaaengel)). +* Detailed warning msg for bandwidth discount when copying data from local to remote S3 with checksum enabled. [#79464](https://github.com/ClickHouse/ClickHouse/pull/79464) ([VicoWu](https://github.com/VicoWu)). +* Previously, when `input_format_parquet_max_block_size = 0` (an invalid value) ClickHouse would stuck. Now this behaviour is fixed. This closes [#79394](https://github.com/ClickHouse/ClickHouse/issues/79394). [#79601](https://github.com/ClickHouse/ClickHouse/pull/79601) ([abashkeev](https://github.com/abashkeev)). +* Add `throw_on_error` setting for `startup_scripts`: when `throw_on_error` is true, the server will not start unless all queries complete successfully. By default, `throw_on_error` is false, preserving the previous behavior. [#79732](https://github.com/ClickHouse/ClickHouse/pull/79732) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Allow to add `http_response_headers` in `http_handlers` of any kind. [#79975](https://github.com/ClickHouse/ClickHouse/pull/79975) ([Andrey Zvonov](https://github.com/zvonand)). +* Function `reverse` now supports `Tuple` data type. Closes [#80053](https://github.com/ClickHouse/ClickHouse/issues/80053). [#80083](https://github.com/ClickHouse/ClickHouse/pull/80083) ([flynn](https://github.com/ucasfl)). +* Resolve [#75817](https://github.com/ClickHouse/ClickHouse/issues/75817): allow getting `auxiliary_zookeepers` data from `system.zookeeper` table. [#80146](https://github.com/ClickHouse/ClickHouse/pull/80146) ([Nikolay Govorov](https://github.com/mrdimidium)). +* Add asynchronous metrics about the server's TCP sockets. This improves the observability. Closes [#80187](https://github.com/ClickHouse/ClickHouse/issues/80187). [#80188](https://github.com/ClickHouse/ClickHouse/pull/80188) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support `anyLast_respect_nulls` and `any_respect_nulls` as a `SimpleAggregateFunction`. [#80219](https://github.com/ClickHouse/ClickHouse/pull/80219) ([Diskein](https://github.com/Diskein)). +* Remove unnecessary call `adjustCreateQueryForBackup` for replicated databases. [#80282](https://github.com/ClickHouse/ClickHouse/pull/80282) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow extra options (that go after `--` like `-- --config.value='abc'`) in `clickhouse-local` without the equality sign. Closes [#80292](https://github.com/ClickHouse/ClickHouse/issues/80292). [#80293](https://github.com/ClickHouse/ClickHouse/pull/80293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Highlight metacharacters in `SHOW ... LIKE` queries. This closes [#80275](https://github.com/ClickHouse/ClickHouse/issues/80275). [#80297](https://github.com/ClickHouse/ClickHouse/pull/80297) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make SQL UDF persistent in `clickhouse-local`. The previously created function will be loaded at startup. This closes [#80085](https://github.com/ClickHouse/ClickHouse/issues/80085). [#80300](https://github.com/ClickHouse/ClickHouse/pull/80300) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix description in explain plan for preliminary DISTINCT step. [#80330](https://github.com/ClickHouse/ClickHouse/pull/80330) ([UnamedRus](https://github.com/UnamedRus)). +* Allow to use named collections in ODBC/JDBC. [#80334](https://github.com/ClickHouse/ClickHouse/pull/80334) ([Andrey Zvonov](https://github.com/zvonand)). +* Metrics for number of readonly and broken disks. Indicator logs when DiskLocalCheckThread is started. [#80391](https://github.com/ClickHouse/ClickHouse/pull/80391) ([VicoWu](https://github.com/VicoWu)). +* Implement support for `s3_plain_rewritable` storage with projections. In previous versions, metadata objects in S3 referencing projections would not get updated when moved. Closes [#70258](https://github.com/ClickHouse/ClickHouse/issues/70258). [#80393](https://github.com/ClickHouse/ClickHouse/pull/80393) ([Sav](https://github.com/sberss)). +* The `SYSTEM UNFREEZE` command will not try to look up parts in readonly and write-once disks. This closes [#80430](https://github.com/ClickHouse/ClickHouse/issues/80430). [#80432](https://github.com/ClickHouse/ClickHouse/pull/80432) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Lowered the log level of merged parts messages. [#80476](https://github.com/ClickHouse/ClickHouse/pull/80476) ([Hans Krutzer](https://github.com/hkrutzer)). +* Change the default behavior of partition pruning for Iceberg tables. [#80583](https://github.com/ClickHouse/ClickHouse/pull/80583) ([Melvyn Peignon](https://github.com/melvynator)). +* Add two new ProfileEvents for index search algorithm observability: `IndexBinarySearchAlgorithm` and `IndexGenericExclusionSearchAlgorithm`. [#80679](https://github.com/ClickHouse/ClickHouse/pull/80679) ([Pablo Marcos](https://github.com/pamarcos)). +* Do not complain about unsupported `MADV_POPULATE_WRITE` for older kernels in logs (to avoid logs polluting). [#80704](https://github.com/ClickHouse/ClickHouse/pull/80704) ([Robert Schulze](https://github.com/rschu1ze)). +* Added support for `Date32` and `DateTime64` in `TTL` expressions. [#80710](https://github.com/ClickHouse/ClickHouse/pull/80710) ([Andrey Zvonov](https://github.com/zvonand)). +* Adjust compatibility values for `max_merge_delayed_streams_for_parallel_write`. [#80760](https://github.com/ClickHouse/ClickHouse/pull/80760) ([Azat Khuzhin](https://github.com/azat)). +* Fix a crash: if an exception is thrown in an attempt to remove a temporary file (they are used for spilling temporary data on disk) in the destructor, the program can terminate. [#80776](https://github.com/ClickHouse/ClickHouse/pull/80776) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `IF EXISTS` modifier to `SYSTEM SYNC REPLICA`. [#80810](https://github.com/ClickHouse/ClickHouse/pull/80810) ([Raúl Marín](https://github.com/Algunenano)). +* Extend exception message about "Having zero bytes, but read range is not finished...", add finished_download_time column to `system.filesystem_cache`. [#80849](https://github.com/ClickHouse/ClickHouse/pull/80849) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add search algorithm section to `EXPLAIN` output when using it with indexes = 1. If shows either "binary search" or "generic exclusion search". [#80881](https://github.com/ClickHouse/ClickHouse/pull/80881) ([Pablo Marcos](https://github.com/pamarcos)). +* At the beginning of 2024, `prefer_column_name_to_alias` was hardcoded to true for MySQL handler because the new analyzer was not enabled by default. Now, it can be unhardcoded. [#80916](https://github.com/ClickHouse/ClickHouse/pull/80916) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Now `system.iceberg_history` shows history for catalogs databases like glue or iceberg rest. Also renamed `table_name` and `database_name` columns to `table` and `database` in `system.iceberg_history` for consistency. [#80975](https://github.com/ClickHouse/ClickHouse/pull/80975) ([alesapin](https://github.com/alesapin)). +* Allow read-only mode for the `merge` table function, so the `CREATE TEMPORARY TABLE` grant is not required for using it. [#80981](https://github.com/ClickHouse/ClickHouse/pull/80981) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Better introspection of in-memory caches (expose information about caches in `system.metrics` over incomplete `system.asynchronouse_metrics`). Add in-memory caches size (in bytes) into `dashboard.html`. `VectorSimilarityIndexCacheSize`/`IcebergMetadataFilesCacheSize` has been renamed to `VectorSimilarityIndexCacheBytes`/`IcebergMetadataFilesCacheBytes`. [#81023](https://github.com/ClickHouse/ClickHouse/pull/81023) ([Azat Khuzhin](https://github.com/azat)). +* Ignore databases with engines that can't contain `RocksDB` tables while reading from `system.rocksdb`. [#81083](https://github.com/ClickHouse/ClickHouse/pull/81083) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Allow `filesystem_caches` and `named_collections` in the `clickhouse-local` configuration file. [#81105](https://github.com/ClickHouse/ClickHouse/pull/81105) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix highlighting of `PARTITION BY` in `INSERT` queries. In previous versions, `PARTITION BY` was not highlighted as a keyword. [#81106](https://github.com/ClickHouse/ClickHouse/pull/81106) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Two mini improvements in Web UI: - correctly handle queries without output, such as `CREATE`, `INSERT` (until recently, these queries resulted in an infinite spinner); - when double clicking on a table, scroll to the top. [#81131](https://github.com/ClickHouse/ClickHouse/pull/81131) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `MemoryResidentWithoutPageCache` metric provides the amount of physical memory used by the server process, excluding userspace page cache, in bytes. This provides a more accurate view of actual memory usage when userspace page cache is utilized. When userspace page cache is disabled, this value equals `MemoryResident`. [#81233](https://github.com/ClickHouse/ClickHouse/pull/81233) ([Jayme Bird](https://github.com/jaymebrd)). +* Mark manually logged exceptions in client, local server, keeper client and disks app as logged, so that they are not logged twice. [#81271](https://github.com/ClickHouse/ClickHouse/pull/81271) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Setting `use_skip_indexes_if_final` and `use_skip_indexes_if_final_exact_mode` now default to `True`. Queries with `FINAL` clause will now use skip indexes (if applicable) to shortlist granules and also read any additional granules corresponding to matching primary key ranges. Users needing earlier behaviour of approximate/imprecise results can set `use_skip_indexes_if_final_exact_mode` to FALSE after careful evaluation. [#81331](https://github.com/ClickHouse/ClickHouse/pull/81331) ([Shankar Iyer](https://github.com/shankar-iyer)). +* When you have multiple queries in the web UI, it will run the one under the cursor. Continuation of [#80977](https://github.com/ClickHouse/ClickHouse/issues/80977). [#81354](https://github.com/ClickHouse/ClickHouse/pull/81354) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* This PR addresses issues with the implementation of `is_strict` in the monotonicity checks for conversion functions. Currently, some conversion functions, such as `toFloat64(UInt32)` and `toDate(UInt8)`, incorrectly return `is_strict` as false when they should return true. [#81359](https://github.com/ClickHouse/ClickHouse/pull/81359) ([zoomxi](https://github.com/zoomxi)). +* When checking if a `KeyCondition` matches a continuous range, if the key is wrapped with a non-strict function chain, a `Constraint::POINT` may needs to be converted to a`Constraint::RANGE`. For example: `toDate(event_time) = '2025-06-03'` implies a range for `event_time`: ['2025-06-03 00:00:00', '2025-06-04 00:00:00'). This PR fixes this behavior. [#81400](https://github.com/ClickHouse/ClickHouse/pull/81400) ([zoomxi](https://github.com/zoomxi)). +* `clickhouse`/`ch` aliases will invoke `clickhouse-client` instead of `clickhouse-local` if `--host` or `--port` are specified. Continuation of [#79422](https://github.com/ClickHouse/ClickHouse/issues/79422). Closes [#65252](https://github.com/ClickHouse/ClickHouse/issues/65252). [#81509](https://github.com/ClickHouse/ClickHouse/pull/81509) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now that we have the keeper response time distribution data, we can tune the histogram buckets for metrics. [#81516](https://github.com/ClickHouse/ClickHouse/pull/81516) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Add profile event `PageCacheReadBytes`. [#81742](https://github.com/ClickHouse/ClickHouse/pull/81742) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error in filesystem cache: "Having zero bytes but range is not finished". [#81868](https://github.com/ClickHouse/ClickHouse/pull/81868) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix parameterized view with SELECT EXCEPT query. Closes [#49447](https://github.com/ClickHouse/ClickHouse/issues/49447). [#57380](https://github.com/ClickHouse/ClickHouse/pull/57380) ([Nikolay Degterinsky](https://github.com/evillique)). +* Analyzer: Fix column projection name after column type promotion in join. Closes [#63345](https://github.com/ClickHouse/ClickHouse/issues/63345). [#63519](https://github.com/ClickHouse/ClickHouse/pull/63519) ([Dmitry Novik](https://github.com/novikd)). +* Fixed a logical error in cases of column name clashes when analyzer_compatibility_join_using_top_level_identifier is enabled. [#75676](https://github.com/ClickHouse/ClickHouse/pull/75676) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix CTE usage in pushed-down predicates when `allow_push_predicate_ast_for_distributed_subqueries` is enabled. Fixes [#75647](https://github.com/ClickHouse/ClickHouse/issues/75647). Fixes [#79672](https://github.com/ClickHouse/ClickHouse/issues/79672). [#77316](https://github.com/ClickHouse/ClickHouse/pull/77316) ([Dmitry Novik](https://github.com/novikd)). +* Fixes an issue where SYSTEM SYNC REPLICA LIGHTWEIGHT 'foo' would report success even when the specified replica didn't exist. The command now properly validates that the replica exists in Keeper before attempting synchronization. [#78405](https://github.com/ClickHouse/ClickHouse/pull/78405) ([Jayme Bird](https://github.com/jaymebrd)). +* Fix crash for a very specific situation when the `currentDatabase` function was used in `CONSTRAINT` sections for `ON CLUSTER` queries Closes [#78100](https://github.com/ClickHouse/ClickHouse/issues/78100). [#79070](https://github.com/ClickHouse/ClickHouse/pull/79070) ([pufit](https://github.com/pufit)). +* Fix passing of external roles in interserver queries. [#79099](https://github.com/ClickHouse/ClickHouse/pull/79099) ([Andrey Zvonov](https://github.com/zvonand)). +* Try to use IColumn instead of Field in SingleValueDataGeneric. It fixes the incorrect return values for some aggregate functions like `argMax` for types `Dynamic/Variant/JSON`. [#79166](https://github.com/ClickHouse/ClickHouse/pull/79166) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix applying use_native_copy and allow_azure_native_copy setting for azure blob storage and updated to use native copy only when credentials match resolves [#78964](https://github.com/ClickHouse/ClickHouse/issues/78964). [#79561](https://github.com/ClickHouse/ClickHouse/pull/79561) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Fix logical errors about a column's unknown origin scope produced while checking if this column is correlated. Fixes [#78183](https://github.com/ClickHouse/ClickHouse/issues/78183). Fixes [#79451](https://github.com/ClickHouse/ClickHouse/issues/79451). [#79727](https://github.com/ClickHouse/ClickHouse/pull/79727) ([Dmitry Novik](https://github.com/novikd)). +* Fix wrong results for grouping sets with ColumnConst and Analyzer. [#79743](https://github.com/ClickHouse/ClickHouse/pull/79743) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix local shard result duplication when reading from distributed table with local replica being stale. [#79761](https://github.com/ClickHouse/ClickHouse/pull/79761) ([Eduard Karacharov](https://github.com/korowa)). +* Fix the sorting order of the NaNs with a negative sign bit. [#79847](https://github.com/ClickHouse/ClickHouse/pull/79847) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Now GROUP BY ALL doesn't take into account the GROUPING part. [#79915](https://github.com/ClickHouse/ClickHouse/pull/79915) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fixed incorrect state merging for `TopK` / `TopKWeighted` functions that would cause excessive error values even when capacity was not exhausted. [#79939](https://github.com/ClickHouse/ClickHouse/pull/79939) ([Joel Höner](https://github.com/athre0z)). +* Respect `readonly` setting in `azure_blob_storage` object storage. [#79954](https://github.com/ClickHouse/ClickHouse/pull/79954) ([Julia Kartseva](https://github.com/jkartseva)). +* Fixed incorrect query results and out-of-memory crashes when using `match(column, '^…')` with backslash-escaped characters. [#79969](https://github.com/ClickHouse/ClickHouse/pull/79969) ([filimonov](https://github.com/filimonov)). +* Disabling hive partitioning for datalakes Partially addresses https://github.com/issues/assigned?issue=ClickHouse%7CClickHouse%7C79937. [#80005](https://github.com/ClickHouse/ClickHouse/pull/80005) ([Daniil Ivanik](https://github.com/divanik)). +* Skip indexes with lambda expressions could not be applied. Fix the case when high-level functions in the index definition exactly match the one in the query. [#80025](https://github.com/ClickHouse/ClickHouse/pull/80025) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix metadata version during attach part on the replica executing ATTACH_PART command from replication log. [#80038](https://github.com/ClickHouse/ClickHouse/pull/80038) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Executable User Defined Functions (eUDF) names are not added to the `used_functions` column of the `system.query_log` table, unlike other functions. This PR implements the addition of the eUDF name if the eUDF was used in the request. [#80073](https://github.com/ClickHouse/ClickHouse/pull/80073) ([Kyamran](https://github.com/nibblerenush)). +* Fix logical error in Arrow format with LowCardinality(FixedString). [#80156](https://github.com/ClickHouse/ClickHouse/pull/80156) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix reading subcolumns from Merge engine. [#80158](https://github.com/ClickHouse/ClickHouse/pull/80158) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix a bug about the comparison between numeric types in `KeyCondition`. [#80207](https://github.com/ClickHouse/ClickHouse/pull/80207) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix AMBIGUOUS_COLUMN_NAME when lazy materialization applied to table with projections. [#80251](https://github.com/ClickHouse/ClickHouse/pull/80251) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix incorrect count optimization for string prefix filters like LIKE 'ab_c%' when using implicit projections. This fixes [#80250](https://github.com/ClickHouse/ClickHouse/issues/80250). [#80261](https://github.com/ClickHouse/ClickHouse/pull/80261) ([Amos Bird](https://github.com/amosbird)). +* Fix improper serialization of nested numeric fields as strings in MongoDB documents. Remove maximum depth limit for documents from MongoDB. [#80289](https://github.com/ClickHouse/ClickHouse/pull/80289) ([Kirill Nikiforov](https://github.com/allmazz)). +* Perform less strict metadata checks for RMT in the Replicated database. Closes [#80296](https://github.com/ClickHouse/ClickHouse/issues/80296). [#80298](https://github.com/ClickHouse/ClickHouse/pull/80298) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix text representation of DateTime and DateTime64 for PostgreSQL storage. [#80301](https://github.com/ClickHouse/ClickHouse/pull/80301) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Allow `DateTime` with timezone in `StripeLog` tables. This closes [#44120](https://github.com/ClickHouse/ClickHouse/issues/44120). [#80304](https://github.com/ClickHouse/ClickHouse/pull/80304) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable filter-push-down for the predicate with a non-deterministic function in case the query plan step changes the number of rows. Fixes [#40273](https://github.com/ClickHouse/ClickHouse/issues/40273). [#80329](https://github.com/ClickHouse/ClickHouse/pull/80329) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible logical errors and crashes in projections with subcolumns. [#80333](https://github.com/ClickHouse/ClickHouse/pull/80333) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix `NOT_FOUND_COLUMN_IN_BLOCK` error caused by filter-push-down optimization of the logical JOIN sep in case `ON` expression is not a trivial equality. Fixes [#79647](https://github.com/ClickHouse/ClickHouse/issues/79647) Fixes [#77848](https://github.com/ClickHouse/ClickHouse/issues/77848). [#80360](https://github.com/ClickHouse/ClickHouse/pull/80360) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect result when reading reverse-ordered keys in partitioned tables. This fixes [#79987](https://github.com/ClickHouse/ClickHouse/issues/79987). [#80448](https://github.com/ClickHouse/ClickHouse/pull/80448) ([Amos Bird](https://github.com/amosbird)). +* Fixed wrong sorting in tables with a nullable key and enabled optimize_read_in_order. [#80515](https://github.com/ClickHouse/ClickHouse/pull/80515) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fixed refreshable materialized view DROP getting stuck if the view was paused using SYSTEM STOP REPLICATED VIEW. [#80543](https://github.com/ClickHouse/ClickHouse/pull/80543) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix 'Cannot find column' with constant tuple in distributed query. [#80596](https://github.com/ClickHouse/ClickHouse/pull/80596) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix `shardNum` function in Distributed tables with `join_use_nulls`. [#80612](https://github.com/ClickHouse/ClickHouse/pull/80612) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Fix incorrect result during reading column that exists in subset of tables in Merge engine. [#80643](https://github.com/ClickHouse/ClickHouse/pull/80643) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix possible SSH protocol (due to hang in replxx). [#80688](https://github.com/ClickHouse/ClickHouse/pull/80688) ([Azat Khuzhin](https://github.com/azat)). +* The timestamp in the iceberg_history table should now be correct. [#80711](https://github.com/ClickHouse/ClickHouse/pull/80711) ([Melvyn Peignon](https://github.com/melvynator)). +* Fix possible crash in case of dictionary registration failed (when `CREATE DICTIONARY` failed with `CANNOT_SCHEDULE_TASK` it is possible to leave dangling pointer in the dictionary registry, which later lead to crash). [#80714](https://github.com/ClickHouse/ClickHouse/pull/80714) ([Azat Khuzhin](https://github.com/azat)). +* Fix handling of enum globs of a single element in object storage table functions. [#80716](https://github.com/ClickHouse/ClickHouse/pull/80716) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix wrong result type of comparison functions with Tuple(Dynamic) and String that led to logical error. [#80728](https://github.com/ClickHouse/ClickHouse/pull/80728) ([Pavel Kruglov](https://github.com/Avogar)). +* Add missing support data type `timestamp_ntz` for unity catalog. Fixes [#79535](https://github.com/ClickHouse/ClickHouse/issues/79535), Fixes [#79875](https://github.com/ClickHouse/ClickHouse/issues/79875). [#80740](https://github.com/ClickHouse/ClickHouse/pull/80740) ([alesapin](https://github.com/alesapin)). +* Fix `THERE_IS_NO_COLUMN` error for distributed queries with `IN cte`. Fixes [#75032](https://github.com/ClickHouse/ClickHouse/issues/75032). [#80757](https://github.com/ClickHouse/ClickHouse/pull/80757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix excessive number of files (leads to excessive memory usage) for external ORDER BY. [#80777](https://github.com/ClickHouse/ClickHouse/pull/80777) ([Azat Khuzhin](https://github.com/azat)). +* This PR might close [#80742](https://github.com/ClickHouse/ClickHouse/issues/80742). [#80783](https://github.com/ClickHouse/ClickHouse/pull/80783) ([zoomxi](https://github.com/zoomxi)). +* Fix crash in Kafka due to get_member_id() was creating std::string from NULL (it was likely an issue only in case of connection to broker had been failed). [#80793](https://github.com/ClickHouse/ClickHouse/pull/80793) ([Azat Khuzhin](https://github.com/azat)). +* Properly wait consumers before shutting down Kafka engine (active consumers after shutdown can trigger various debug assertions and also may read data from brokers in background after table has been dropped/detached). [#80795](https://github.com/ClickHouse/ClickHouse/pull/80795) ([Azat Khuzhin](https://github.com/azat)). +* Fix `NOT_FOUND_COLUMN_IN_BLOCK`, which is caused by `predicate-push-down` optimization. Fixes [#80443](https://github.com/ClickHouse/ClickHouse/issues/80443). [#80834](https://github.com/ClickHouse/ClickHouse/pull/80834) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix logical error when resolving star (*) matcher in table function in JOIN with USING. [#80894](https://github.com/ClickHouse/ClickHouse/pull/80894) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix memory accounting for Iceberg metadata files cache. [#80904](https://github.com/ClickHouse/ClickHouse/pull/80904) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong partitioning with nullable partition key. [#80913](https://github.com/ClickHouse/ClickHouse/pull/80913) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix `Table does not exist` error for distributed queries with pushed-down predicate (`allow_push_predicate_ast_for_distributed_subqueries=1`) when the source table does not exist on the initialtor. Fixes [#77281](https://github.com/ClickHouse/ClickHouse/issues/77281). [#80915](https://github.com/ClickHouse/ClickHouse/pull/80915) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix the logical error in the nested functions with named windows. [#80926](https://github.com/ClickHouse/ClickHouse/pull/80926) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix extremes for nullable and floating-point columns. [#80970](https://github.com/ClickHouse/ClickHouse/pull/80970) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix possible crash while querying from system.tables (likely the case under memory pressure). [#80976](https://github.com/ClickHouse/ClickHouse/pull/80976) ([Azat Khuzhin](https://github.com/azat)). +* Fix atomic rename with truncate for files which compression is inferred from their file extension. [#80979](https://github.com/ClickHouse/ClickHouse/pull/80979) ([Pablo Marcos](https://github.com/pamarcos)). +* Fix ErrorCodes::getName. [#81032](https://github.com/ClickHouse/ClickHouse/pull/81032) ([RinChanNOW](https://github.com/RinChanNOWWW)). +* Fix bug when user cannot list tables in Unity Catalog without permissions for all of them. Now all tables are listed properly, attempt to read from restricted table will throw an exception. [#81044](https://github.com/ClickHouse/ClickHouse/pull/81044) ([alesapin](https://github.com/alesapin)). +* Now ClickHouse will ignore errors and unexpected responses from data lake catalogs in `SHOW TABLES` query. Fixes [#79725](https://github.com/ClickHouse/ClickHouse/issues/79725). [#81046](https://github.com/ClickHouse/ClickHouse/pull/81046) ([alesapin](https://github.com/alesapin)). +* Fix parsing of DateTime64 from integers in JSONExtract and JSON type parsing. [#81050](https://github.com/ClickHouse/ClickHouse/pull/81050) ([Pavel Kruglov](https://github.com/Avogar)). +* Reflect date_time_input_format setting in schema inference cache. [#81052](https://github.com/ClickHouse/ClickHouse/pull/81052) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix crash on INSERT if table was DROPed after query started but before columns sent. [#81053](https://github.com/ClickHouse/ClickHouse/pull/81053) ([Azat Khuzhin](https://github.com/azat)). +* Fix use-of-uninitialized-value in quantileDeterministic. [#81062](https://github.com/ClickHouse/ClickHouse/pull/81062) ([Azat Khuzhin](https://github.com/azat)). +* Fix hardlinks count management for metadatastoragefromdisk disk transactions. add tests. [#81066](https://github.com/ClickHouse/ClickHouse/pull/81066) ([Sema Checherinda](https://github.com/CheSema)). +* User Defined Functions (UDF) names are not added to the `system.query_log` table, unlike other functions. This PR implements the addition of the UDF name to one of the two columns `used_executable_user_defined_functions` or `used_sql_user_defined_functions` if the UDF was used in the request. [#81101](https://github.com/ClickHouse/ClickHouse/pull/81101) ([Kyamran](https://github.com/nibblerenush)). +* Fixed `Too large size ... passed to allocator` errors or possible crashes on inserts via http protocol with text formats (`JSON`, `Values`, ...) and omitted `Enum` fields. [#81145](https://github.com/ClickHouse/ClickHouse/pull/81145) ([Anton Popov](https://github.com/CurtizJ)). +* Fix LOGICAL_ERROR in case of Sparse column in INSERT block pushed to non-MT MV. [#81161](https://github.com/ClickHouse/ClickHouse/pull/81161) ([Azat Khuzhin](https://github.com/azat)). +* Fix `Unknown table expression identifier` for `distributed_product_mode_local=local` with cross-replication. [#81162](https://github.com/ClickHouse/ClickHouse/pull/81162) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed incorrectly caching number of rows in parquet files after filtering. [#81184](https://github.com/ClickHouse/ClickHouse/pull/81184) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix fs cache max_size_to_total_space setting when used with relative cache path. [#81237](https://github.com/ClickHouse/ClickHouse/pull/81237) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed clickhouse-local crashing when outputting const tuples or maps in Parquet format. [#81249](https://github.com/ClickHouse/ClickHouse/pull/81249) ([Michael Kolupaev](https://github.com/al13n321)). +* Verify array offsets received over network. [#81269](https://github.com/ClickHouse/ClickHouse/pull/81269) ([Azat Khuzhin](https://github.com/azat)). +* Fix some corner case in query that joins empty tables and uses window functions. The bug leads to exploding number of parallel streams which leads to OOMs. [#81299](https://github.com/ClickHouse/ClickHouse/pull/81299) ([Alexander Gololobov](https://github.com/davenger)). +* Fixes for datalake Cluster functions (`deltaLakeCluster`, `icebergCluster`, etc): (1) fix potential segfault in `DataLakeConfiguration` when using `Cluster` function with old analyzer; (2) remove duplicating data lake metadata updates (extra object storage requests); (3) fix redundant listing in object storage when format is not explicitly specified (which was already done for non-cluster data lake engines). [#81300](https://github.com/ClickHouse/ClickHouse/pull/81300) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make force_restore_data flag recover lost keeper metadata. [#81324](https://github.com/ClickHouse/ClickHouse/pull/81324) ([Raúl Marín](https://github.com/Algunenano)). +* Fix region error in delta-kernel. Fixes [#79914](https://github.com/ClickHouse/ClickHouse/issues/79914). [#81353](https://github.com/ClickHouse/ClickHouse/pull/81353) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable incorrect JIT for divideOrNull. [#81370](https://github.com/ClickHouse/ClickHouse/pull/81370) ([Raúl Marín](https://github.com/Algunenano)). +* Fix insert error when MergeTree table has a long partition column name. [#81390](https://github.com/ClickHouse/ClickHouse/pull/81390) ([hy123q](https://github.com/haoyangqian)). +* Backported in [#81957](https://github.com/ClickHouse/ClickHouse/issues/81957): Fixed possible crash in `Aggregator` in case of exception during merge. [#81450](https://github.com/ClickHouse/ClickHouse/pull/81450) ([Nikita Taranov](https://github.com/nickitat)). +* Don't store content of several manifest files in memory. [#81470](https://github.com/ClickHouse/ClickHouse/pull/81470) ([Daniil Ivanik](https://github.com/divanik)). +* Fix possible crash during shutting down background pools (`background_.*pool_size`). [#81473](https://github.com/ClickHouse/ClickHouse/pull/81473) ([Azat Khuzhin](https://github.com/azat)). +* Fix out-of-bounds read in the `Npy` format happening when writing to a table with the `URL` engine. This closes [#81356](https://github.com/ClickHouse/ClickHouse/issues/81356). [#81502](https://github.com/ClickHouse/ClickHouse/pull/81502) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* There is a chance that Web UI displays `NaN%` (typical JavaScript problems). [#81507](https://github.com/ClickHouse/ClickHouse/pull/81507) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `DatabaseReplicated` for `database_replicated_enforce_synchronous_settings=1`. [#81564](https://github.com/ClickHouse/ClickHouse/pull/81564) ([Azat Khuzhin](https://github.com/azat)). +* Fix sorting order for LowCardinality(Nullable(...)) types. [#81583](https://github.com/ClickHouse/ClickHouse/pull/81583) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Server should not preserve a HTTP connection if the request has not been fully read from the socket. [#81595](https://github.com/ClickHouse/ClickHouse/pull/81595) ([Sema Checherinda](https://github.com/CheSema)). +* Make scalar correlated subqueries return a nullable result of the projection expression. Fix the case when a correlated subquery produces an empty result set. [#81632](https://github.com/ClickHouse/ClickHouse/pull/81632) ([Dmitry Novik](https://github.com/novikd)). +* Fix `Unexpected relative path for a deduplicated part` during `ATTACH` to `ReplicatedMergeTree`. [#81647](https://github.com/ClickHouse/ClickHouse/pull/81647) ([Azat Khuzhin](https://github.com/azat)). +* Query settings `use_iceberg_partition_pruning` will not take effect for iceberg storage, because it uses global context rather than query context. it's not critical because its default value is true. this pr can fix it. [#81673](https://github.com/ClickHouse/ClickHouse/pull/81673) ([Han Fei](https://github.com/hanfei1991)). +* Backported in [#82128](https://github.com/ClickHouse/ClickHouse/issues/82128): Fix "Context has expired" during merges when dict used in TTL expression. [#81690](https://github.com/ClickHouse/ClickHouse/pull/81690) ([Azat Khuzhin](https://github.com/azat)). +* Add validation for mergetree setting `merge_max_block_size` to ensure that it's non zero. [#81693](https://github.com/ClickHouse/ClickHouse/pull/81693) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix issues with `clickhouse-local` involving stuck `DROP VIEW ` queries. [#81705](https://github.com/ClickHouse/ClickHouse/pull/81705) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix StorageRedis join in some cases. [#81736](https://github.com/ClickHouse/ClickHouse/pull/81736) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix crash in `ConcurrentHashJoin` with empty `USING ()` and old analyzer enabled. [#81754](https://github.com/ClickHouse/ClickHouse/pull/81754) ([Nikita Taranov](https://github.com/nickitat)). +* Keeper fix: block commits of new logs if there is invalid entry in the logs. Previously, if leader applied some logs incorrectly, it would continue to commit new logs, even though the follower would detect digest mismatch and abort. [#81780](https://github.com/ClickHouse/ClickHouse/pull/81780) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix the issue where required columns are not read during scalar correlated subquery processing. Fixes [#81716](https://github.com/ClickHouse/ClickHouse/issues/81716). [#81805](https://github.com/ClickHouse/ClickHouse/pull/81805) ([Dmitry Novik](https://github.com/novikd)). +* Someone littered our code with Kusto. Cleaned it up. This closes [#81643](https://github.com/ClickHouse/ClickHouse/issues/81643). [#81885](https://github.com/ClickHouse/ClickHouse/pull/81885) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* In previous versions, the server returned excessive content for requests to `/js`. This closes [#61890](https://github.com/ClickHouse/ClickHouse/issues/61890). [#81895](https://github.com/ClickHouse/ClickHouse/pull/81895) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Previously, `MongoDB` table engine definitions could include a path component in the `host:port` argument which was silently ignored. The mongodb integration refuses to load such tables. With this fix *we allow loading such tables and ignore path component* if `MongoDB` engine has five arguments, using the database name from arguments. *Note:* The fix is not applied for newly created tables or queries with `mongo` table function, as well as for dictionary sources and named collections. [#81942](https://github.com/ClickHouse/ClickHouse/pull/81942) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fixed possible crash in `Aggregator` in case of exception during merge. [#82022](https://github.com/ClickHouse/ClickHouse/pull/82022) ([Nikita Taranov](https://github.com/nickitat)). +* Fixing copy-paste error in `arraySimilarity`, disallowing the use of `UInt32` and `Int32` weights. Update tests and docs. [#82103](https://github.com/ClickHouse/ClickHouse/pull/82103) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix possible data-race between suggestion thread and main client thread. [#82233](https://github.com/ClickHouse/ClickHouse/pull/82233) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement +* Use `postgres` 16.9. [#81437](https://github.com/ClickHouse/ClickHouse/pull/81437) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `openssl` 3.2.4. [#81438](https://github.com/ClickHouse/ClickHouse/pull/81438) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `abseil-cpp` 2025-01-27. [#81440](https://github.com/ClickHouse/ClickHouse/pull/81440) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `mongo-c-driver` 1.30.4. [#81449](https://github.com/ClickHouse/ClickHouse/pull/81449) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `krb5` 1.21.3-final. [#81453](https://github.com/ClickHouse/ClickHouse/pull/81453) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `orc` 2.1.2. [#81455](https://github.com/ClickHouse/ClickHouse/pull/81455) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `grpc` 1.73.0. [#81629](https://github.com/ClickHouse/ClickHouse/pull/81629) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Use `delta-kernel-rs` v0.12.1. [#81707](https://github.com/ClickHouse/ClickHouse/pull/81707) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Update `c-ares` to `v1.34.5`. [#81159](https://github.com/ClickHouse/ClickHouse/pull/81159) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Upgrade `curl` to 8.14 to address CVE-2025-5025 and CVE-2025-4947. [#81171](https://github.com/ClickHouse/ClickHouse/pull/81171) ([larryluogit](https://github.com/larryluogit)). +* Upgrade `libarchive` to 3.7.9 to address: CVE-2024-20696 CVE-2025-25724 CVE-2024-48958 CVE-2024-57970 CVE-2025-1632 CVE-2024-48957 CVE-2024-48615. [#81174](https://github.com/ClickHouse/ClickHouse/pull/81174) ([larryluogit](https://github.com/larryluogit)). +* Upgrade `libxml2` to 2.14.3. [#81187](https://github.com/ClickHouse/ClickHouse/pull/81187) ([larryluogit](https://github.com/larryluogit)). +* Avoid copying vendored Rust sources to `CARGO_HOME`. [#79560](https://github.com/ClickHouse/ClickHouse/pull/79560) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Remove dependency on the Sentry library by replacing it with our own endpoint. [#80236](https://github.com/ClickHouse/ClickHouse/pull/80236) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Update python dependencies in CI images to address Dependabot alerts. [#80658](https://github.com/ClickHouse/ClickHouse/pull/80658) ([Raúl Marín](https://github.com/Algunenano)). +* Retry reading of replicated DDL stop flag from Keeper at startup to make tests more robust when fault injection is enabled for Keeper. [#80964](https://github.com/ClickHouse/ClickHouse/pull/80964) ([Alexander Gololobov](https://github.com/davenger)). +* Use https for ubuntu archive url. [#81016](https://github.com/ClickHouse/ClickHouse/pull/81016) ([Raúl Marín](https://github.com/Algunenano)). +* Update python dependencies in test images. [#81042](https://github.com/ClickHouse/ClickHouse/pull/81042) ([dependabot[bot]](https://github.com/apps/dependabot)). +* Introduce `flake.nix` for Nix builds. [#81463](https://github.com/ClickHouse/ClickHouse/pull/81463) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix `delta-kernel-rs` requiring network access during build. Closes [#80609](https://github.com/ClickHouse/ClickHouse/issues/80609). [#81602](https://github.com/ClickHouse/ClickHouse/pull/81602) ([Konstantin Bogdanov](https://github.com/thevar1able)). Read the article [A Year of Rust in ClickHouse](https://clickhouse.com/blog/rust). + + +### ClickHouse release 25.5, 2025-05-22 {#255} + +#### Backward Incompatible Change +* Function `geoToH3` now accepts the input in the order (lat, lon, res) (which is common for other geometric functions). Users who wish to retain the previous result order (lon, lat, res) can set setting `geotoh3_argument_order = 'lon_lat'`. [#78852](https://github.com/ClickHouse/ClickHouse/pull/78852) ([Pratima Patel](https://github.com/pratimapatel2008)). +* Add a filesystem cache setting `allow_dynamic_cache_resize`, by default `false`, to allow dynamic resize of filesystem cache. Why: in certain environments (ClickHouse Cloud) all the scaling events happen through the restart of the process and we would love this feature to be explicitly disabled to have more control over the behaviour + as a safety measure. This PR is marked as backward incompatible, because in older versions dynamic cache resize worked by default without special setting. [#79148](https://github.com/ClickHouse/ClickHouse/pull/79148) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Removed support for legacy index types `annoy` and `usearch`. Both have been stubs for a long time, i.e. every attempt to use the legacy indexes returned an error anyways. If you still have `annoy` and `usearch` indexes, please drop them. [#79802](https://github.com/ClickHouse/ClickHouse/pull/79802) ([Robert Schulze](https://github.com/rschu1ze)). +* Remove `format_alter_commands_with_parentheses` server setting. The setting was introduced and disabled by default in 24.2. It was enabled by default in 25.2. As there are no LTS versions that don't support the new format, we can remove the setting. [#79970](https://github.com/ClickHouse/ClickHouse/pull/79970) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Enable `DeltaLake` storage `delta-kernel-rs` implementation by default. [#79541](https://github.com/ClickHouse/ClickHouse/pull/79541) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If reading from an `URL` involves multiple redirects, setting `enable_url_encoding` is correctly applied across all redirects in the chain. [#79563](https://github.com/ClickHouse/ClickHouse/pull/79563) ([Shankar Iyer](https://github.com/shankar-iyer)). Setting `enble_url_encoding` default value is now set to `false`. [#80088](https://github.com/ClickHouse/ClickHouse/pull/80088) ([Shankar Iyer](https://github.com/shankar-iyer)). + +#### New Feature +* Support scalar correlated subqueries in the WHERE clause. Closes [#6697](https://github.com/ClickHouse/ClickHouse/issues/6697). [#79600](https://github.com/ClickHouse/ClickHouse/pull/79600) ([Dmitry Novik](https://github.com/novikd)). Support correlated subqueries in the projection list in simple cases. [#79925](https://github.com/ClickHouse/ClickHouse/pull/79925) ([Dmitry Novik](https://github.com/novikd)). [#76078](https://github.com/ClickHouse/ClickHouse/pull/76078) ([Dmitry Novik](https://github.com/novikd)). Now it covers 100% of TPC-H test suite. +* Vector search using the vector similarity index is now beta (from previously experimental). [#80164](https://github.com/ClickHouse/ClickHouse/pull/80164) ([Robert Schulze](https://github.com/rschu1ze)). +* Support geo types in `Parquet` format. This closes [#75317](https://github.com/ClickHouse/ClickHouse/issues/75317). [#79777](https://github.com/ClickHouse/ClickHouse/pull/79777) ([scanhex12](https://github.com/scanhex12)). +* New functions `sparseGrams`, `sparseGramsHashes`, `sparseGramsHashesUTF8`, `sparseGramsUTF8` for calculating "sparse-ngrams" - a robust algorithm for extracting substrings for indexing and search. [#79517](https://github.com/ClickHouse/ClickHouse/pull/79517) ([scanhex12](https://github.com/scanhex12)). +* `clickhouse-local` (and its shorthand alias, `ch`) now use an implicit `FROM table` when there is input data for processing. This closes [#65023](https://github.com/ClickHouse/ClickHouse/issues/65023). Also enabled format inference in clickhouse-local if `--input-format` is not specified and it processes a regular file. [#79085](https://github.com/ClickHouse/ClickHouse/pull/79085) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `stringBytesUniq` and `stringBytesEntropy` functions to search for possibly random or encrypted data. [#79350](https://github.com/ClickHouse/ClickHouse/pull/79350) ([Sachin Kumar Singh](https://github.com/sachinkumarsingh092)). +* Added functions for encoding and decoding base32. [#79809](https://github.com/ClickHouse/ClickHouse/pull/79809) ([Joanna Hulboj](https://github.com/jh0x)). +* Add `getServerSetting` and `getMergeTreeSetting` function. Closes #78318. [#78439](https://github.com/ClickHouse/ClickHouse/pull/78439) ([NamNguyenHoai](https://github.com/NamHoaiNguyen)). +* Add new `iceberg_enable_version_hint` setting to leverage `version-hint.text` file. [#78594](https://github.com/ClickHouse/ClickHouse/pull/78594) ([Arnaud Briche](https://github.com/arnaudbriche)). +* Gives the possibility to truncate specific tables from a database, filtered with the `LIKE` keyword. [#78597](https://github.com/ClickHouse/ClickHouse/pull/78597) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Support `_part_starting_offset` virtual column in `MergeTree`-family tables. This column represents the cumulative row count of all preceding parts, calculated at query time based on the current part list. The cumulative values are retained throughout query execution and remain effective even after part pruning. Related internal logic has been refactored to support this behavior. [#79417](https://github.com/ClickHouse/ClickHouse/pull/79417) ([Amos Bird](https://github.com/amosbird)). +* Add functions `divideOrNull`,`moduloOrNull`, `intDivOrNull`,`positiveModuloOrNull` to return NULL when right argument is zero. [#78276](https://github.com/ClickHouse/ClickHouse/pull/78276) ([kevinyhzou](https://github.com/KevinyhZou)). +* Clickhouse vector search now supports both pre-filtering and post-filtering and provides related settings for finer control. (issue [#78161](https://github.com/ClickHouse/ClickHouse/issues/78161)). [#79854](https://github.com/ClickHouse/ClickHouse/pull/79854) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Add [`icebergHash`](https://iceberg.apache.org/spec/#appendix-b-32-bit-hash-requirements) and [`icebergBucket`](https://iceberg.apache.org/spec/#bucket-transform-details) functions. Support data files pruning in `Iceberg` tables partitioned with [`bucket transfom`](https://iceberg.apache.org/spec/#partitioning). [#79262](https://github.com/ClickHouse/ClickHouse/pull/79262) ([Daniil Ivanik](https://github.com/divanik)). + +#### Experimental Feature +* New `Time`/`Time64` data types: `Time` (HHH:MM:SS) and `Time64` (HHH:MM:SS.``) and some basic cast functions and functions to interact with other data types. Also, changed the existing function's name toTime to toTimeWithFixedDate because the function toTime is required for the cast function. [#75735](https://github.com/ClickHouse/ClickHouse/pull/75735) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +72459). +* Hive metastore catalog for Iceberg datalake. [#77677](https://github.com/ClickHouse/ClickHouse/pull/77677) ([scanhex12](https://github.com/scanhex12)). +* Indexes of type `full_text` were renamed to `gin`. This follows the more familiar terminology of PostgreSQL and other databases. Existing indexes of type `full_text` remain loadable but they will throw an exception (suggesting `gin` indexes instead) when one tries to use them in searches. [#79024](https://github.com/ClickHouse/ClickHouse/pull/79024) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Change the Compact part format to save marks for each substream to be able to read individual subcolumns. Old Compact format is still supported for reads and can be enabled for writes using MergeTree setting `write_marks_for_substreams_in_compact_parts`. It's disabled by default for safer upgrades as it changes the compact parts storage. It will be enabled by default in one of the next releases. [#77940](https://github.com/ClickHouse/ClickHouse/pull/77940) ([Pavel Kruglov](https://github.com/Avogar)). +* Allow moving conditions with subcolumns to prewhere. [#79489](https://github.com/ClickHouse/ClickHouse/pull/79489) ([Pavel Kruglov](https://github.com/Avogar)). +* Speed up secondary indices by evaluating their expressions on multiple granules at once. [#64109](https://github.com/ClickHouse/ClickHouse/pull/64109) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable `compile_expressions` (JIT compiler for fragments of ordinary expressions) by default. This closes [#51264](https://github.com/ClickHouse/ClickHouse/issues/51264) and [#56386](https://github.com/ClickHouse/ClickHouse/issues/56386) and [#66486](https://github.com/ClickHouse/ClickHouse/issues/66486). [#79907](https://github.com/ClickHouse/ClickHouse/pull/79907) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* New setting introduced: `use_skip_indexes_in_final_exact_mode`. If a query on a `ReplacingMergeTree` table has FINAL clause, reading only table ranges based on skip indexes may produce incorrect result. This setting can ensure that correct results are returned by scanning newer parts that have overlap with primary key ranges returned by the skip index. Set to 0 to disable, 1 to enable. [#78350](https://github.com/ClickHouse/ClickHouse/pull/78350) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Object storage cluster table functions (e.g. `s3Cluster`) will now assign files to replicas for reading based on consistent hash to improve cache locality. [#77326](https://github.com/ClickHouse/ClickHouse/pull/77326) ([Andrej Hoos](https://github.com/adikus)). +* Improve performance of `S3Queue`/`AzureQueue` by allowing INSERTs data in parallel (can be enabled with `parallel_inserts=true` queue setting). Previously S3Queue/AzureQueue can only do first part of pipeline in parallel (downloading, parsing), INSERT was single-threaded. And `INSERT`s are almost always the bottleneck. Now it will scale almost linear with `processing_threads_num`. [#77671](https://github.com/ClickHouse/ClickHouse/pull/77671) ([Azat Khuzhin](https://github.com/azat)). More fair max_processed_files_before_commit in S3Queue/AzureQueue. [#79363](https://github.com/ClickHouse/ClickHouse/pull/79363) ([Azat Khuzhin](https://github.com/azat)). +* Introduced threshold (regulated by setting `parallel_hash_join_threshold`) to fall back to the `hash` algorithm when the size of the right table is below the threshold. [#76185](https://github.com/ClickHouse/ClickHouse/pull/76185) ([Nikita Taranov](https://github.com/nickitat)). +* Now we use number of replicas to determine task size for reading with parallel replicas enabled. This provides better work distribution between replicas when the amount of data to read is not really big. [#78695](https://github.com/ClickHouse/ClickHouse/pull/78695) ([Nikita Taranov](https://github.com/nickitat)). +* Allow parallel merging of `uniqExact` states during the final stage of distributed aggregation. [#78703](https://github.com/ClickHouse/ClickHouse/pull/78703) ([Nikita Taranov](https://github.com/nickitat)). +* Fix possible performance degradation of the parallel merging of `uniqExact` states for aggregation with key. [#78724](https://github.com/ClickHouse/ClickHouse/pull/78724) ([Nikita Taranov](https://github.com/nickitat)). +* Reduce the number of List Blobs API calls to Azure storage. [#78860](https://github.com/ClickHouse/ClickHouse/pull/78860) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix performance of the distributed INSERT SELECT with parallel replicas. [#79441](https://github.com/ClickHouse/ClickHouse/pull/79441) ([Azat Khuzhin](https://github.com/azat)). +* Prevent `LogSeriesLimiter` from doing cleanup on every construction, avoiding lock contention and performance regressions in high-concurrency scenarios. [#79864](https://github.com/ClickHouse/ClickHouse/pull/79864) ([filimonov](https://github.com/filimonov)). +* Speedup queries with trivial count optimization. [#79945](https://github.com/ClickHouse/ClickHouse/pull/79945) ([Raúl Marín](https://github.com/Algunenano)). +* Better inlining for some operations with `Decimal`. [#79999](https://github.com/ClickHouse/ClickHouse/pull/79999) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Set `input_format_parquet_bloom_filter_push_down` to true by default. Also, fix a mistake in the settings changes history. [#80058](https://github.com/ClickHouse/ClickHouse/pull/80058) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimized `ALTER ... DELETE` mutations for parts in which all rows should be deleted. Now, in such cases an empty part is created instead of original without executing a mutation. [#79307](https://github.com/ClickHouse/ClickHouse/pull/79307) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid extra copying of the block during insertion into Compact part when possible. [#79536](https://github.com/ClickHouse/ClickHouse/pull/79536) ([Pavel Kruglov](https://github.com/Avogar)). +* Add setting `input_format_max_block_size_bytes` to limit blocks created in input formats in bytes. It can help to avoid high memory usage during data import when rows contains large values. [#79495](https://github.com/ClickHouse/ClickHouse/pull/79495) ([Pavel Kruglov](https://github.com/Avogar)). +* Remove guard pages for threads and async_socket_for_remote/use_hedge_requests. Change the allocation method in `FiberStack` from `mmap` to `aligned_alloc`. Since this splits VMAs and under heavy load vm.max_map_count can be reached. [#79147](https://github.com/ClickHouse/ClickHouse/pull/79147) ([Sema Checherinda](https://github.com/CheSema)). +* Lazy Materialization with parallel replicas. [#79401](https://github.com/ClickHouse/ClickHouse/pull/79401) ([Igor Nikonov](https://github.com/devcrafter)). + +#### Improvement +* Added an ability to apply lightweight deletes on the fly (with settings `lightweight_deletes_sync = 0`, `apply_mutations_on_fly = 1`. [#79281](https://github.com/ClickHouse/ClickHouse/pull/79281) ([Anton Popov](https://github.com/CurtizJ)). +* If data in the pretty format is displayed in the terminal, and a subsequent block has the same column widths, it can continue from the previous block, glue it to the previous block by moving the cursor up. This closes [#79333](https://github.com/ClickHouse/ClickHouse/issues/79333). The feature is controlled by the new setting, `output_format_pretty_glue_chunks`. [#79339](https://github.com/ClickHouse/ClickHouse/pull/79339) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Extend the `isIPAddressInRange` function to `String`, `IPv4`, `IPv6`, `Nullable(String)`, `Nullable(IPv4)`, and `Nullable(IPv6)` data types. [#78364](https://github.com/ClickHouse/ClickHouse/pull/78364) ([YjyJeff](https://github.com/YjyJeff)). +* Allow changing `PostgreSQL` engine connection pooler settings dynamically. [#78414](https://github.com/ClickHouse/ClickHouse/pull/78414) ([Samay Sharma](https://github.com/samay-sharma)). +* Allow to specify `_part_offset` in normal projection. This is the first step to build projection index. It can be used with [#58224](https://github.com/ClickHouse/ClickHouse/issues/58224) and can help improve #63207. [#78429](https://github.com/ClickHouse/ClickHouse/pull/78429) ([Amos Bird](https://github.com/amosbird)). +* Add new columns (`create_query` and `source`) for `system.named_collections`. Closes [#78179](https://github.com/ClickHouse/ClickHouse/issues/78179). [#78582](https://github.com/ClickHouse/ClickHouse/pull/78582) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Added a new field `condition` to system table `system.query_condition_cache`. It stores the plaintext condition whose hash is used as a key in the query condition cache. [#78671](https://github.com/ClickHouse/ClickHouse/pull/78671) ([Robert Schulze](https://github.com/rschu1ze)). +* Vector similarity indexes can now be created on top of `BFloat16` columns. [#78850](https://github.com/ClickHouse/ClickHouse/pull/78850) ([Robert Schulze](https://github.com/rschu1ze)). +* Support unix timestapms with fractional part in best effort `DateTime64` parsing. [#78908](https://github.com/ClickHouse/ClickHouse/pull/78908) ([Pavel Kruglov](https://github.com/Avogar)). +* In the storage `DeltaLake` delta-kernel implementation, fix for column mapping mode, add tests for schema evolution. [#78921](https://github.com/ClickHouse/ClickHouse/pull/78921) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improve insert into `Variant` column in Values format by better conversion of values. [#78923](https://github.com/ClickHouse/ClickHouse/pull/78923) ([Pavel Kruglov](https://github.com/Avogar)). +* The `tokens` function was extended to accept an additional "tokenizer" argument plus further tokenizer-specific arguments. [#79001](https://github.com/ClickHouse/ClickHouse/pull/79001) ([Elmi Ahmadov](https://github.com/ahmadov)). +* The `SHOW CLUSTER` statement now expands macros (if any) in its argument. [#79006](https://github.com/ClickHouse/ClickHouse/pull/79006) ([arf42](https://github.com/arf42)). +* Hash functions now support `NULL`s inside arrays, tuples, and maps. (issues [#48365](https://github.com/ClickHouse/ClickHouse/issues/48365) and [#48623](https://github.com/ClickHouse/ClickHouse/issues/48623)). [#79008](https://github.com/ClickHouse/ClickHouse/pull/79008) ([Michael Kolupaev](https://github.com/al13n321)). +* Update cctz to 2025a. [#79043](https://github.com/ClickHouse/ClickHouse/pull/79043) ([Raúl Marín](https://github.com/Algunenano)). +* Change the default stderr processing for UDFs to "log_last". It's better for usability. [#79066](https://github.com/ClickHouse/ClickHouse/pull/79066) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make tabs undo-able in the Web UI. This closes [#71284](https://github.com/ClickHouse/ClickHouse/issues/71284). [#79084](https://github.com/ClickHouse/ClickHouse/pull/79084) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove settings during `recoverLostReplica` same as it was done in: https://github.com/ClickHouse/ClickHouse/pull/78637. [#79113](https://github.com/ClickHouse/ClickHouse/pull/79113) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add profile events: `ParquetReadRowGroups` and `ParquetPrunedRowGroups` to profile parquet index prune. [#79180](https://github.com/ClickHouse/ClickHouse/pull/79180) ([flynn](https://github.com/ucasfl)). +* Support `ALTER`ing database on cluster. [#79242](https://github.com/ClickHouse/ClickHouse/pull/79242) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Explicitly skip missed runs of statistics collection for QueryMetricLog, otherwise the log will take a long time to catch up with the current time. [#79257](https://github.com/ClickHouse/ClickHouse/pull/79257) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Some small optimizations for reading `Arrow`-based formats. [#79308](https://github.com/ClickHouse/ClickHouse/pull/79308) ([Bharat Nallan](https://github.com/bharatnc)). +* The setting `allow_archive_path_syntax` was marked as experimental by mistake. Add a test to prevent having experimental settings enabled by default. [#79320](https://github.com/ClickHouse/ClickHouse/pull/79320) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Made page cache settings adjustable on a per-query level. This is needed for faster experimentation and for the possibility of fine-tuning for high-throughput and low-latency queries. [#79337](https://github.com/ClickHouse/ClickHouse/pull/79337) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Do not print number tips in pretty formats for numbers that look like most of the 64-bit hashes. This closes [#79334](https://github.com/ClickHouse/ClickHouse/issues/79334). [#79338](https://github.com/ClickHouse/ClickHouse/pull/79338) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Colors of graphs on the advanced dashboards will be calculated from the hash of the corresponding query. This makes it easier to remember and locate a graph while scrolling the dashboard. [#79341](https://github.com/ClickHouse/ClickHouse/pull/79341) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add asynchronous metric, `FilesystemCacheCapacity` - total capacity in the `cache` virtual filesystem. This is useful for global infrastructure monitoring. [#79348](https://github.com/ClickHouse/ClickHouse/pull/79348) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimize access to system.parts (read columns/indexes size only when requested). [#79352](https://github.com/ClickHouse/ClickHouse/pull/79352) ([Azat Khuzhin](https://github.com/azat)). +* Calculate the relevant fields for query `'SHOW CLUSTER '` instead of all fields. [#79368](https://github.com/ClickHouse/ClickHouse/pull/79368) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Allow to specify storage settings for `DatabaseCatalog`. [#79407](https://github.com/ClickHouse/ClickHouse/pull/79407) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support local storage in `DeltaLake`. [#79416](https://github.com/ClickHouse/ClickHouse/pull/79416) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a query level setting to enable delta-kernel-rs: `allow_experimental_delta_kernel_rs`. [#79418](https://github.com/ClickHouse/ClickHouse/pull/79418) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible endless loop when listing blobs from Azure/S3 blob storage. [#79425](https://github.com/ClickHouse/ClickHouse/pull/79425) ([Alexander Gololobov](https://github.com/davenger)). +* Add filesystem cache setting `max_size_ratio_to_total_space`. [#79460](https://github.com/ClickHouse/ClickHouse/pull/79460) ([Kseniia Sumarokova](https://github.com/kssenii)). +* For `clickhouse-benchmark` reconfigure `reconnect` option to take 0, 1 or N as values for reconnecting accordingly. [#79465](https://github.com/ClickHouse/ClickHouse/pull/79465) ([Sachin Kumar Singh](https://github.com/sachinkumarsingh092)). +* Allow `ALTER TABLE ... MOVE|REPLACE PARTITION` for tables on different `plain_rewritable` disks. [#79566](https://github.com/ClickHouse/ClickHouse/pull/79566) ([Julia Kartseva](https://github.com/jkartseva)). +* The vector similarity index is now also used if the reference vector is of type `Array(BFloat16)`. [#79745](https://github.com/ClickHouse/ClickHouse/pull/79745) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Add last_error_message, last_error_trace and query_id to the system.error_log table. Related ticket [#75816](https://github.com/ClickHouse/ClickHouse/issues/75816). [#79836](https://github.com/ClickHouse/ClickHouse/pull/79836) ([Andrei Tinikov](https://github.com/Dolso)). +* Enable sending crash reports by default. This can be turned off in the server's configuration file. [#79838](https://github.com/ClickHouse/ClickHouse/pull/79838) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* System table `system.functions` now shows in which ClickHouse version functions were first introduced. [#79839](https://github.com/ClickHouse/ClickHouse/pull/79839) ([Robert Schulze](https://github.com/rschu1ze)). +* Added `access_control_improvements.enable_user_name_access_type` setting. This setting allows enabling/disabling of precise grants for users/roles, introduced in https://github.com/ClickHouse/ClickHouse/pull/72246. You may want to turn this setting off in case you have a cluster with the replicas older than 25.1. [#79842](https://github.com/ClickHouse/ClickHouse/pull/79842) ([pufit](https://github.com/pufit)). +* Proper implementation of `ASTSelectWithUnionQuery::clone()` method now takes into account `is_normalized` field as well. This might help with [#77569](https://github.com/ClickHouse/ClickHouse/issues/77569). [#79909](https://github.com/ClickHouse/ClickHouse/pull/79909) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix the inconsistent formatting of certain queries with the EXCEPT operator. If the left-hand side of the EXCEPT operator ends with `*`, the formatted query loses parentheses and is then parsed as a `*` with the `EXCEPT` modifier. These queries are found by the fuzzer and are unlikely to be found in practice. This closes [#79950](https://github.com/ClickHouse/ClickHouse/issues/79950). [#79952](https://github.com/ClickHouse/ClickHouse/pull/79952) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Small improvement in `JSON` type parsing by using cache of variants deserialization order. [#79984](https://github.com/ClickHouse/ClickHouse/pull/79984) ([Pavel Kruglov](https://github.com/Avogar)). +* Add setting `s3_slow_all_threads_after_network_error`. [#80035](https://github.com/ClickHouse/ClickHouse/pull/80035) ([Vitaly Baranov](https://github.com/vitlibar)). +* The logging level about the selected parts to merge was wrong (Information). Closes [#80061](https://github.com/ClickHouse/ClickHouse/issues/80061). [#80062](https://github.com/ClickHouse/ClickHouse/pull/80062) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* trace-visualizer: add runtime/share in tooltips and status messages. [#79040](https://github.com/ClickHouse/ClickHouse/pull/79040) ([Sergei Trifonov](https://github.com/serxa)). +* trace-visualizer: load data from clickhouse server. [#79042](https://github.com/ClickHouse/ClickHouse/pull/79042) ([Sergei Trifonov](https://github.com/serxa)). +* Add metrics on failing merges. [#79228](https://github.com/ClickHouse/ClickHouse/pull/79228) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* `clickhouse-benchmark` will display percentage based on the max iterations if specified. [#79346](https://github.com/ClickHouse/ClickHouse/pull/79346) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add system.parts table visualizer. [#79437](https://github.com/ClickHouse/ClickHouse/pull/79437) ([Sergei Trifonov](https://github.com/serxa)). +* Add tool for query latency analyzing. [#79978](https://github.com/ClickHouse/ClickHouse/pull/79978) ([Sergei Trifonov](https://github.com/serxa)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix renames of columns missing in part. [#76346](https://github.com/ClickHouse/ClickHouse/pull/76346) ([Anton Popov](https://github.com/CurtizJ)). +* A materialized view can start too late, e.g. after the Kafka table that streams to it. [#72123](https://github.com/ClickHouse/ClickHouse/pull/72123) ([Ilya Golshtein](https://github.com/ilejn)). +* Fix `SELECT` query rewriting during `VIEW` creation with enabled analyzer. closes [#75956](https://github.com/ClickHouse/ClickHouse/issues/75956). [#76356](https://github.com/ClickHouse/ClickHouse/pull/76356) ([Dmitry Novik](https://github.com/novikd)). +* Fix applying `async_insert` from server (via `apply_settings_from_server`) (previously leads to `Unknown packet 11 from server` errors on the client). [#77578](https://github.com/ClickHouse/ClickHouse/pull/77578) ([Azat Khuzhin](https://github.com/azat)). +* Fixed refreshable materialized view in Replicated database not working on newly added replicas. [#77774](https://github.com/ClickHouse/ClickHouse/pull/77774) ([Michael Kolupaev](https://github.com/al13n321)). +* Fixed refreshable materialized views breaking backups. [#77893](https://github.com/ClickHouse/ClickHouse/pull/77893) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix old firing logical error for `transform`. [#78247](https://github.com/ClickHouse/ClickHouse/pull/78247) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix some cases where secondary index was not applied with analyzer. Fixes [#65607](https://github.com/ClickHouse/ClickHouse/issues/65607) , fixes [#69373](https://github.com/ClickHouse/ClickHouse/issues/69373). [#78485](https://github.com/ClickHouse/ClickHouse/pull/78485) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix dumping profile events (`NetworkSendElapsedMicroseconds`/`NetworkSendBytes`) for HTTP protocol with compression enabled (the error should not be more then the buffer size, usually around 1MiB). [#78516](https://github.com/ClickHouse/ClickHouse/pull/78516) ([Azat Khuzhin](https://github.com/azat)). +* Fix analyzer producing LOGICAL_ERROR when JOIN ... USING involves ALIAS column - should produce appropriate error. [#78618](https://github.com/ClickHouse/ClickHouse/pull/78618) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix analyzer: CREATE VIEW ... ON CLUSTER fails if SELECT contains positional arguments. [#78663](https://github.com/ClickHouse/ClickHouse/pull/78663) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix `Block structure mismatch` error in case of `INSERT SELECT` into table a function with schema inference if `SELECT` has scalar subqueries. [#78677](https://github.com/ClickHouse/ClickHouse/pull/78677) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix analyzer: with prefer_global_in_and_join=1 for Distributed table in SELECT query `in` function should be replaced by `globalIn`. [#78749](https://github.com/ClickHouse/ClickHouse/pull/78749) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fixed several types of `SELECT` queries that read from tables with `MongoDB` engine or `mongodb` table function: queries with implicit conversion of const value in `WHERE` clause (e.g. `WHERE datetime = '2025-03-10 00:00:00'`) ; queries with `LIMIT` and `GROUP BY`. Previously, they could return the wrong result. [#78777](https://github.com/ClickHouse/ClickHouse/pull/78777) ([Anton Popov](https://github.com/CurtizJ)). +* Fix conversion between different JSON types. Not it's performed by simple cast through convertion to/from String. It's less effective but 100% accurate. [#78807](https://github.com/ClickHouse/ClickHouse/pull/78807) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix logical error during convertion of Dynamic type to Interval. [#78813](https://github.com/ClickHouse/ClickHouse/pull/78813) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix column rollback on JSON parsing error. [#78836](https://github.com/ClickHouse/ClickHouse/pull/78836) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix 'bad cast' error when join using constant alias column. [#78848](https://github.com/ClickHouse/ClickHouse/pull/78848) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Don't allow prewhere in materialized view on columns with different types in view and target table. [#78889](https://github.com/ClickHouse/ClickHouse/pull/78889) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix logical error during parsing of bad binary data of Variant column. [#78982](https://github.com/ClickHouse/ClickHouse/pull/78982) ([Pavel Kruglov](https://github.com/Avogar)). +* Throw an exception when the parquet batch size is set to 0. Previously when output_format_parquet_batch_size = 0 ClickHouse would hang. Now this behavior is fixed. [#78991](https://github.com/ClickHouse/ClickHouse/pull/78991) ([daryawessely](https://github.com/daryawessely)). +* Fix deserialization of variant discriminators with basic format in compact parts. It was introduced in https://github.com/ClickHouse/ClickHouse/pull/55518. [#79000](https://github.com/ClickHouse/ClickHouse/pull/79000) ([Pavel Kruglov](https://github.com/Avogar)). +* Dictionaries of type `complex_key_ssd_cache` now reject zero or negative `block_size` and `write_buffer_size` parameters (issue [#78314](https://github.com/ClickHouse/ClickHouse/issues/78314)). [#79028](https://github.com/ClickHouse/ClickHouse/pull/79028) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Avoid using Field for non-aggregated columns in SummingMergeTree. It could lead to unexpected errors with Dynamic/Variant types used in SummingMergeTree. [#79051](https://github.com/ClickHouse/ClickHouse/pull/79051) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix read from Materialized View with Distributed destination table and different header in analyzer. [#79059](https://github.com/ClickHouse/ClickHouse/pull/79059) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixes a bug where `arrayUnion()` returned extra (incorrect) values on tables that had batch inserts. Fixes [#75057](https://github.com/ClickHouse/ClickHouse/issues/75057). [#79079](https://github.com/ClickHouse/ClickHouse/pull/79079) ([Peter Nguyen](https://github.com/petern48)). +* Fix segfault in `OpenSSLInitializer`. Closes [#79092](https://github.com/ClickHouse/ClickHouse/issues/79092). [#79097](https://github.com/ClickHouse/ClickHouse/pull/79097) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Always set prefix for S3 ListObject. [#79114](https://github.com/ClickHouse/ClickHouse/pull/79114) ([Azat Khuzhin](https://github.com/azat)). +* Fixes a bug where arrayUnion() returned extra (incorrect) values on tables that had batch inserts. Fixes [#79157](https://github.com/ClickHouse/ClickHouse/issues/79157). [#79158](https://github.com/ClickHouse/ClickHouse/pull/79158) ([Peter Nguyen](https://github.com/petern48)). +* Fix logical error after filter pushdown. [#79164](https://github.com/ClickHouse/ClickHouse/pull/79164) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix DeltaLake table engine with delta-kernel implementation being used with http based endpoints, fix NOSIGN. Closes [#78124](https://github.com/ClickHouse/ClickHouse/issues/78124). [#79203](https://github.com/ClickHouse/ClickHouse/pull/79203) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Keeper fix: Avoid triggering watches on failed multi requests. [#79247](https://github.com/ClickHouse/ClickHouse/pull/79247) ([Antonio Andelic](https://github.com/antonio2368)). +* Forbid Dynamic and JSON types in IN. With current implementation of `IN` it can lead to incorrect results. Proper support of this types in `IN` is complicated and can be done in future. [#79282](https://github.com/ClickHouse/ClickHouse/pull/79282) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix check for duplicate paths in JSON type parsing. [#79317](https://github.com/ClickHouse/ClickHouse/pull/79317) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix SecureStreamSocket connection issues. [#79383](https://github.com/ClickHouse/ClickHouse/pull/79383) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix loading of plain_rewritable disks containing data. [#79439](https://github.com/ClickHouse/ClickHouse/pull/79439) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix crash in dynamic subcolumns discovery in Wide parts in MergeTree. [#79466](https://github.com/ClickHouse/ClickHouse/pull/79466) ([Pavel Kruglov](https://github.com/Avogar)). +* Verify the table name's length only for initial create queries. Do not verify this for secondary creates to avoid backward compatibility issues. [#79488](https://github.com/ClickHouse/ClickHouse/pull/79488) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Fixed error `Block structure mismatch` in several cases with tables with sparse columns. [#79491](https://github.com/ClickHouse/ClickHouse/pull/79491) ([Anton Popov](https://github.com/CurtizJ)). +* Fix two cases of "Logical Error: Can't set alias of * of Asterisk on alias". [#79505](https://github.com/ClickHouse/ClickHouse/pull/79505) ([Raúl Marín](https://github.com/Algunenano)). +* Fix using incorrect paths when renaming an Atomic database. [#79569](https://github.com/ClickHouse/ClickHouse/pull/79569) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Fix order by JSON column with other columns. [#79591](https://github.com/ClickHouse/ClickHouse/pull/79591) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix result duplication when reading from remote with both `use_hedged_requests` and `allow_experimental_parallel_reading_from_replicas` disabled. [#79599](https://github.com/ClickHouse/ClickHouse/pull/79599) ([Eduard Karacharov](https://github.com/korowa)). +* Fix crash in delta-kernel implementation when using unity catalog. [#79677](https://github.com/ClickHouse/ClickHouse/pull/79677) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Resolve macros for autodiscovery clusters. [#79696](https://github.com/ClickHouse/ClickHouse/pull/79696) ([Anton Ivashkin](https://github.com/ianton-ru)). +* Handle incorrectly configured page_cache_limits suitably. [#79805](https://github.com/ClickHouse/ClickHouse/pull/79805) ([Bharat Nallan](https://github.com/bharatnc)). +* Fixes the result of SQL function `formatDateTime` if a variable-size formatter (e.g. `%W` aka. weekday `Monday` `Tuesday`, etc.) is followed by a compound formatter (a formatter that prints multiple components at once, e.g. `%D` aka. the American date `05/04/25`). [#79835](https://github.com/ClickHouse/ClickHouse/pull/79835) ([Robert Schulze](https://github.com/rschu1ze)). +* IcebergS3 supports count optimization, but IcebergS3Cluster does not. As a result, the count() result returned in cluster mode may be a multiple of the number of replicas. [#79844](https://github.com/ClickHouse/ClickHouse/pull/79844) ([wxybear](https://github.com/wxybear)). +* Fixes AMBIGUOUS_COLUMN_NAME error with lazy materialization when no columns are used for query execution until projection. Example, SELECT * FROM t ORDER BY rand() LIMIT 5. [#79926](https://github.com/ClickHouse/ClickHouse/pull/79926) ([Igor Nikonov](https://github.com/devcrafter)). +* Hide password for query `CREATE DATABASE datalake ENGINE = DataLakeCatalog(\'http://catalog:8181\', \'admin\', \'password\')`. [#79941](https://github.com/ClickHouse/ClickHouse/pull/79941) ([Han Fei](https://github.com/hanfei1991)). +* Allow to specify an alias in JOIN USING. Specify this alias in case the column was renamed (e.g., because of ARRAY JOIN). Fixes [#73707](https://github.com/ClickHouse/ClickHouse/issues/73707). [#79942](https://github.com/ClickHouse/ClickHouse/pull/79942) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow materialized views with UNIONs to work correctly on new replicas. [#80037](https://github.com/ClickHouse/ClickHouse/pull/80037) ([Samay Sharma](https://github.com/samay-sharma)). +* Format specifier `%e` in SQL function `parseDateTime` now recognizes single-digit days (e.g. `3`), whereas it previously required space padding (e.g. ` 3`). This makes its behavior compatible with MySQL. To retain the previous behaviour, set setting `parsedatetime_e_requires_space_padding = 1`. (issue [#78243](https://github.com/ClickHouse/ClickHouse/issues/78243)). [#80057](https://github.com/ClickHouse/ClickHouse/pull/80057) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix warnings `Cannot find 'kernel' in '[...]/memory.stat'` in ClickHouse's log (issue [#77410](https://github.com/ClickHouse/ClickHouse/issues/77410)). [#80129](https://github.com/ClickHouse/ClickHouse/pull/80129) ([Robert Schulze](https://github.com/rschu1ze)). +* Check stack size in FunctionComparison to avoid stack overflow crash. [#78208](https://github.com/ClickHouse/ClickHouse/pull/78208) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix race during SELECT from `system.workloads`. [#78743](https://github.com/ClickHouse/ClickHouse/pull/78743) ([Sergei Trifonov](https://github.com/serxa)). +* Fix: lazy materialization in distributed queries. [#78815](https://github.com/ClickHouse/ClickHouse/pull/78815) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix `Array(Bool)` to `Array(FixedString)` conversion. [#78863](https://github.com/ClickHouse/ClickHouse/pull/78863) ([Nikita Taranov](https://github.com/nickitat)). +* Make parquet version selection less confusing. [#78818](https://github.com/ClickHouse/ClickHouse/pull/78818) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix `ReservoirSampler` self-merging. [#79031](https://github.com/ClickHouse/ClickHouse/pull/79031) ([Nikita Taranov](https://github.com/nickitat)). +* Fix storage of insertion table in client context. [#79046](https://github.com/ClickHouse/ClickHouse/pull/79046) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Fix the destruction order of data members of `AggregatingSortedAlgorithm` and `SummingSortedAlgorithm`. [#79056](https://github.com/ClickHouse/ClickHouse/pull/79056) ([Nikita Taranov](https://github.com/nickitat)). +* `enable_user_name_access_type` must not affect `DEFINER` access type. [#80026](https://github.com/ClickHouse/ClickHouse/pull/80026) ([pufit](https://github.com/pufit)). +* Query to system database can hang if system database metadata located in keeper. [#79304](https://github.com/ClickHouse/ClickHouse/pull/79304) ([Mikhail Artemenko](https://github.com/Michicosun)). + +#### Build/Testing/Packaging Improvement +* Make it possible to reuse the built `chcache` binary instead of always rebuilding it. [#78851](https://github.com/ClickHouse/ClickHouse/pull/78851) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Add NATS pause waiting. [#78987](https://github.com/ClickHouse/ClickHouse/pull/78987) ([Dmitry Novikov](https://github.com/dmitry-sles-novikov)). +* Fix for incorrectly publishing ARM build as amd64compat. [#79122](https://github.com/ClickHouse/ClickHouse/pull/79122) ([Alexander Gololobov](https://github.com/davenger)). +* Use generated ahead of time assembly for OpenSSL. [#79386](https://github.com/ClickHouse/ClickHouse/pull/79386) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fixes to allow building with `clang20`. [#79588](https://github.com/ClickHouse/ClickHouse/pull/79588) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* `chcache`: Rust caching support. [#78691](https://github.com/ClickHouse/ClickHouse/pull/78691) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Add unwind information for `zstd` assembly files. [#79288](https://github.com/ClickHouse/ClickHouse/pull/79288) ([Michael Kolupaev](https://github.com/al13n321)). + + +### ClickHouse release 25.4, 2025-04-22 {#254} + +#### Backward Incompatible Change +* Check if all columns in a materialized view match the target table when `allow_materialized_view_with_bad_select` is `false`. [#74481](https://github.com/ClickHouse/ClickHouse/pull/74481) ([Christoph Wurm](https://github.com/cwurm)). +* Fix cases where `dateTrunc` is used with negative Date/DateTime arguments. [#77622](https://github.com/ClickHouse/ClickHouse/pull/77622) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* The legacy `MongoDB` integration has been removed. Server setting `use_legacy_mongodb_integration` became obsolete and now does nothing. [#77895](https://github.com/ClickHouse/ClickHouse/pull/77895) ([Robert Schulze](https://github.com/rschu1ze)). +* Enhance `SummingMergeTree` validation to skip aggregation for columns used in partition or sort keys. [#78022](https://github.com/ClickHouse/ClickHouse/pull/78022) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). + +#### New Feature +* Added CPU slot scheduling for workloads, see [the docs](https://clickhouse.com/docs/operations/workload-scheduling#cpu_scheduling) for details. [#77595](https://github.com/ClickHouse/ClickHouse/pull/77595) ([Sergei Trifonov](https://github.com/serxa)). +* `clickhouse-local` will retain its databases after restart if you specify the `--path` command line argument. This closes [#50647](https://github.com/ClickHouse/ClickHouse/issues/50647). This closes [#49947](https://github.com/ClickHouse/ClickHouse/issues/49947). [#71722](https://github.com/ClickHouse/ClickHouse/pull/71722) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Reject queries when the server is overloaded. The decision is made based on the ratio of wait time (`OSCPUWaitMicroseconds`) to busy time (`OSCPUVirtualTimeMicroseconds`). The query is dropped with some probability, when this ratio is between `min_os_cpu_wait_time_ratio_to_throw` and `max_os_cpu_wait_time_ratio_to_throw` (those are query level settings). [#63206](https://github.com/ClickHouse/ClickHouse/pull/63206) ([Alexey Katsman](https://github.com/alexkats)). +* Time travel in `Iceberg`: add setting to query `Iceberg` tables as of a specific timestamp. [#71072](https://github.com/ClickHouse/ClickHouse/pull/71072) ([Brett Hoerner](https://github.com/bretthoerner)). [#77439](https://github.com/ClickHouse/ClickHouse/pull/77439) ([Daniil Ivanik](https://github.com/divanik)). +* An in-memory cache for `Iceberg` metadata, which stores manifest files/list and `metadata.json` to speed up queries. [#77156](https://github.com/ClickHouse/ClickHouse/pull/77156) ([Han Fei](https://github.com/hanfei1991)). +* Support `DeltaLake` table engine for Azure Blob Storage. Fixes [#68043](https://github.com/ClickHouse/ClickHouse/issues/68043). [#74541](https://github.com/ClickHouse/ClickHouse/pull/74541) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Added an in-memory cache for deserialized vector similarity indexes. This should make repeated approximate nearest neighbor (ANN) search queries faster. The size of the new cache is controlled by server settings `vector_similarity_index_cache_size` and `vector_similarity_index_cache_max_entries`. This feature supersedes the skipping index cache feature of earlier releases. [#77905](https://github.com/ClickHouse/ClickHouse/pull/77905) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Support partition pruning in DeltaLake. [#78486](https://github.com/ClickHouse/ClickHouse/pull/78486) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support for a background refresh in readonly `MergeTree` tables which allows querying updateable tables with an infinite amount of distributed readers (ClickHouse-native data lake). [#76467](https://github.com/ClickHouse/ClickHouse/pull/76467) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support using custom disks to store databases metadata files. Currently it can be configured only on a global server level. [#77365](https://github.com/ClickHouse/ClickHouse/pull/77365) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Support ALTER TABLE ... ATTACH|DETACH|MOVE|REPLACE PARTITION for the plain_rewritable disk. [#77406](https://github.com/ClickHouse/ClickHouse/pull/77406) ([Julia Kartseva](https://github.com/jkartseva)). +* Add table settings for `SASL` configuration and credentials to the `Kafka` table engine. This allows configuring SASL-based authentication to Kafka and Kafka-compatible systems directly in the CREATE TABLE statement rather than having to use configuration files or named collections. [#78810](https://github.com/ClickHouse/ClickHouse/pull/78810) ([Christoph Wurm](https://github.com/cwurm)). +* Allow setting `default_compression_codec` for MergeTree tables: it is used when the CREATE query does not explicitly define one for the given columns. This closes [#42005](https://github.com/ClickHouse/ClickHouse/issues/42005). [#66394](https://github.com/ClickHouse/ClickHouse/pull/66394) ([gvoelfin](https://github.com/gvoelfin)). +* Add `bind_host` setting in the clusters configuration so that ClickHouse can use a specific network for distributed connections. [#74741](https://github.com/ClickHouse/ClickHouse/pull/74741) ([Todd Yocum](https://github.com/toddyocum)). +* Introduce a new column, `parametrized_view_parameters` in `system.tables`. Closes https://github.com/clickhouse/clickhouse/issues/66756. [#75112](https://github.com/ClickHouse/ClickHouse/pull/75112) ([NamNguyenHoai](https://github.com/NamHoaiNguyen)). +* Allow changing a database comment. Closes [#73351](https://github.com/ClickHouse/ClickHouse/issues/73351) ### Documentation entry for user-facing changes. [#75622](https://github.com/ClickHouse/ClickHouse/pull/75622) ([NamNguyenHoai](https://github.com/NamHoaiNguyen)). +* Support `SCRAM-SHA-256` authentication in the PostgreSQL compatibility protocol. [#76839](https://github.com/ClickHouse/ClickHouse/pull/76839) ([scanhex12](https://github.com/scanhex12)). +* Add functions `arrayLevenshteinDistance`, `arrayLevenshteinDistanceWeighted`, and `arraySimilarity`. [#77187](https://github.com/ClickHouse/ClickHouse/pull/77187) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* The setting `parallel_distributed_insert_select` makes effect for `INSERT SELECT` into `ReplicatedMergeTree` (previously it required Distribued tables). [#78041](https://github.com/ClickHouse/ClickHouse/pull/78041) ([Igor Nikonov](https://github.com/devcrafter)). +* Introduce `toInterval` function. This function accepts 2 arguments (value and unit), and converts the value to a specific `Interval` type. [#78723](https://github.com/ClickHouse/ClickHouse/pull/78723) ([Andrew Davis](https://github.com/pulpdrew)). +* Add several convenient ways to resolve root `metadata.json` file in an iceberg table function and engine. Closes [#78455](https://github.com/ClickHouse/ClickHouse/issues/78455). [#78475](https://github.com/ClickHouse/ClickHouse/pull/78475) ([Daniil Ivanik](https://github.com/divanik)). +* Support password based auth in SSH protocol in ClickHouse. [#78586](https://github.com/ClickHouse/ClickHouse/pull/78586) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Experimental Feature +* Support correlated subqueries as an argument of `EXISTS` expression in the `WHERE` clause. Closes [#72459](https://github.com/ClickHouse/ClickHouse/issues/72459). [#76078](https://github.com/ClickHouse/ClickHouse/pull/76078) ([Dmitry Novik](https://github.com/novikd)). +* Functions `sparseGrams` and `sparseGramsHashes` with ASCII and UTF8 versions added. Author: [scanhex12](https://github.com/scanhex12). [#78176](https://github.com/ClickHouse/ClickHouse/pull/78176) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). Do not use it: the implementation will change in the next versions. + +#### Performance Improvement +* Optimize performance with lazy columns, that read the data after ORDER BY and LIMIT. [#55518](https://github.com/ClickHouse/ClickHouse/pull/55518) ([Xiaozhe Yu](https://github.com/wudidapaopao)). +* Enabled the query condition cache by default. [#79080](https://github.com/ClickHouse/ClickHouse/pull/79080) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Speed-up building JOIN result by de-virtualizing calls to `col->insertFrom()`. [#77350](https://github.com/ClickHouse/ClickHouse/pull/77350) ([Alexander Gololobov](https://github.com/davenger)). +* Merge equality conditions from filter query plan step into JOIN condition if possible to allow using them as hash table keys. [#78877](https://github.com/ClickHouse/ClickHouse/pull/78877) ([Dmitry Novik](https://github.com/novikd)). +* Use dynamic sharding for JOIN if the JOIN key is a prefix of PK for both parts. This optimization is enabled with `query_plan_join_shard_by_pk_ranges` setting (disabled by default). [#74733](https://github.com/ClickHouse/ClickHouse/pull/74733) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support `Iceberg` data pruning based on lower and upper boundary values for columns. Fixes [#77638](https://github.com/ClickHouse/ClickHouse/issues/77638). [#78242](https://github.com/ClickHouse/ClickHouse/pull/78242) ([alesapin](https://github.com/alesapin)). +* Implement trivial count optimization for `Iceberg`. Now queries with `count()` and without any filters should be faster. Closes [#77639](https://github.com/ClickHouse/ClickHouse/issues/77639). [#78090](https://github.com/ClickHouse/ClickHouse/pull/78090) ([alesapin](https://github.com/alesapin)). +* Add ability to configure the number of columns that merges can flush in parallel using `max_merge_delayed_streams_for_parallel_write` (this should reduce memory usage for vertical merges to S3 about 25x times). [#77922](https://github.com/ClickHouse/ClickHouse/pull/77922) ([Azat Khuzhin](https://github.com/azat)). +* Disable `filesystem_cache_prefer_bigger_buffer_size` when the cache is used passively, such as for merges. This lowers memory consumption on merges. [#77898](https://github.com/ClickHouse/ClickHouse/pull/77898) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now we use number of replicas to determine task size for reading with parallel replicas enabled. This provides better work distribution between replicas when the amount of data to read is not really big. [#78695](https://github.com/ClickHouse/ClickHouse/pull/78695) ([Nikita Taranov](https://github.com/nickitat)). +* Support asynchronous IO prefetch for the `ORC` format, which improves overall performance by hiding remote IO latency. [#70534](https://github.com/ClickHouse/ClickHouse/pull/70534) ([李扬](https://github.com/taiyang-li)). +* Preallocate memory used by asynchronous inserts to improve performance. [#74945](https://github.com/ClickHouse/ClickHouse/pull/74945) ([Ilya Golshtein](https://github.com/ilejn)). +* Decrease the amount of Keeper requests by eliminating the use of single `get` requests, which could have caused a significant load on Keeper with the increased number of replicas, in places where `multiRead` is available. [#56862](https://github.com/ClickHouse/ClickHouse/pull/56862) ([Nikolay Degterinsky](https://github.com/evillique)). +* A marginal optimization for running functions on Nullable arguments. [#76489](https://github.com/ClickHouse/ClickHouse/pull/76489) ([李扬](https://github.com/taiyang-li)). +* Optimize `arraySort`. [#76850](https://github.com/ClickHouse/ClickHouse/pull/76850) ([李扬](https://github.com/taiyang-li)). +* Merge marks of the same part and write them to the query condition cache at one time to reduce the consumption of locks. [#77377](https://github.com/ClickHouse/ClickHouse/pull/77377) ([zhongyuankai](https://github.com/zhongyuankai)). +* Optimize `s3Cluster` performance for queries with one bracket expansion. [#77686](https://github.com/ClickHouse/ClickHouse/pull/77686) ([Tomáš Hromada](https://github.com/gyfis)). +* Optimize order by single Nullable or LowCardinality columns. [#77789](https://github.com/ClickHouse/ClickHouse/pull/77789) ([李扬](https://github.com/taiyang-li)). +* Optimize memory usage of the `Native` format. [#78442](https://github.com/ClickHouse/ClickHouse/pull/78442) ([Azat Khuzhin](https://github.com/azat)). +* Trivial optimization: do not rewrite `count(if(...))` to `countIf` if a type cast is required. Close [#78564](https://github.com/ClickHouse/ClickHouse/issues/78564). [#78565](https://github.com/ClickHouse/ClickHouse/pull/78565) ([李扬](https://github.com/taiyang-li)). +* The `hasAll` function can now take advantage of the `tokenbf_v1`, `ngrambf_v1` full-text skipping indices. [#77662](https://github.com/ClickHouse/ClickHouse/pull/77662) ([UnamedRus](https://github.com/UnamedRus)). +* Vector similarity index could over-allocate main memory by up to 2x. This fix reworks the memory allocation strategy, reducing the memory consumption and improving the effectiveness of the vector similarity index cache. (issue [#78056](https://github.com/ClickHouse/ClickHouse/issues/78056)). [#78394](https://github.com/ClickHouse/ClickHouse/pull/78394) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Introduce a setting `schema_type` for `system.metric_log` table with schema type. There are three allowed schemas: `wide` -- current schema, each metric/event in a separate column (most effective for reads of separate columns), `transposed` -- similar to `system.asynchronous_metric_log`, metrics/events are stored as rows, and the most interesting `transposed_with_wide_view` -- create underlying table with `transposed` schema, but also introduce a view with `wide` schema which translates queries to underlying table. In `transposed_with_wide_view` subsecond resolution for view is not supported, `event_time_microseconds` is just an alias for backward compatibility. [#78412](https://github.com/ClickHouse/ClickHouse/pull/78412) ([alesapin](https://github.com/alesapin)). + +#### Improvement +* Serialize query plan for `Distributed` queries. A new setting `serialize_query_plan` is added. When enabled, queries from `Distributed` table will use a serialized query plan for remote query execution. This introduces a new packet type to TCP protocol, `true` should be added to the server config to allow processing this packet. [#69652](https://github.com/ClickHouse/ClickHouse/pull/69652) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support `JSON` type and subcolumns reading from views. [#76903](https://github.com/ClickHouse/ClickHouse/pull/76903) ([Pavel Kruglov](https://github.com/Avogar)). +* Support ALTER DATABASE ... ON CLUSTER. [#79242](https://github.com/ClickHouse/ClickHouse/pull/79242) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Refreshes of refreshable materialized views now appear in `system.query_log`. [#71333](https://github.com/ClickHouse/ClickHouse/pull/71333) ([Michael Kolupaev](https://github.com/al13n321)). +* User-defined functions (UDFs) can now be marked as deterministic via a new setting in their configuration. Also, the query cache now checks if UDFs called within a query are deterministic. If this is the case, it caches the query result. (Issue [#59988](https://github.com/ClickHouse/ClickHouse/issues/59988)). [#77769](https://github.com/ClickHouse/ClickHouse/pull/77769) ([Jimmy Aguilar Mena](https://github.com/Ergus)). +* Enabled a backoff logic for all types of replicated tasks. It will provide the ability to reduce CPU usage, memory usage, and log file sizes. Added new settings `max_postpone_time_for_failed_replicated_fetches_ms`, `max_postpone_time_for_failed_replicated_merges_ms` and `max_postpone_time_for_failed_replicated_tasks_ms` which are similar to `max_postpone_time_for_failed_mutations_ms`. [#74576](https://github.com/ClickHouse/ClickHouse/pull/74576) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Add `query_id` to `system.errors`. Closes [#75815](https://github.com/ClickHouse/ClickHouse/issues/75815). [#76581](https://github.com/ClickHouse/ClickHouse/pull/76581) ([Vladimir Baikov](https://github.com/bkvvldmr)). +* Adding support for converting `UInt128` to `IPv6`. This allows the `bitAnd` operation and arithmatics for `IPv6` and conversion back to `IPv6`. Closes [#76752](https://github.com/ClickHouse/ClickHouse/issues/76752). This allows the result from `bitAnd` operation on `IPv6` to be converted back to `IPv6`, as well. See also [#57707](https://github.com/ClickHouse/ClickHouse/pull/57707). [#76928](https://github.com/ClickHouse/ClickHouse/pull/76928) ([Muzammil Abdul Rehman](https://github.com/muzammilar)). +* Don't parse special `Bool` values in text formats inside `Variant` type by default. It can be enabled using setting `allow_special_bool_values_inside_variant`. [#76974](https://github.com/ClickHouse/ClickHouse/pull/76974) ([Pavel Kruglov](https://github.com/Avogar)). +* Support configurable per task waiting time of low `priority` query in session level and in server level. [#77013](https://github.com/ClickHouse/ClickHouse/pull/77013) ([VicoWu](https://github.com/VicoWu)). +* Implement comparison for values of JSON data type. Now JSON objects can be compared similarly to Maps. [#77397](https://github.com/ClickHouse/ClickHouse/pull/77397) ([Pavel Kruglov](https://github.com/Avogar)). +* Better permission support by `system.kafka_consumers`. Forward internal `librdkafka` errors (worth noting that this library is a crap). [#77700](https://github.com/ClickHouse/ClickHouse/pull/77700) ([Ilya Golshtein](https://github.com/ilejn)). +* Added validation for the settings of the Buffer table engine. [#77840](https://github.com/ClickHouse/ClickHouse/pull/77840) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Add config `enable_hdfs_pread` to enable or disable pread in `HDFS`. [#77885](https://github.com/ClickHouse/ClickHouse/pull/77885) ([kevinyhzou](https://github.com/KevinyhZou)). +* Add profile events for number of zookeeper `multi` read and write requests. [#77888](https://github.com/ClickHouse/ClickHouse/pull/77888) ([JackyWoo](https://github.com/JackyWoo)). +* Allow creating and inserting into temporary tables when `disable_insertion_and_mutation` is on. [#77901](https://github.com/ClickHouse/ClickHouse/pull/77901) ([Xu Jia](https://github.com/XuJia0210)). +* Decrease `max_insert_delayed_streams_for_parallel_write` (to 100). [#77919](https://github.com/ClickHouse/ClickHouse/pull/77919) ([Azat Khuzhin](https://github.com/azat)). +* Fix year parsing in Joda syntax (this is from the Java world if you're wondering) like `yyy`. [#77973](https://github.com/ClickHouse/ClickHouse/pull/77973) ([李扬](https://github.com/taiyang-li)). +* Attaching parts of `MergeTree` tables will be performed in their block order, which is important for special merging algorithms, such as `ReplacingMergeTree`. This closes [#71009](https://github.com/ClickHouse/ClickHouse/issues/71009). [#77976](https://github.com/ClickHouse/ClickHouse/pull/77976) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Query masking rules are now able to throw a `LOGICAL_ERROR` in case if the match happened. This will help to check if pre-defined password is leaking anywhere in logs. [#78094](https://github.com/ClickHouse/ClickHouse/pull/78094) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added column `index_length_column` to `information_schema.tables` for better compatibility with MySQL. [#78119](https://github.com/ClickHouse/ClickHouse/pull/78119) ([Paweł Zakrzewski](https://github.com/KrzaQ)). +* Introduce two new metrics: `TotalMergeFailures` and `NonAbortedMergeFailures`. These metrics are needed to detect the cases where too many merges fail within a short period. [#78150](https://github.com/ClickHouse/ClickHouse/pull/78150) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Fix incorrect S3 URL parsing when key is not specified on path style. [#78185](https://github.com/ClickHouse/ClickHouse/pull/78185) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix incorrect values of `BlockActiveTime`, `BlockDiscardTime`, `BlockWriteTime`, `BlockQueueTime`, and `BlockReadTime` asynchronous metrics (before the change 1 second was incorrectly reported as 0.001). [#78211](https://github.com/ClickHouse/ClickHouse/pull/78211) ([filimonov](https://github.com/filimonov)). +* Respect `loading_retries` limit for errors during push to materialized view for StorageS3(Azure)Queue. Before that such errors were retried indefinitely. [#78313](https://github.com/ClickHouse/ClickHouse/pull/78313) ([Kseniia Sumarokova](https://github.com/kssenii)). +* In DeltaLake with `delta-kernel-rs` implementation, fix performance and progress bar. [#78368](https://github.com/ClickHouse/ClickHouse/pull/78368) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support `include`, `from_env`, `from_zk` for runtime disks. Closes [#78177](https://github.com/ClickHouse/ClickHouse/issues/78177). [#78470](https://github.com/ClickHouse/ClickHouse/pull/78470) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a dynamic warning to the `system.warnings` table for long running mutations. [#78658](https://github.com/ClickHouse/ClickHouse/pull/78658) ([Bharat Nallan](https://github.com/bharatnc)). +* Added field `condition` to system table `system.query_condition_cache`. It stores the plaintext condition whose hash is used as a key in the query condition cache. [#78671](https://github.com/ClickHouse/ClickHouse/pull/78671) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow an empty value for Hive partitioning. [#78816](https://github.com/ClickHouse/ClickHouse/pull/78816) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix `IN` clause type coercion for `BFloat16` (i.e. `SELECT toBFloat16(1) IN [1, 2, 3];` now returns `1`). Closes [#78754](https://github.com/ClickHouse/ClickHouse/issues/78754). [#78839](https://github.com/ClickHouse/ClickHouse/pull/78839) ([Raufs Dunamalijevs](https://github.com/rienath)). +* Do not check parts on other disks for `MergeTree` if `disk = ...` is set. [#78855](https://github.com/ClickHouse/ClickHouse/pull/78855) ([Azat Khuzhin](https://github.com/azat)). +* Make data types in `used_data_type_families` in `system.query_log` to be recorded with canonical names. [#78972](https://github.com/ClickHouse/ClickHouse/pull/78972) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Cleanup settings during `recoverLostReplica` same as it was done in: [#78637](https://github.com/ClickHouse/ClickHouse/pull/78637). [#79113](https://github.com/ClickHouse/ClickHouse/pull/79113) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Use insertion columns for INFILE schema inference. [#78490](https://github.com/ClickHouse/ClickHouse/pull/78490) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix incorrect projection analysis when `count(Nullable)` is used in aggregate projections. This fixes [#74495](https://github.com/ClickHouse/ClickHouse/issues/74495) . This PR also adds some logs around projection analysis to clarify why a projection is used or why not. [#74498](https://github.com/ClickHouse/ClickHouse/pull/74498) ([Amos Bird](https://github.com/amosbird)). +* Fix `Part <...> does not contain in snapshot of previous virtual parts. (PART_IS_TEMPORARILY_LOCKED)` during `DETACH PART`. [#76039](https://github.com/ClickHouse/ClickHouse/pull/76039) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix not working skip indexes with expression with literals in analyzer and remove trivial casts during indexes analysis. [#77229](https://github.com/ClickHouse/ClickHouse/pull/77229) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix a bug when `close_session` query parameter didn't have any effect leading to named sessions being closed only after `session_timeout`. [#77336](https://github.com/ClickHouse/ClickHouse/pull/77336) ([Alexey Katsman](https://github.com/alexkats)). +* Fixed receiving messages from NATS server without attached Materialized Views. [#77392](https://github.com/ClickHouse/ClickHouse/pull/77392) ([Dmitry Novikov](https://github.com/dmitry-sles-novikov)). +* Fix logical error while reading from empty `FileLog` via `merge` table function, close [#75575](https://github.com/ClickHouse/ClickHouse/issues/75575). [#77441](https://github.com/ClickHouse/ClickHouse/pull/77441) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Use default format settings in `Dynamic` serialization from shared variant. [#77572](https://github.com/ClickHouse/ClickHouse/pull/77572) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix checking if the table data path exists on the local disk. [#77608](https://github.com/ClickHouse/ClickHouse/pull/77608) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Fix sending constant values to remote for some types. [#77634](https://github.com/ClickHouse/ClickHouse/pull/77634) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix a crash because of expired context in S3/AzureQueue. [#77720](https://github.com/ClickHouse/ClickHouse/pull/77720) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Hide credentials in RabbitMQ, Nats, Redis, AzureQueue table engines. [#77755](https://github.com/ClickHouse/ClickHouse/pull/77755) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix undefined behaviour on `NaN` comparison in `argMin`/`argMax`. [#77756](https://github.com/ClickHouse/ClickHouse/pull/77756) ([Raúl Marín](https://github.com/Algunenano)). +* Regularly check if merges and mutations were cancelled even in case when the operation doesn't produce any blocks to write. [#77766](https://github.com/ClickHouse/ClickHouse/pull/77766) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Fixed refreshable materialized view in Replicated database not working on newly added replicas. [#77774](https://github.com/ClickHouse/ClickHouse/pull/77774) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix possible crash when `NOT_FOUND_COLUMN_IN_BLOCK` error occurs. [#77854](https://github.com/ClickHouse/ClickHouse/pull/77854) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Fix crash that happens in the S3/AzureQueue while filling data. [#77878](https://github.com/ClickHouse/ClickHouse/pull/77878) ([Bharat Nallan](https://github.com/bharatnc)). +* Disable fuzzy search for history in SSH server (since it requires the skim library). [#78002](https://github.com/ClickHouse/ClickHouse/pull/78002) ([Azat Khuzhin](https://github.com/azat)). +* Fixes a bug that a vector search query on a non-indexed column was returning incorrect results if there was another vector column in the table with a defined vector similarity index. (Issue [#77978](https://github.com/ClickHouse/ClickHouse/issues/77978)). [#78069](https://github.com/ClickHouse/ClickHouse/pull/78069) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Fix a minuscule error "The requested output format {} is binary... Do you want to output it anyway? [y/N]" prompt. [#78095](https://github.com/ClickHouse/ClickHouse/pull/78095) ([Azat Khuzhin](https://github.com/azat)). +* Fix of a bug in case of `toStartOfInterval` with zero origin argument. [#78096](https://github.com/ClickHouse/ClickHouse/pull/78096) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Disallow specifying an empty `session_id` query parameter for HTTP interface. [#78098](https://github.com/ClickHouse/ClickHouse/pull/78098) ([Alexey Katsman](https://github.com/alexkats)). +* Fix metadata override in `Replicated` database which could have happened due to a `RENAME` query executed right after an `ALTER` query. [#78107](https://github.com/ClickHouse/ClickHouse/pull/78107) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix crash in `NATS` engine. [#78108](https://github.com/ClickHouse/ClickHouse/pull/78108) ([Dmitry Novikov](https://github.com/dmitry-sles-novikov)). +* Do not try to create history_file in embedded client for SSH (in previous versions the creation was always unsuccessful, but attempted). [#78112](https://github.com/ClickHouse/ClickHouse/pull/78112) ([Azat Khuzhin](https://github.com/azat)). +* Fix `system.detached_tables` displaying incorrect information after `RENAME DATABASE` or `DROP TABLE` queries. [#78126](https://github.com/ClickHouse/ClickHouse/pull/78126) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix for checks for too many tables with `Replicated` database after [#77274](https://github.com/ClickHouse/ClickHouse/pull/77274). Also, perform the check before creating the storage to avoid creating unaccounted nodes in Keeper in the case of `ReplicatedMergeTree` or `KeeperMap`. [#78127](https://github.com/ClickHouse/ClickHouse/pull/78127) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix possible crash due to concurrent `S3Queue` metadata initialization. [#78131](https://github.com/ClickHouse/ClickHouse/pull/78131) ([Azat Khuzhin](https://github.com/azat)). +* `groupArray*` functions now produce `BAD_ARGUMENTS` error for Int-typed 0 value of the `max_size` argument, like it's already done for UInt one, instead of trying to execute with it. [#78140](https://github.com/ClickHouse/ClickHouse/pull/78140) ([Eduard Karacharov](https://github.com/korowa)). +* Prevent crash on recovering a lost replica if the local table is removed before it's detached. [#78173](https://github.com/ClickHouse/ClickHouse/pull/78173) ([Raúl Marín](https://github.com/Algunenano)). +* Fix the fact that "alterable" column in `system.s3_queue_settings` returning always `false`. [#78187](https://github.com/ClickHouse/ClickHouse/pull/78187) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Mask Azure access signature to be not visible to user or in logs. [#78189](https://github.com/ClickHouse/ClickHouse/pull/78189) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix prefetching of substreams with prefixes in Wide parts. [#78205](https://github.com/ClickHouse/ClickHouse/pull/78205) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixed crashes / incorrect result for `mapFromArrays` in case of `LowCardinality(Nullable)` type of keys array. [#78240](https://github.com/ClickHouse/ClickHouse/pull/78240) ([Eduard Karacharov](https://github.com/korowa)). +* Fix delta-kernel-rs auth options. [#78255](https://github.com/ClickHouse/ClickHouse/pull/78255) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Not schedule Refreshable Materialized Views task if a replica's `disable_insertion_and_mutation` is true. A task is some insertion, it will failed if `disable_insertion_and_mutation` is true. [#78277](https://github.com/ClickHouse/ClickHouse/pull/78277) ([Xu Jia](https://github.com/XuJia0210)). +* Validate access to underlying tables for the `Merge` engine. [#78339](https://github.com/ClickHouse/ClickHouse/pull/78339) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* `FINAL` modifier can be ignored when querying a `Distributed` table. [#78428](https://github.com/ClickHouse/ClickHouse/pull/78428) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* `bitmapMin` returns the uint32_max when the bitmap is empty (and uint64_max when the input type is larger), which matches the behavior of empty roaring_bitmap's minimum. [#78444](https://github.com/ClickHouse/ClickHouse/pull/78444) ([wxybear](https://github.com/wxybear)). +* Disable parallelization of query processing right after reading FROM when `distributed_aggregation_memory_efficient` enabled, it may lead to logical error. Closes [#76934](https://github.com/ClickHouse/ClickHouse/issues/76934). [#78500](https://github.com/ClickHouse/ClickHouse/pull/78500) ([flynn](https://github.com/ucasfl)). +* Set at least one stream for reading in case there are zero planned streams after applying `max_streams_to_max_threads_ratio` setting. [#78505](https://github.com/ClickHouse/ClickHouse/pull/78505) ([Eduard Karacharov](https://github.com/korowa)). +* In storage `S3Queue` fix logical error "Cannot unregister: table uuid is not registered". Closes [#78285](https://github.com/ClickHouse/ClickHouse/issues/78285). [#78541](https://github.com/ClickHouse/ClickHouse/pull/78541) ([Kseniia Sumarokova](https://github.com/kssenii)). +* ClickHouse is now able to figure out its cgroup v2 on systems with both cgroups v1 and v2 enabled. [#78566](https://github.com/ClickHouse/ClickHouse/pull/78566) ([Grigory Korolev](https://github.com/gkorolev)). +* `-Cluster` table functions were failing when used with table-level settings. [#78587](https://github.com/ClickHouse/ClickHouse/pull/78587) ([Daniil Ivanik](https://github.com/divanik)). +* Better checks when transactions are not supported by ReplicatedMergeTree on INSERT. [#78633](https://github.com/ClickHouse/ClickHouse/pull/78633) ([Azat Khuzhin](https://github.com/azat)). +* Cleanup query settings during attach. [#78637](https://github.com/ClickHouse/ClickHouse/pull/78637) ([Raúl Marín](https://github.com/Algunenano)). +* Fix a crash when an invalid path was specified in `iceberg_metadata_file_path`. [#78688](https://github.com/ClickHouse/ClickHouse/pull/78688) ([alesapin](https://github.com/alesapin)). +* In `DeltaLake` table engine with delta-kernel-s implementation, fix the case when the read schema is different from the table schema and there are partition columns at the same time leading to a "not found column" error. [#78690](https://github.com/ClickHouse/ClickHouse/pull/78690) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix a problem when after scheduling to close a named session (but before timeout expiration), creation of a new named session with the same name led to it being closed at a time point when the first session was scheduled to close. [#78698](https://github.com/ClickHouse/ClickHouse/pull/78698) ([Alexey Katsman](https://github.com/alexkats)). +* Fixed several types of `SELECT` queries that read from tables with `MongoDB` engine or `mongodb` table function: queries with implicit conversion of const value in `WHERE` clause (e.g. `WHERE datetime = '2025-03-10 00:00:00'`) ; queries with `LIMIT` and `GROUP BY`. Previously, they could return the wrong result. [#78777](https://github.com/ClickHouse/ClickHouse/pull/78777) ([Anton Popov](https://github.com/CurtizJ)). +* Don't block table shutdown while running `CHECK TABLE`. [#78782](https://github.com/ClickHouse/ClickHouse/pull/78782) ([Raúl Marín](https://github.com/Algunenano)). +* Keeper fix: fix ephemeral count in all cases. [#78799](https://github.com/ClickHouse/ClickHouse/pull/78799) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix bad cast in `StorageDistributed` when using table functions other than `view`. Closes [#78464](https://github.com/ClickHouse/ClickHouse/issues/78464). [#78828](https://github.com/ClickHouse/ClickHouse/pull/78828) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix the consistency of formatting for `tupleElement(*, 1)`. Closes [#78639](https://github.com/ClickHouse/ClickHouse/issues/78639). [#78832](https://github.com/ClickHouse/ClickHouse/pull/78832) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Dictionaries of type `ssd_cache` now reject zero or negative `block_size` and `write_buffer_size` parameters (issue [#78314](https://github.com/ClickHouse/ClickHouse/issues/78314)). [#78854](https://github.com/ClickHouse/ClickHouse/pull/78854) ([Elmi Ahmadov](https://github.com/ahmadov)). +* Fix crash in Refreshable MATERIALIZED VIEW inthe case of ALTER after an incorrect shutdown. [#78858](https://github.com/ClickHouse/ClickHouse/pull/78858) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing of bad `DateTime` values in `CSV` format. [#78919](https://github.com/ClickHouse/ClickHouse/pull/78919) ([Pavel Kruglov](https://github.com/Avogar)). +* Keeper fix: Avoid triggering watches on failed multi requests. [#79247](https://github.com/ClickHouse/ClickHouse/pull/79247) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix reading Iceberg table failed when min-max value is specified explicitly but is `NULL`. The Go Iceberg library was noted for generating such an atrocious files. Closes [#78740](https://github.com/ClickHouse/ClickHouse/issues/78740). [#78764](https://github.com/ClickHouse/ClickHouse/pull/78764) ([flynn](https://github.com/ucasfl)). + +#### Build/Testing/Packaging Improvement +* Respect CPU target features in Rust and enable LTO in all crates. [#78590](https://github.com/ClickHouse/ClickHouse/pull/78590) ([Raúl Marín](https://github.com/Algunenano)). + + +### ClickHouse release 25.3 LTS, 2025-03-20 {#253} + +#### Backward Incompatible Change +* Disallow truncating replicated databases. [#76651](https://github.com/ClickHouse/ClickHouse/pull/76651) ([Bharat Nallan](https://github.com/bharatnc)). +* Skipping index cache is reverted. [#77447](https://github.com/ClickHouse/ClickHouse/pull/77447) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### New Feature +* `JSON` data type is production-ready. See https://jsonbench.com/. `Dynamic` and `Variant` data types are production-ready. [#77785](https://github.com/ClickHouse/ClickHouse/pull/77785) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Introduce the SSH protocol for clickhouse-server. Now, it is possible to connect to ClickHouse using any SSH client. This closes: [#74340](https://github.com/ClickHouse/ClickHouse/issues/74340). [#74989](https://github.com/ClickHouse/ClickHouse/pull/74989) ([George Gamezardashvili](https://github.com/Infjoker)). +* Replace table functions with their -Cluster alternatives if parallel replicas are enabled. Fixes [#65024](https://github.com/ClickHouse/ClickHouse/issues/65024). [#70659](https://github.com/ClickHouse/ClickHouse/pull/70659) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* A new implementation of the Userspace Page Cache, which allows caching data in the in-process memory instead of relying on the OS page cache, which is useful when the data is stored on a remote virtual filesystem without backing with the local filesystem cache. [#70509](https://github.com/ClickHouse/ClickHouse/pull/70509) ([Michael Kolupaev](https://github.com/al13n321)). +* Added `concurrent_threads_scheduler` server setting that governs how CPU slots are distributed among concurrent queries. Could be set to `round_robin` (previous behavior) or `fair_round_robin` to address the issue of unfair CPU distribution between INSERTs and SELECTs. [#75949](https://github.com/ClickHouse/ClickHouse/pull/75949) ([Sergei Trifonov](https://github.com/serxa)). +* Add `estimateCompressionRatio` aggregate function [#70801](https://github.com/ClickHouse/ClickHouse/issues/70801). [#76661](https://github.com/ClickHouse/ClickHouse/pull/76661) ([Tariq Almawash](https://github.com/talmawash)). +* Added function `arraySymmetricDifference`. It returns all elements from multiple array arguments which do not occur in all arguments. Example: `SELECT arraySymmetricDifference([1, 2], [2, 3])` returns `[1, 3]`. (issue [#61673](https://github.com/ClickHouse/ClickHouse/issues/61673)). [#76231](https://github.com/ClickHouse/ClickHouse/pull/76231) ([Filipp Abapolov](https://github.com/pheepa)). +* Allow to explicitly specify metadata file to read for Iceberg with storage/table function setting `iceberg_metadata_file_path `. Fixes [#47412](https://github.com/ClickHouse/ClickHouse/issues/47412). [#77318](https://github.com/ClickHouse/ClickHouse/pull/77318) ([alesapin](https://github.com/alesapin)). +* Added the `keccak256` hash function, commonly used in blockchain implementations, especially in EVM-based systems. [#76669](https://github.com/ClickHouse/ClickHouse/pull/76669) ([Arnaud Briche](https://github.com/arnaudbriche)). +* Add three new functions. `icebergTruncate` according to specification. https://iceberg.apache.org/spec/#truncate-transform-details, `toYearNumSinceEpoch` and `toMonthNumSinceEpoch`. Support `truncate` transform in partition pruning for `Iceberg` engine. [#77403](https://github.com/ClickHouse/ClickHouse/pull/77403) ([alesapin](https://github.com/alesapin)). +* Support `LowCardinality(Decimal)` data types [#72256](https://github.com/ClickHouse/ClickHouse/issues/72256). [#72833](https://github.com/ClickHouse/ClickHouse/pull/72833) ([zhanglistar](https://github.com/zhanglistar)). +* `FilterTransformPassedRows` and `FilterTransformPassedBytes` profile events will show the number of rows and number of bytes filtered during the query execution. [#76662](https://github.com/ClickHouse/ClickHouse/pull/76662) ([Onkar Deshpande](https://github.com/onkar)). +* Support for the histogram metric type. The interface closely mirrors the Prometheus client, where you simply call `observe(value)` to increment the counter in the bucket corresponding to the value. The histogram metrics are exposed via `system.histogram_metrics`. [#75736](https://github.com/ClickHouse/ClickHouse/pull/75736) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Non-constant CASE support for switching on explicit values. [#77399](https://github.com/ClickHouse/ClickHouse/pull/77399) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). + +#### Experimental Feature +* Add support [for Unity Catalog](https://www.databricks.com/product/unity-catalog) for DeltaLake tables on top of AWS S3 and local filesystem. [#76988](https://github.com/ClickHouse/ClickHouse/pull/76988) ([alesapin](https://github.com/alesapin)). +* Introduce experimental integration with AWS Glue service catalog for Iceberg tables. [#77257](https://github.com/ClickHouse/ClickHouse/pull/77257) ([alesapin](https://github.com/alesapin)). +* Added support for dynamic cluster autodiscovery. This extends the existing _node_ autodiscovery feature. ClickHouse can now automatically detect and register new _clusters_ under a common ZooKeeper path using ``. [#76001](https://github.com/ClickHouse/ClickHouse/pull/76001) ([Anton Ivashkin](https://github.com/ianton-ru)). +* Allow automatic cleanup merges of entire partitions after a configurable timeout with a new setting `enable_replacing_merge_with_cleanup_for_min_age_to_force_merge`. [#76440](https://github.com/ClickHouse/ClickHouse/pull/76440) ([Christoph Wurm](https://github.com/cwurm)). + +#### Performance Improvement +* Implement query condition cache to improve query performance using repeated conditions. The range of the portion of data that does not meet the condition is remembered as a temporary index in memory. Subsequent queries will use this index. Close [#67768](https://github.com/ClickHouse/ClickHouse/issues/67768) [#69236](https://github.com/ClickHouse/ClickHouse/pull/69236) ([zhongyuankai](https://github.com/zhongyuankai)). +* Actively evict data from the cache on parts removal. Do not let the cache grow to the maximum size if the amount of data is less. [#76641](https://github.com/ClickHouse/ClickHouse/pull/76641) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Replace Int256 and UInt256 with clang builtin i256 in arithmetic calculation, and it gives a performance improvement [#70502](https://github.com/ClickHouse/ClickHouse/issues/70502). [#73658](https://github.com/ClickHouse/ClickHouse/pull/73658) ([李扬](https://github.com/taiyang-li)). +* In some cases (e.g. empty array column) data parts can contain empty files. We can skip writing empty blobs to ObjectStorage and only store metadata for such files when the table resides on disk with separated metadata and object storages. [#75860](https://github.com/ClickHouse/ClickHouse/pull/75860) ([Alexander Gololobov](https://github.com/davenger)). +* Improve min/max performance for Decimal32/Decimal64/DateTime64. [#76570](https://github.com/ClickHouse/ClickHouse/pull/76570) ([李扬](https://github.com/taiyang-li)). +* Query compilation (setting `compile_expressions`) now considers the machine type. This speeds up such queries significantly. [#76753](https://github.com/ClickHouse/ClickHouse/pull/76753) ([ZhangLiStar](https://github.com/zhanglistar)). +* Optimize `arraySort`. [#76850](https://github.com/ClickHouse/ClickHouse/pull/76850) ([李扬](https://github.com/taiyang-li)). +* Disable `filesystem_cache_prefer_bigger_buffer_size` when the cache is used passively, such as for merges. [#77898](https://github.com/ClickHouse/ClickHouse/pull/77898) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Apply `preserve_most` attribute at some places in code, which allows slightly better code generation. [#67778](https://github.com/ClickHouse/ClickHouse/pull/67778) ([Nikita Taranov](https://github.com/nickitat)). +* Faster ClickHouse servers shutdown (get rid of 2.5sec delay). [#76550](https://github.com/ClickHouse/ClickHouse/pull/76550) ([Azat Khuzhin](https://github.com/azat)). +* Avoid excess allocation in ReadBufferFromS3 and other remote reading buffers, reduce their memory consumption in half. [#76692](https://github.com/ClickHouse/ClickHouse/pull/76692) ([Sema Checherinda](https://github.com/CheSema)). +* Update zstd from 1.5.5 to 1.5.7 which could lead to some [performance improvements](https://github.com/facebook/zstd/releases/tag/v1.5.7). [#77137](https://github.com/ClickHouse/ClickHouse/pull/77137) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Reduce memory usage during prefetches of JSON column in Wide parts. This is relevant when ClickHouse is used on top of a shared storage, such as in ClickHouse Cloud. [#77640](https://github.com/ClickHouse/ClickHouse/pull/77640) ([Pavel Kruglov](https://github.com/Avogar)). + +#### Improvement +* Support atomic rename when `TRUNCATE` is used with `INTO OUTFILE`. Resolves [#70323](https://github.com/ClickHouse/ClickHouse/issues/70323). [#77181](https://github.com/ClickHouse/ClickHouse/pull/77181) ([Onkar Deshpande](https://github.com/onkar)). +* It's no longer possible to use `NaN` or `inf` for float values as settings. Not like it did make any sense before. [#77546](https://github.com/ClickHouse/ClickHouse/pull/77546) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Disable parallel replicas by default when analyzer is disabled regardless `compatibility` setting. It's still possible to change this behavior by explicitly setting `parallel_replicas_only_with_analyzer` to `false`. [#77115](https://github.com/ClickHouse/ClickHouse/pull/77115) ([Igor Nikonov](https://github.com/devcrafter)). +* Add the ability to define a list of headers that are forwarded from the headers of the client request to the external HTTP authenticator. [#77054](https://github.com/ClickHouse/ClickHouse/pull/77054) ([inv2004](https://github.com/inv2004)). +* Respect column insensitive column matching for fields in tuple columns. Close https://github.com/apache/incubator-gluten/issues/8324. [#73780](https://github.com/ClickHouse/ClickHouse/pull/73780) ([李扬](https://github.com/taiyang-li)). +* Parameters for the codec Gorilla will now always be saved in the table metadata in .sql file. This closes: [#70072](https://github.com/ClickHouse/ClickHouse/issues/70072). [#74814](https://github.com/ClickHouse/ClickHouse/pull/74814) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implemented parsing enhancements for certain data lakes (Sequence ID parsing: Added functionality to parse sequence identifiers in manifest files AND Avro metadata parsing: Redesigned the Avro metadata parser to be easily extendable for future enhancements). [#75010](https://github.com/ClickHouse/ClickHouse/pull/75010) ([Daniil Ivanik](https://github.com/divanik)). +* Remove trace_id from default ORDER BY for `system.opentelemetry_span_log`. [#75907](https://github.com/ClickHouse/ClickHouse/pull/75907) ([Azat Khuzhin](https://github.com/azat)). +* Encryption (the attribute `encrypted_by`) can now be applied to any configuration file (config.xml, users.xml, nested configuration files). Previously, it worked only for the top-level config.xml file. [#75911](https://github.com/ClickHouse/ClickHouse/pull/75911) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Improve the `system.warnings` table and add some dynamic warning messages that can be added, updated or removed. [#76029](https://github.com/ClickHouse/ClickHouse/pull/76029) ([Bharat Nallan](https://github.com/bharatnc)). +* This PR makes it impossible to run a query `ALTER USER user1 ADD PROFILES a, DROP ALL PROFILES` because all `DROP` operations should come first in the order. [#76242](https://github.com/ClickHouse/ClickHouse/pull/76242) ([pufit](https://github.com/pufit)). +* Various enhancements for SYNC REPLICA (better error messages, better tests, sanity checks). [#76307](https://github.com/ClickHouse/ClickHouse/pull/76307) ([Azat Khuzhin](https://github.com/azat)). +* Use correct fallback when multipart copy to S3 fails during backup with Access Denied. Multi part copy can generate Access Denied error when backup is done between buckets that have different credentials. [#76515](https://github.com/ClickHouse/ClickHouse/pull/76515) ([Antonio Andelic](https://github.com/antonio2368)). +* Upgraded librdkafka (which is a pile of crap) to version 2.8.0 (the pile does not get any better) and improved the shutdown sequence for Kafka tables, reducing delays during table drops and server restarts. The `engine=Kafka` no longer explicitly leaves the consumer group when a table is dropped. Instead, the consumer remains in the group until it is automatically removed after `session_timeout_ms` (default: 45 seconds) of inactivity. [#76621](https://github.com/ClickHouse/ClickHouse/pull/76621) ([filimonov](https://github.com/filimonov)). +* Fix validation of S3 request settings. [#76658](https://github.com/ClickHouse/ClickHouse/pull/76658) ([Vitaly Baranov](https://github.com/vitlibar)). +* System tables like `server_settings` or `settings` have a `default` value column which is convenient. Add them to `merge_tree_settings` and `replicated_merge_tree_settings`. [#76942](https://github.com/ClickHouse/ClickHouse/pull/76942) ([Diego Nieto](https://github.com/lesandie)). +* Added `ProfileEvents::QueryPreempted`, which has a similar logic to `CurrentMetrics::QueryPreempted`. [#77015](https://github.com/ClickHouse/ClickHouse/pull/77015) ([VicoWu](https://github.com/VicoWu)). +* Previously, a Replicated database could print credentials specified in a query to logs. This behaviour is fixed. This closes: [#77123](https://github.com/ClickHouse/ClickHouse/issues/77123). [#77133](https://github.com/ClickHouse/ClickHouse/pull/77133) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow ALTER TABLE DROP PARTITION for `plain_rewritable disk`. [#77138](https://github.com/ClickHouse/ClickHouse/pull/77138) ([Julia Kartseva](https://github.com/jkartseva)). +* Backup/restore setting `allow_s3_native_copy` now supports value three possible values: - `False` - s3 native copy will not be used; - `True` (old default) - ClickHouse will try s3 native copy first, if it fails then fallback to the reading+writing approach; - `'auto'` (new default) - ClickHouse will compare the source and destination credentials first. If they are same, ClickHouse will try s3 native copy and then may fallback to the reading+writing approach. If they are different, ClickHouse will go directly to the reading+writing approach. [#77401](https://github.com/ClickHouse/ClickHouse/pull/77401) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support aws session token and environment credentials usage in delta kernel for DeltaLake table engine. [#77661](https://github.com/ClickHouse/ClickHouse/pull/77661) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix stuck while processing pending batch for async distributed INSERT (due to i.e. `No such file or directory`). [#72939](https://github.com/ClickHouse/ClickHouse/pull/72939) ([Azat Khuzhin](https://github.com/azat)). +* Improved datetime conversion during index analysis by enforcing saturating behavior for implicit Date to DateTime conversions. This resolves potential index analysis inaccuracies caused by datetime range limitations. This fixes [#73307](https://github.com/ClickHouse/ClickHouse/issues/73307). It also fixes explicit `toDateTime` conversion when `date_time_overflow_behavior = 'ignore'` which is the default value. [#73326](https://github.com/ClickHouse/ClickHouse/pull/73326) ([Amos Bird](https://github.com/amosbird)). +* Fix all sort of bugs due to race between UUID and table names (for instance it will fix the race between `RENAME` and `RESTART REPLICA`, in case of concurrent `RENAME` with `SYSTEM RESTART REPLICA` you may get end up restarting wrong replica, or/and leaving one of the tables in a `Table X is being restarted` state). [#76308](https://github.com/ClickHouse/ClickHouse/pull/76308) ([Azat Khuzhin](https://github.com/azat)). +* Fix data loss when enable async insert and insert into ... from file ... with unequal block size if the first block size < async_max_size but the second block > async_max_size, the second block will not be inserted. these data is left in `squashing`. [#76343](https://github.com/ClickHouse/ClickHouse/pull/76343) ([Han Fei](https://github.com/hanfei1991)). +* Renamed field 'marks' to 'marks_bytes' in `system.data_skipping_indices`. [#76374](https://github.com/ClickHouse/ClickHouse/pull/76374) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix dynamic filesystem cache resize handling unexpected errors during eviction. [#76466](https://github.com/ClickHouse/ClickHouse/pull/76466) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed `used_flag` initialization in parallel hash. It might cause a server crash. [#76580](https://github.com/ClickHouse/ClickHouse/pull/76580) ([Nikita Taranov](https://github.com/nickitat)). +* Fix a logical error when calling `defaultProfiles` function inside a projection. [#76627](https://github.com/ClickHouse/ClickHouse/pull/76627) ([pufit](https://github.com/pufit)). +* Do not request interactive basic auth in the browser in Web UI. Closes [#76319](https://github.com/ClickHouse/ClickHouse/issues/76319). [#76637](https://github.com/ClickHouse/ClickHouse/pull/76637) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix THERE_IS_NO_COLUMN exception when selecting boolean literal from distributed tables. [#76656](https://github.com/ClickHouse/ClickHouse/pull/76656) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* The subpath inside the table directory is chosen in a more profound way. [#76681](https://github.com/ClickHouse/ClickHouse/pull/76681) ([Daniil Ivanik](https://github.com/divanik)). +* Fix an error `Not found column in block` after altering a table with a subcolumn in PK. After https://github.com/ClickHouse/ClickHouse/pull/72644, requires https://github.com/ClickHouse/ClickHouse/pull/74403. [#76686](https://github.com/ClickHouse/ClickHouse/pull/76686) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add performance tests for null shortcircuit and fix bugs. [#76708](https://github.com/ClickHouse/ClickHouse/pull/76708) ([李扬](https://github.com/taiyang-li)). +* Flush output write buffers before finalizing them. Fix `LOGICAL_ERROR` generated during the finalization of some output format, e.g. `JSONEachRowWithProgressRowOutputFormat`. [#76726](https://github.com/ClickHouse/ClickHouse/pull/76726) ([Antonio Andelic](https://github.com/antonio2368)). +* Added support for MongoDB's binary UUID ([#74452](https://github.com/ClickHouse/ClickHouse/issues/74452)) - Fixed WHERE pushdown to MongoDB when using the table function ([#72210](https://github.com/ClickHouse/ClickHouse/issues/72210)) - Changed the MongoDB - ClickHouse type mapping such that MongoDB's binary UUID can only be parsed to ClickHouse's UUID. This should avoid ambiguities and surprises in future. - Fixed OID mapping, preserving backward compatibility. [#76762](https://github.com/ClickHouse/ClickHouse/pull/76762) ([Kirill Nikiforov](https://github.com/allmazz)). +* Fix exception handling in parallel prefixes deserialization of JSON subcolumns. [#76809](https://github.com/ClickHouse/ClickHouse/pull/76809) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix lgamma function behavior for negative integers. [#76840](https://github.com/ClickHouse/ClickHouse/pull/76840) ([Ilya Kataev](https://github.com/IlyaKataev)). +* Fix reverse key analysis for explicitly defined primary keys. Similar to [#76654](https://github.com/ClickHouse/ClickHouse/issues/76654). [#76846](https://github.com/ClickHouse/ClickHouse/pull/76846) ([Amos Bird](https://github.com/amosbird)). +* Fix pretty print of Bool values in JSON format. [#76905](https://github.com/ClickHouse/ClickHouse/pull/76905) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix possible crash because of bad JSON column rollback on error during async inserts. [#76908](https://github.com/ClickHouse/ClickHouse/pull/76908) ([Pavel Kruglov](https://github.com/Avogar)). +* Previously, `multiIf` may return different types of columns during planning and main execution. This resulted in code producing undefined behavior from the C++ perspective. [#76914](https://github.com/ClickHouse/ClickHouse/pull/76914) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed incorrect serialization of constant nullable keys in MergeTree. This fixes [#76939](https://github.com/ClickHouse/ClickHouse/issues/76939). [#76985](https://github.com/ClickHouse/ClickHouse/pull/76985) ([Amos Bird](https://github.com/amosbird)). +* Fix sorting of `BFloat16` values. This closes [#75487](https://github.com/ClickHouse/ClickHouse/issues/75487). This closes [#75669](https://github.com/ClickHouse/ClickHouse/issues/75669). [#77000](https://github.com/ClickHouse/ClickHouse/pull/77000) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bug fix JSON with Variant subcolumn by adding check to skip ephemeral subcolumns in part consistency check. [#72187](https://github.com/ClickHouse/ClickHouse/issues/72187). [#77034](https://github.com/ClickHouse/ClickHouse/pull/77034) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Fix crash in template parsing in Values format in case of types mismatch. [#77071](https://github.com/ClickHouse/ClickHouse/pull/77071) ([Pavel Kruglov](https://github.com/Avogar)). +* Don't allow creating EmbeddedRocksDB table with subcolumn in primary key. Previosly such table could be created but select queries were failing. [#77074](https://github.com/ClickHouse/ClickHouse/pull/77074) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix illegal comparison in distributed queries because pushing down predicates to remote doesn't respect literal types. [#77093](https://github.com/ClickHouse/ClickHouse/pull/77093) ([Duc Canh Le](https://github.com/canhld94)). +* Fix crash during Kafka table creation with exception. [#77121](https://github.com/ClickHouse/ClickHouse/pull/77121) ([Pavel Kruglov](https://github.com/Avogar)). +* Support JSON and subcolumns in Kafka and RabbitMQ engines. [#77122](https://github.com/ClickHouse/ClickHouse/pull/77122) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix exceptions stack unwinding on MacOS. [#77126](https://github.com/ClickHouse/ClickHouse/pull/77126) ([Eduard Karacharov](https://github.com/korowa)). +* Fix reading 'null' subcolumn in getSubcolumn function. [#77163](https://github.com/ClickHouse/ClickHouse/pull/77163) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix bloom filter index with Array and not supported functions. [#77271](https://github.com/ClickHouse/ClickHouse/pull/77271) ([Pavel Kruglov](https://github.com/Avogar)). +* We should only check the restriction on the amount of tables during the initial CREATE query. [#77274](https://github.com/ClickHouse/ClickHouse/pull/77274) ([Nikolay Degterinsky](https://github.com/evillique)). +* Not a bug: `SELECT toBFloat16(-0.0) == toBFloat16(0.0)` now correctly returns `true` (from previously `false`). This makes the behavior consistent with `Float32` and `Float64`. [#77290](https://github.com/ClickHouse/ClickHouse/pull/77290) ([Shankar Iyer](https://github.com/shankar-iyer)). +* Fix posbile incorrect reference to unintialized key_index variable, which may lead to crash in debug builds (this uninitialized reference won't cause issues in release builds because subsequent code are likely to throw errors.) ### documentation entry for user-facing changes. [#77305](https://github.com/ClickHouse/ClickHouse/pull/77305) ([wxybear](https://github.com/wxybear)). +* Fix name for partition with a Bool value. It was broken in https://github.com/ClickHouse/ClickHouse/pull/74533. [#77319](https://github.com/ClickHouse/ClickHouse/pull/77319) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix comparison between tuples with nullable elements inside and strings. As an example, before the change comparison between a Tuple `(1, null)` and a String `'(1,null)'` would result in an error. Another example would be a comparison between a Tuple `(1, a)`, where `a` is a Nullable column, and a String `'(1, 2)'`. This change addresses these issues. [#77323](https://github.com/ClickHouse/ClickHouse/pull/77323) ([Alexey Katsman](https://github.com/alexkats)). +* Fix crash in ObjectStorageQueueSource. Was intoduced in https://github.com/ClickHouse/ClickHouse/pull/76358. [#77325](https://github.com/ClickHouse/ClickHouse/pull/77325) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix `async_insert` with `input`. [#77340](https://github.com/ClickHouse/ClickHouse/pull/77340) ([Azat Khuzhin](https://github.com/azat)). +* Fix: `WITH FILL` may fail with NOT_FOUND_COLUMN_IN_BLOCK when sorting column is removed by planer. Similar issue related to inconsistent DAG calculated for INTERPOLATE expression. [#77343](https://github.com/ClickHouse/ClickHouse/pull/77343) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix several LOGICAL_ERRORs around setting alias of invalid AST nodes. [#77445](https://github.com/ClickHouse/ClickHouse/pull/77445) ([Raúl Marín](https://github.com/Algunenano)). +* In filesystem cache impementation fix error processing during file segment write. [#77471](https://github.com/ClickHouse/ClickHouse/pull/77471) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make DatabaseIceberg use correct metadata file provided by catalog. Closes [#75187](https://github.com/ClickHouse/ClickHouse/issues/75187). [#77486](https://github.com/ClickHouse/ClickHouse/pull/77486) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The query cache now assumes that UDFs are non-deterministic. Accordingly, results of queries with UDFs are no longer cached. Previously, users were able to define non-deterministic UDFs whose result would erronously be cached (issue [#77553](https://github.com/ClickHouse/ClickHouse/issues/77553)). [#77633](https://github.com/ClickHouse/ClickHouse/pull/77633) ([Jimmy Aguilar Mena](https://github.com/Ergus)). +* Fix system.filesystem_cache_log working only under setting `enable_filesystem_cache_log`. [#77650](https://github.com/ClickHouse/ClickHouse/pull/77650) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix a logical error when calling `defaultRoles` function inside a projection. Follow-up for [#76627](https://github.com/ClickHouse/ClickHouse/issues/76627). [#77667](https://github.com/ClickHouse/ClickHouse/pull/77667) ([pufit](https://github.com/pufit)). +* Second arguments of type `Nullable` for function `arrayResize` are now disallowed. Previously, anything from errors to wrong results could happen with `Nullable` as second argument. (issue [#48398](https://github.com/ClickHouse/ClickHouse/issues/48398)). [#77724](https://github.com/ClickHouse/ClickHouse/pull/77724) ([Manish Gill](https://github.com/mgill25)). +* Regularly check if merges and mutations were cancelled even in case when the operation doesn't produce any blocks to write. [#77766](https://github.com/ClickHouse/ClickHouse/pull/77766) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). + +#### Build/Testing/Packaging Improvement +* `clickhouse-odbc-bridge` and `clickhouse-library-bridge` are moved to a separate repository, https://github.com/ClickHouse/odbc-bridge/. [#76225](https://github.com/ClickHouse/ClickHouse/pull/76225) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix Rust cross-compilation and allow disabling Rust completely. [#76921](https://github.com/ClickHouse/ClickHouse/pull/76921) ([Raúl Marín](https://github.com/Algunenano)). + + +### ClickHouse release 25.2, 2025-02-27 {#252} + +#### Backward Incompatible Change +* Completely enable `async_load_databases` by default (even for those installations that do not upgrade `config.xml`). [#74772](https://github.com/ClickHouse/ClickHouse/pull/74772) ([Azat Khuzhin](https://github.com/azat)). +* Add `JSONCompactEachRowWithProgress` and `JSONCompactStringsEachRowWithProgress` formats. Continuation of [#69989](https://github.com/ClickHouse/ClickHouse/issues/69989). The `JSONCompactWithNames` and `JSONCompactWithNamesAndTypes` no longer output "totals" - apparently, it was a mistake in the implementation. [#75037](https://github.com/ClickHouse/ClickHouse/pull/75037) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Change the `format_alter_operations_with_parentheses` default to true to disambiguate the ALTER commands list (see https://github.com/ClickHouse/ClickHouse/pull/59532). This breaks replication with clusters prior to 24.3. If you are upgrading a cluster using older releases turn off the setting in the server config or upgrade to 24.3 first. [#75302](https://github.com/ClickHouse/ClickHouse/pull/75302) ([Raúl Marín](https://github.com/Algunenano)). +* Remove the possibility of filtering log messages using regular expressions. The implementation introduced a data race, so it has to be removed. [#75577](https://github.com/ClickHouse/ClickHouse/pull/75577) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* The setting `min_chunk_bytes_for_parallel_parsing` cannot be zero anymore. This fixes: [#71110](https://github.com/ClickHouse/ClickHouse/issues/71110). [#75239](https://github.com/ClickHouse/ClickHouse/pull/75239) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Validate settings in the cache configuration. Non existing settings were ignored before, now they will throw an error and they should be removed. [#75452](https://github.com/ClickHouse/ClickHouse/pull/75452) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### New Feature +* Support type `Nullable(JSON)`. [#73556](https://github.com/ClickHouse/ClickHouse/pull/73556) ([Pavel Kruglov](https://github.com/Avogar)). +* Support subcolumns in the DEFAULT and MATERIALIZED expressions. [#74403](https://github.com/ClickHouse/ClickHouse/pull/74403) ([Pavel Kruglov](https://github.com/Avogar)). +* Support writing Parquet bloom filters using the `output_format_parquet_write_bloom_filter` setting (enabled by default). [#71681](https://github.com/ClickHouse/ClickHouse/pull/71681) ([Michael Kolupaev](https://github.com/al13n321)). +* Web UI now has interactive database navigation. [#75777](https://github.com/ClickHouse/ClickHouse/pull/75777) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow the combination of read-only and read-write disks in the storage policy (as multiple volumes or multiple disks). This allows data to be read from the entire volume, while inserts will prefer the writable disk (i.e., Copy-on-Write storage policy). [#75862](https://github.com/ClickHouse/ClickHouse/pull/75862) ([Azat Khuzhin](https://github.com/azat)). +* Add a new Database engine, `DatabaseBackup,` that allows to instantly attach table/database from backup. [#75725](https://github.com/ClickHouse/ClickHouse/pull/75725) ([Maksim Kita](https://github.com/kitaisreal)). +* Support prepared statements in the Postgres wire protocol. [#75035](https://github.com/ClickHouse/ClickHouse/pull/75035) ([scanhex12](https://github.com/scanhex12)). +* Add the ability to ATTACH tables without a database layer, which is useful for MergeTree tables located on Web, S3, and similar external virtual filesystems. [#75788](https://github.com/ClickHouse/ClickHouse/pull/75788) ([Azat Khuzhin](https://github.com/azat)). +* Add a new string comparison function, `compareSubstrings` to compare parts of two strings. Example: `SELECT compareSubstrings('Saxony', 'Anglo-Saxon', 0, 6, 5) AS result` means "compare 6 bytes of strings 'Saxon' and 'Anglo-Saxon' lexicographically, starting at offset 0 in the first string, offset 5 in the second string". [#74070](https://github.com/ClickHouse/ClickHouse/pull/74070) ([lgbo](https://github.com/lgbo-ustc)). +* A new function, `initialQueryStartTime` is added. It returns the start time of the current query. The value is the same across all shards during a distributed query. [#75087](https://github.com/ClickHouse/ClickHouse/pull/75087) ([Roman Lomonosov](https://github.com/lomik)). +* Add support for SSL authentication with named collections for MySQL. Closes [#59111](https://github.com/ClickHouse/ClickHouse/issues/59111). [#59452](https://github.com/ClickHouse/ClickHouse/pull/59452) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Experimental Features +* Added a new setting, `enable_adaptive_memory_spill_scheduler` that allows multiple Grace JOINs in the same query to monitor their combined memory footprint and trigger spilling into external storage adaptively to prevent MEMORY_LIMIT_EXCEEDED. [#72728](https://github.com/ClickHouse/ClickHouse/pull/72728) ([lgbo](https://github.com/lgbo-ustc)). +* Make the new, experimental `Kafka` table engine fully respect Keeper feature flags. [#76004](https://github.com/ClickHouse/ClickHouse/pull/76004) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Restore the (Intel) QPL codec, which was removed in v24.10 due to licensing issues. [#76021](https://github.com/ClickHouse/ClickHouse/pull/76021) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* For the integration with HDFS added support for the `dfs.client.use.datanode.hostname` configuration option. [#74635](https://github.com/ClickHouse/ClickHouse/pull/74635) ([Mikhail Tiukavkin](https://github.com/freshertm)). + +#### Performance Improvement +* Improve performance of the whole JSON column reading in Wide parts from S3. It's done by adding prefetches for subcolumn prefixes deserialization, cache of deserialized prefixes, and parallel deserialization of subcolumn prefixes. It improves the reading of the JSON column from S3 4 times in queries like `SELECT data FROM table` and about 10 times in queries like `SELECT data FROM table LIMIT 10`. [#74827](https://github.com/ClickHouse/ClickHouse/pull/74827) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixed unnecessary contention in `parallel_hash` when `max_rows_in_join = max_bytes_in_join = 0`. [#75155](https://github.com/ClickHouse/ClickHouse/pull/75155) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed double preallocation in `ConcurrentHashJoin` in case join sides are swapped by the optimizer. [#75149](https://github.com/ClickHouse/ClickHouse/pull/75149) ([Nikita Taranov](https://github.com/nickitat)). +* Slight improvement in some join scenarios: precalculate the number of output rows and reserve memory for them. [#75376](https://github.com/ClickHouse/ClickHouse/pull/75376) ([Alexander Gololobov](https://github.com/davenger)). +* For queries like `WHERE a < b AND b < c AND c < 5`, we can infer new comparing conditions (`a < 5 AND b < 5`) to have better filter ability. [#73164](https://github.com/ClickHouse/ClickHouse/pull/73164) ([Shichao Jin](https://github.com/jsc0218)). +* Keeper improvement: disable digest calculation when committing to in-memory storage for better performance. It can be enabled with `keeper_server.digest_enabled_on_commit` config. Digest is still calculated when preprocessing requests. [#75490](https://github.com/ClickHouse/ClickHouse/pull/75490) ([Antonio Andelic](https://github.com/antonio2368)). +* Push down filter expression from JOIN ON when possible. [#75536](https://github.com/ClickHouse/ClickHouse/pull/75536) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Calculate columns and indices sizes lazily in MergeTree. [#75938](https://github.com/ClickHouse/ClickHouse/pull/75938) ([Pavel Kruglov](https://github.com/Avogar)). +* Reintroduce respect `ttl_only_drop_parts` on `MATERIALIZE TTL`; only read necessary columns to recalculate TTL and drop parts by replacing them with an empty ones. [#72751](https://github.com/ClickHouse/ClickHouse/pull/72751) ([Andrey Zvonov](https://github.com/zvonand)). +* Reduce write buffer size for plain_rewritable metadata files [#75758](https://github.com/ClickHouse/ClickHouse/pull/75758) ([Julia Kartseva](https://github.com/jkartseva)). +* Reduce memory usage for some window functions. [#65647](https://github.com/ClickHouse/ClickHouse/pull/65647) ([lgbo](https://github.com/lgbo-ustc)). +* Evaluate parquet bloom filters and min/max indexes together. Necessary to properly support: `x = 3 or x > 5` where data = [1, 2, 4, 5]. [#71383](https://github.com/ClickHouse/ClickHouse/pull/71383) ([Arthur Passos](https://github.com/arthurpassos)). +* Queries passed to the `Executable` storage are no longer limited to a single-threaded execution. [#70084](https://github.com/ClickHouse/ClickHouse/pull/70084) ([yawnt](https://github.com/yawnt)). +* Fetch parts in parallel in ALTER TABLE FETCH PARTITION (thread pool size is controlled with `max_fetch_partition_thread_pool_size`). [#74978](https://github.com/ClickHouse/ClickHouse/pull/74978) ([Azat Khuzhin](https://github.com/azat)). +* Allow to move predicates with the `indexHint` function to `PREWHERE`. [#74987](https://github.com/ClickHouse/ClickHouse/pull/74987) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvement +* Fixed calculation of size in memory for `LowCardinality` columns. [#74688](https://github.com/ClickHouse/ClickHouse/pull/74688) ([Nikita Taranov](https://github.com/nickitat)). +* `processors_profile_log` table now has a default configuration with a TTL of 30 days. [#66139](https://github.com/ClickHouse/ClickHouse/pull/66139) ([Ilya Yatsishin](https://github.com/qoega)). +* Allow naming shards in the cluster configuration. [#72276](https://github.com/ClickHouse/ClickHouse/pull/72276) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Change Prometheus remote write response success status from 200/OK to 204/NoContent. [#74170](https://github.com/ClickHouse/ClickHouse/pull/74170) ([Michael Dempsey](https://github.com/bluestealth)). +* Add ability to reload `max_remote_read_network_bandwidth_for_serve` and `max_remote_write_network_bandwidth_for_server` on the fly without restart server. [#74206](https://github.com/ClickHouse/ClickHouse/pull/74206) ([Kai Zhu](https://github.com/nauu)). +* Allow using blob paths to calculate checksums while making a backup. [#74729](https://github.com/ClickHouse/ClickHouse/pull/74729) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added a query ID column to `system.query_cache` (closes [#68205](https://github.com/ClickHouse/ClickHouse/issues/68205)). [#74982](https://github.com/ClickHouse/ClickHouse/pull/74982) ([NamHoaiNguyen](https://github.com/NamHoaiNguyen)). +* It is allowed to cancel `ALTER TABLE ... FREEZE ...` queries with `KILL QUERY` and automatically by a timeout (`max_execution_time`). [#75016](https://github.com/ClickHouse/ClickHouse/pull/75016) ([Kirill](https://github.com/kirillgarbar)). +* Add support for `groupUniqArrayArrayMap` as `SimpleAggregateFunction`. [#75034](https://github.com/ClickHouse/ClickHouse/pull/75034) ([Miel Donkers](https://github.com/mdonkers)). +* Hide catalog credential settings in database engine `Iceberg`. Closes [#74559](https://github.com/ClickHouse/ClickHouse/issues/74559). [#75080](https://github.com/ClickHouse/ClickHouse/pull/75080) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `intExp2` / `intExp10`: Define undefined behaviour: return 0 for too small argument, `18446744073709551615` for too big argument, throw exception if `nan`. [#75312](https://github.com/ClickHouse/ClickHouse/pull/75312) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support `s3.endpoint` natively from catalog config in `DatabaseIceberg`. Closes [#74558](https://github.com/ClickHouse/ClickHouse/issues/74558). [#75375](https://github.com/ClickHouse/ClickHouse/pull/75375) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Don't fail silently if a user executing `SYSTEM DROP REPLICA` doesn't have enough permissions. [#75377](https://github.com/ClickHouse/ClickHouse/pull/75377) ([Bharat Nallan](https://github.com/bharatnc)). +* Add a ProfileEvent about the number of times any of the system logs have failed to flush. [#75466](https://github.com/ClickHouse/ClickHouse/pull/75466) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a check and extra logging for decrypting and decompressing. [#75471](https://github.com/ClickHouse/ClickHouse/pull/75471) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added support for the micro sign (U+00B5) in the `parseTimeDelta` function. Now both the micro sign (U+00B5) and the Greek letter mu (U+03BC) are recognized as valid representations for microseconds, aligning ClickHouse's behavior with Go’s implementation ([see time.go](https://github.com/golang/go/blob/ad7b46ee4ac1cee5095d64b01e8cf7fcda8bee5e/src/time/time.go#L983C19-L983C20) and [time/format.go](https://github.com/golang/go/blob/ad7b46ee4ac1cee5095d64b01e8cf7fcda8bee5e/src/time/format.go#L1608-L1609)). [#75472](https://github.com/ClickHouse/ClickHouse/pull/75472) ([Vitaly Orlov](https://github.com/orloffv)). +* Replace server setting (`send_settings_to_client`) with client setting (`apply_settings_from_server`) that controls whether client-side code (e.g., parsing INSERT data and formatting query output) should use settings from server's `users.xml` and user profile. Otherwise, only settings from the client command line, session, and query are used. Note that this only applies to native client (not e.g. HTTP), and doesn't apply to most of query processing (which happens on the server). [#75478](https://github.com/ClickHouse/ClickHouse/pull/75478) ([Michael Kolupaev](https://github.com/al13n321)). +* Better error messages for syntax errors. Previously, if the query was too large, and the token whose length exceeds the limit is a very large string literal, the message about the reason was lost in the middle of two examples of this very long token. Fix the issue when a query with UTF-8 was cut incorrectly in the error message. Fix excessive quoting of query fragments. This closes [#75473](https://github.com/ClickHouse/ClickHouse/issues/75473). [#75561](https://github.com/ClickHouse/ClickHouse/pull/75561) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add profile events in storage `S3(Azure)Queue`. [#75618](https://github.com/ClickHouse/ClickHouse/pull/75618) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable sending settings from server to client (`send_settings_to_client=false`) for compatibility (This feature will be re-implemented as a client setting later for better usability). [#75648](https://github.com/ClickHouse/ClickHouse/pull/75648) ([Michael Kolupaev](https://github.com/al13n321)). +* Add a config `memory_worker_correct_memory_tracker` to enable correction of the internal memory tracker with information from different sources read in the background thread periodically. [#75714](https://github.com/ClickHouse/ClickHouse/pull/75714) ([Antonio Andelic](https://github.com/antonio2368)). +* Add column `normalized_query_hash` into `system.processes`. Note: while it can be easily calculated on the fly with the `normalizedQueryHash` function, this is needed to prepare for subsequent changes. [#75756](https://github.com/ClickHouse/ClickHouse/pull/75756) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Querying `system.tables` will not throw even if there is a `Merge` table created over a database that no longer exists. Remove the `getTotalRows` method from `Hive` tables because we don't allow it to do complex work. [#75772](https://github.com/ClickHouse/ClickHouse/pull/75772) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Store start_time/end_time for Backups with microseconds. [#75929](https://github.com/ClickHouse/ClickHouse/pull/75929) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Add `MemoryTrackingUncorrected` metric showing the value of the internal global memory tracker which is not corrected by RSS. [#75935](https://github.com/ClickHouse/ClickHouse/pull/75935) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow parsing endpoints like `localhost:1234/handle` in `PostgreSQL` or `MySQL` table functions. This fixes a regression introduced in https://github.com/ClickHouse/ClickHouse/pull/52503. [#75944](https://github.com/ClickHouse/ClickHouse/pull/75944) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added a server setting `throw_on_unknown_workload` that allows to choose behavior on query with `workload` setting set to unknown value: either allow unlimited access (default) or throw a `RESOURCE_ACCESS_DENIED` error. It is useful to force all queries to use workload scheduling. [#75999](https://github.com/ClickHouse/ClickHouse/pull/75999) ([Sergei Trifonov](https://github.com/serxa)). +* Don't rewrite subcolumns to `getSubcolumn` in `ARRAY JOIN` if not necessary. [#76018](https://github.com/ClickHouse/ClickHouse/pull/76018) ([Pavel Kruglov](https://github.com/Avogar)). +* Retry coordination errors when loading tables. [#76020](https://github.com/ClickHouse/ClickHouse/pull/76020) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Support flushing individual logs in `SYSTEM FLUSH LOGS`. [#76132](https://github.com/ClickHouse/ClickHouse/pull/76132) ([Raúl Marín](https://github.com/Algunenano)). +* Improved the `/binary` server's page. Using the Hilbert curve instead of the Morton curve. Display 512 MB worth of addresses in the square, which fills the square better (in previous versions, addresses fill only half of the square). Color addresses closer to the library name rather than the function name. Allow scrolling a bit more outside of the area. [#76192](https://github.com/ClickHouse/ClickHouse/pull/76192) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Retry ON CLUSTER queries in case of TOO_MANY_SIMULTANEOUS_QUERIES. [#76352](https://github.com/ClickHouse/ClickHouse/pull/76352) ([Patrick Galbraith](https://github.com/CaptTofu)). +* Add the `CPUOverload` asynchronous metric, which calculates the server's relative CPU deficit. [#76404](https://github.com/ClickHouse/ClickHouse/pull/76404) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Changed the default value of `output_format_pretty_max_rows` from 10000 to 1000. I think it is better for usability. [#76407](https://github.com/ClickHouse/ClickHouse/pull/76407) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix formatting of exceptions using a custom format if they appear during query interpretation. In previous versions, exceptions were formatted using the default format rather than the format specified in the query. This closes [#55422](https://github.com/ClickHouse/ClickHouse/issues/55422). [#74994](https://github.com/ClickHouse/ClickHouse/pull/74994) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix type mapping for SQLite (integer types into `int64`, floating points into `float64`). [#73853](https://github.com/ClickHouse/ClickHouse/pull/73853) ([Joanna Hulboj](https://github.com/jh0x)). +* Fix identifier resolution from parent scopes. Allow the use of aliases to expressions in the WITH clause. Fixes [#58994](https://github.com/ClickHouse/ClickHouse/issues/58994). Fixes [#62946](https://github.com/ClickHouse/ClickHouse/issues/62946). Fixes [#63239](https://github.com/ClickHouse/ClickHouse/issues/63239). Fixes [#65233](https://github.com/ClickHouse/ClickHouse/issues/65233). Fixes [#71659](https://github.com/ClickHouse/ClickHouse/issues/71659). Fixes [#71828](https://github.com/ClickHouse/ClickHouse/issues/71828). Fixes [#68749](https://github.com/ClickHouse/ClickHouse/issues/68749). [#66143](https://github.com/ClickHouse/ClickHouse/pull/66143) ([Dmitry Novik](https://github.com/novikd)). +* Fix negate function monotonicity. In previous versions, the query `select * from a where -x = -42;` where `x` is the primary key, can return a wrong result. [#71440](https://github.com/ClickHouse/ClickHouse/pull/71440) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix empty tuple handling in arrayIntersect. This fixes [#72578](https://github.com/ClickHouse/ClickHouse/issues/72578). [#72581](https://github.com/ClickHouse/ClickHouse/pull/72581) ([Amos Bird](https://github.com/amosbird)). +* Fix reading JSON sub-object subcolumns with incorrect prefix. [#73182](https://github.com/ClickHouse/ClickHouse/pull/73182) ([Pavel Kruglov](https://github.com/Avogar)). +* Propagate Native format settings properly for client-server communication. [#73924](https://github.com/ClickHouse/ClickHouse/pull/73924) ([Pavel Kruglov](https://github.com/Avogar)). +* Check for not supported types for some storages. [#74218](https://github.com/ClickHouse/ClickHouse/pull/74218) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix crash with query `INSERT INTO SELECT` over PostgreSQL interface on macOS (issue [#72938](https://github.com/ClickHouse/ClickHouse/issues/72938)). [#74231](https://github.com/ClickHouse/ClickHouse/pull/74231) ([Artem Yurov](https://github.com/ArtemYurov)). +* Fixed uninitialized max_log_ptr in the replicated database. [#74336](https://github.com/ClickHouse/ClickHouse/pull/74336) ([Konstantin Morozov](https://github.com/k-morozov)). +* Fix crash when inserting interval (issue [#74299](https://github.com/ClickHouse/ClickHouse/issues/74299)). [#74478](https://github.com/ClickHouse/ClickHouse/pull/74478) ([NamHoaiNguyen](https://github.com/NamHoaiNguyen)). +* Fix formatting constant JSON literals. Previously it could lead to syntax errors during sending the query to another server. [#74533](https://github.com/ClickHouse/ClickHouse/pull/74533) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix broken create query when using constant partition expressions with implicit projections enabled. This fixes [#74596](https://github.com/ClickHouse/ClickHouse/issues/74596) . [#74634](https://github.com/ClickHouse/ClickHouse/pull/74634) ([Amos Bird](https://github.com/amosbird)). +* Avoid leaving connection in broken state after INSERT finishes with exception. [#74740](https://github.com/ClickHouse/ClickHouse/pull/74740) ([Azat Khuzhin](https://github.com/azat)). +* Avoid reusing connections that had been left in the intermediate state. [#74749](https://github.com/ClickHouse/ClickHouse/pull/74749) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash during JSON type declaration parsing when type name is not uppercase. [#74784](https://github.com/ClickHouse/ClickHouse/pull/74784) ([Pavel Kruglov](https://github.com/Avogar)). +* Keeper: fix logical_error when the connection had been terminated before establishing. [#74844](https://github.com/ClickHouse/ClickHouse/pull/74844) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix a behavior when the server couldn't startup when there's a table using `AzureBlobStorage`. Tables are loaded without any requests to Azure. [#74880](https://github.com/ClickHouse/ClickHouse/pull/74880) ([Alexey Katsman](https://github.com/alexkats)). +* Fix missing `used_privileges` and `missing_privileges` fields in `query_log` for BACKUP and RESTORE operations. [#74887](https://github.com/ClickHouse/ClickHouse/pull/74887) ([Alexey Katsman](https://github.com/alexkats)). +* HDFS refresh krb ticket if sasl error during hdfs select request. [#74930](https://github.com/ClickHouse/ClickHouse/pull/74930) ([inv2004](https://github.com/inv2004)). +* Fix queries to Replicated database in startup_scripts. [#74942](https://github.com/ClickHouse/ClickHouse/pull/74942) ([Azat Khuzhin](https://github.com/azat)). +* Fix issues with expressions type aliased in the JOIN ON clause when a null-safe comparison is used. [#74970](https://github.com/ClickHouse/ClickHouse/pull/74970) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Revert part's state from deleting back to outdated when remove operation has failed. [#74985](https://github.com/ClickHouse/ClickHouse/pull/74985) ([Sema Checherinda](https://github.com/CheSema)). +* In previous versions, when there was a scalar subquery, we started writing the progress (accumulated from processing the subquery) during the initialization of the data format, which was before HTTP headers were written. This led to the loss of HTTP headers, such as X-ClickHouse-QueryId and X-ClickHouse-Format, as well as Content-Type. [#74991](https://github.com/ClickHouse/ClickHouse/pull/74991) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `CREATE TABLE AS...` queries for `database_replicated_allow_replicated_engine_arguments=0`. [#75000](https://github.com/ClickHouse/ClickHouse/pull/75000) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix leaving connection in a bad state in client after INSERT exceptions. [#75030](https://github.com/ClickHouse/ClickHouse/pull/75030) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash due to uncaught exception in PSQL replication. [#75062](https://github.com/ClickHouse/ClickHouse/pull/75062) ([Azat Khuzhin](https://github.com/azat)). +* Sasl can fail any rpc call, the fix helps to repeat the call in case if krb5 ticker is expired. [#75063](https://github.com/ClickHouse/ClickHouse/pull/75063) ([inv2004](https://github.com/inv2004)). +* Fixed usage of indexes (primary and secondary) for `Array`, `Map` and `Nullable(..)` columns with enabled setting `optimize_function_to_subcolumns`. Previously, indexes for these columns could have been ignored. [#75081](https://github.com/ClickHouse/ClickHouse/pull/75081) ([Anton Popov](https://github.com/CurtizJ)). +* Disable `flatten_nested` when creating materialized views with inner tables since it will not be possible to use such flattened columns. [#75085](https://github.com/ClickHouse/ClickHouse/pull/75085) ([Christoph Wurm](https://github.com/cwurm)). +* Fix for some of IPv6 addresses (such as ::ffff:1.1.1.1) in forwarded_for field is wrongly interpreted resulting in client disconnect with exception. [#75133](https://github.com/ClickHouse/ClickHouse/pull/75133) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix nullsafe JOIN handling for LowCardinality nullable data type. Previously JOIN ON with nullsafe comparison, such as `IS NOT DISTINCT FROM`, `<=>` , `a IS NULL AND b IS NULL OR a == b` didn't work correctly with LowCardinality columns. [#75143](https://github.com/ClickHouse/ClickHouse/pull/75143) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Checks that we don't specify key_condition when counting total_number_of_rows for NumRowsCache. [#75164](https://github.com/ClickHouse/ClickHouse/pull/75164) ([Daniil Ivanik](https://github.com/divanik)). +* Fix queries with unused interpolation with the new analyzer. [#75173](https://github.com/ClickHouse/ClickHouse/pull/75173) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Fix the crash bug of CTE with Insert. [#75188](https://github.com/ClickHouse/ClickHouse/pull/75188) ([Shichao Jin](https://github.com/jsc0218)). +* Keeper fix: avoid writing to broken changelogs when rolling back logs. [#75197](https://github.com/ClickHouse/ClickHouse/pull/75197) ([Antonio Andelic](https://github.com/antonio2368)). +* Use `BFloat16` as a supertype where appropriate. This closes: [#74404](https://github.com/ClickHouse/ClickHouse/issues/74404). [#75236](https://github.com/ClickHouse/ClickHouse/pull/75236) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix unexpected defaults in join result with any_join_distinct_right_table_keys and OR in JOIN ON. [#75262](https://github.com/ClickHouse/ClickHouse/pull/75262) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Mask azureblobstorage table engine credentials. [#75319](https://github.com/ClickHouse/ClickHouse/pull/75319) ([Garrett Thomas](https://github.com/garrettthomaskth)). +* Fixed behavior when ClickHouse may erroneously do a filter pushdown to an external database like PostgreSQL, MySQL, or SQLite. This closes: [#71423](https://github.com/ClickHouse/ClickHouse/issues/71423). [#75320](https://github.com/ClickHouse/ClickHouse/pull/75320) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix crash in protobuf schema cache that can happen during output in Protobuf format and parallel query `SYSTEM DROP FORMAT SCHEMA CACHE`. [#75357](https://github.com/ClickHouse/ClickHouse/pull/75357) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix a possible logical error or uninitialized memory issue when a filter from `HAVING` is pushed down with parallel replicas. [#75363](https://github.com/ClickHouse/ClickHouse/pull/75363) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Hide sensitive info for `icebergS3`, `icebergAzure` table functions and table engines. [#75378](https://github.com/ClickHouse/ClickHouse/pull/75378) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Function `TRIM` with computed empty trim characters are now correctly handled. Example: `SELECT TRIM(LEADING concat('') FROM 'foo')` (Issue [#69922](https://github.com/ClickHouse/ClickHouse/issues/69922)). [#75399](https://github.com/ClickHouse/ClickHouse/pull/75399) ([Manish Gill](https://github.com/mgill25)). +* Fix data race in IOutputFormat. [#75448](https://github.com/ClickHouse/ClickHouse/pull/75448) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix possible error `Elements ... and ... of Nested data structure ... (Array columns) have different array sizes` when JSON subcolumns with Array type are used in JOIN over distributed tables. [#75512](https://github.com/ClickHouse/ClickHouse/pull/75512) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix data corruption with `CODEC(ZSTD, DoubleDelta)`. Closes [#70031](https://github.com/ClickHouse/ClickHouse/issues/70031). [#75548](https://github.com/ClickHouse/ClickHouse/pull/75548) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix interaction between allow_feature_tier and compatibility mergetree setting. [#75635](https://github.com/ClickHouse/ClickHouse/pull/75635) ([Raúl Marín](https://github.com/Algunenano)). +* Fix incorrect processed_rows value in system.s3queue_log in case file was retried. [#75666](https://github.com/ClickHouse/ClickHouse/pull/75666) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Respect `materialized_views_ignore_errors` when a materialized view writes to a URL engine and there is a connectivity issue. [#75679](https://github.com/ClickHouse/ClickHouse/pull/75679) ([Christoph Wurm](https://github.com/cwurm)). +* Fixed rare crashes while reading from `MergeTree` table after multiple asynchronous `RENAME` queries (with `alter_sync = 0`) between columns with different types. [#75693](https://github.com/ClickHouse/ClickHouse/pull/75693) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `Block structure mismatch in QueryPipeline stream` error for some queries with `UNION ALL`. [#75715](https://github.com/ClickHouse/ClickHouse/pull/75715) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Rebuild projection on alter modify of its PK column. Previously it could lead to `CANNOT_READ_ALL_DATA` errors during selects after alter modify of the column used in projection PK. [#75720](https://github.com/ClickHouse/ClickHouse/pull/75720) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix incorrect result of `ARRAY JOIN` for scalar subqueries (with analyzer). [#75732](https://github.com/ClickHouse/ClickHouse/pull/75732) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed null pointer dereference in `DistinctSortedStreamTransform`. [#75734](https://github.com/ClickHouse/ClickHouse/pull/75734) ([Nikita Taranov](https://github.com/nickitat)). +* Fix `allow_suspicious_ttl_expressions` behaviour. [#75771](https://github.com/ClickHouse/ClickHouse/pull/75771) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix uninitialized memory read in function `translate`. This closes [#75592](https://github.com/ClickHouse/ClickHouse/issues/75592). [#75794](https://github.com/ClickHouse/ClickHouse/pull/75794) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Propagate format settings to JSON as string formatting in Native format. [#75832](https://github.com/ClickHouse/ClickHouse/pull/75832) ([Pavel Kruglov](https://github.com/Avogar)). +* Recorded the default enablement of parallel hash as join algorithm in v24.12 in the settings change history. This means that ClickHouse will continue to join using non-parallel hash if an older compatibility level than v24.12 is configured. [#75870](https://github.com/ClickHouse/ClickHouse/pull/75870) ([Robert Schulze](https://github.com/rschu1ze)). +* Fixed a bug that tables with implicitly added min-max indices could not be copied into a new table (issue [#75677](https://github.com/ClickHouse/ClickHouse/issues/75677)). [#75877](https://github.com/ClickHouse/ClickHouse/pull/75877) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* `clickhouse-library-bridge` allows opening arbitrary libraries from the filesystem, which makes it safe to run only inside an isolated environment. To prevent a vulnerability when it is run near the clickhouse-server, we will limit the paths of libraries to a location, provided in the configuration. This vulnerability was found with the [ClickHouse Bug Bounty Program](https://github.com/ClickHouse/ClickHouse/issues/38986) by **Arseniy Dugin**. [#75954](https://github.com/ClickHouse/ClickHouse/pull/75954) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* We happened to use JSON serialization for some metadata, which was a mistake, because JSON does not support binary data inside string literals, including zero bytes. SQL queries can contain binary data and invalid UTF-8, so we have to support this in our metadata files as well. At the same time, ClickHouse's `JSONEachRow` and similar formats work around that by deviating from the JSON standard in favor of a perfect roundtrip for the binary data. See the motivation here: https://github.com/ClickHouse/ClickHouse/pull/73668#issuecomment-2560501790. The solution is to make `Poco::JSON` library consistent with the JSON format serialization in ClickHouse. This closes [#73668](https://github.com/ClickHouse/ClickHouse/issues/73668). [#75963](https://github.com/ClickHouse/ClickHouse/pull/75963) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix check for commit limits in storage `S3Queue`. [#76104](https://github.com/ClickHouse/ClickHouse/pull/76104) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix attaching MergeTree tables with auto indexes (`add_minmax_index_for_numeric_columns`/`add_minmax_index_for_string_columns`). [#76139](https://github.com/ClickHouse/ClickHouse/pull/76139) ([Azat Khuzhin](https://github.com/azat)). +* Fixed issue of stack traces from parent threads of a job (`enable_job_stack_trace` setting) are not printed out. Fixed issue `enable_job_stack_trace` setting is not properly propagated to the threads resulting stack trace content not always respects this setting. [#76191](https://github.com/ClickHouse/ClickHouse/pull/76191) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix incorrect permission check where `ALTER RENAME` required `CREATE USER` grant. Closes [#74372](https://github.com/ClickHouse/ClickHouse/issues/74372). [#76241](https://github.com/ClickHouse/ClickHouse/pull/76241) ([pufit](https://github.com/pufit)). +* Fix reinterpretAs with FixedString on big-endian architecture. [#76253](https://github.com/ClickHouse/ClickHouse/pull/76253) ([Azat Khuzhin](https://github.com/azat)). +* Fix logical error in S3Queue "Expected current processor {} to be equal to {} for bucket {}". [#76358](https://github.com/ClickHouse/ClickHouse/pull/76358) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix deadlock for ALTER with Memory database. [#76359](https://github.com/ClickHouse/ClickHouse/pull/76359) ([Azat Khuzhin](https://github.com/azat)). +* Fix logical error in index analysis if condition in `WHERE` has `pointInPolygon` function. [#76360](https://github.com/ClickHouse/ClickHouse/pull/76360) ([Anton Popov](https://github.com/CurtizJ)). +* Fix potentially unsafe call in signal handler. [#76549](https://github.com/ClickHouse/ClickHouse/pull/76549) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix reverse key support in PartsSplitter. This fixes [#73400](https://github.com/ClickHouse/ClickHouse/issues/73400). [#73418](https://github.com/ClickHouse/ClickHouse/pull/73418) ([Amos Bird](https://github.com/amosbird)). + +#### Build/Testing/Packaging Improvement +* Support build HDFS on both ARM and Intel Mac. [#74244](https://github.com/ClickHouse/ClickHouse/pull/74244) ([Yan Xin](https://github.com/yxheartipp)). +* Enable ICU and GRPC when cross-compiling for Darwin. [#75922](https://github.com/ClickHouse/ClickHouse/pull/75922) ([Raúl Marín](https://github.com/Algunenano)). +* Update to embedded LLVM 19. [#75148](https://github.com/ClickHouse/ClickHouse/pull/75148) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Disable network access for user default in the docker image. [#75259](https://github.com/ClickHouse/ClickHouse/pull/75259) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). Make all clickhouse-server related actions a function, and execute them only when launching the default binary in `entrypoint.sh`. A long-postponed improvement was suggested in [#50724](https://github.com/ClickHouse/ClickHouse/issues/50724). Added switch `--users` to `clickhouse-extract-from-config` to get values from the `users.xml`. [#75643](https://github.com/ClickHouse/ClickHouse/pull/75643) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove about 20MB of dead code from the binary. [#76226](https://github.com/ClickHouse/ClickHouse/pull/76226) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +### ClickHouse release 25.1, 2025-01-28 {#251} + +#### Backward Incompatible Change +* `JSONEachRowWithProgress` will write the progress whenever the progress happens. In previous versions, the progress was shown only after each block of the result, which made it useless. Change the way how the progress is displayed: it will not show zero values. This closes [#70800](https://github.com/ClickHouse/ClickHouse/issues/70800). [#73834](https://github.com/ClickHouse/ClickHouse/pull/73834) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `Merge` tables will unify the structure of underlying tables by using a union of their columns and deriving common types. This closes [#64864](https://github.com/ClickHouse/ClickHouse/issues/64864). In certain cases, this change could be backward incompatible. One example is when there is no common type between tables, but conversion to the type of the first table is still possible, such as in the case of UInt64 and Int64 or any numeric type and String. If you want to return to the old behavior, set `merge_table_max_tables_to_look_for_schema_inference` to `1` or set `compatibility` to `24.12` or earlier. [#73956](https://github.com/ClickHouse/ClickHouse/pull/73956) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Parquet output format converts Date and DateTime columns to date/time types supported by Parquet, instead of writing them as raw numbers. `DateTime` becomes `DateTime64(3)` (was: `UInt32`); setting `output_format_parquet_datetime_as_uint32` brings back the old behavior. `Date` becomes `Date32` (was: `UInt16`). [#70950](https://github.com/ClickHouse/ClickHouse/pull/70950) ([Michael Kolupaev](https://github.com/al13n321)). +* Don't allow not comparable types (like `JSON`/`Object`/`AggregateFunction`) in `ORDER BY` and comparison functions `less/greater/equal/etc` by default. [#73276](https://github.com/ClickHouse/ClickHouse/pull/73276) ([Pavel Kruglov](https://github.com/Avogar)). +* The obsolete `MaterializedMySQL` database engine has been removed and is no longer available. [#73879](https://github.com/ClickHouse/ClickHouse/pull/73879) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `mysql` dictionary source no longer does `SHOW TABLE STATUS` query, because it does not provide any value for InnoDB tables, as long as for any recent MySQL versions. This closes [#72636](https://github.com/ClickHouse/ClickHouse/issues/72636). This change is backward compatible, but put in this category so you have a chance to notice it. [#73914](https://github.com/ClickHouse/ClickHouse/pull/73914) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `CHECK TABLE` queries now require a separate, `CHECK` grant. In previous versions, it was enough to have `SHOW TABLES` grant to run these queries. But a `CHECK TABLE` query can be heavy, and usual query complexity limits for `SELECT` queries don't apply to it. It led to the potential of DoS. [#74471](https://github.com/ClickHouse/ClickHouse/pull/74471) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Function `h3ToGeo()` now returns the results in the order `(lat, lon)` (which is the standard order for geometric functions). Users who wish to retain the legacy result order `(lon, lat)` can set setting `h3togeo_lon_lat_result_order = true`. [#74719](https://github.com/ClickHouse/ClickHouse/pull/74719) ([Manish Gill](https://github.com/mgill25)). +* A new MongoDB driver is now the default. Users who like to continue using the legacy driver can set server setting `use_legacy_mongodb_integration` to true. [#73359](https://github.com/ClickHouse/ClickHouse/pull/73359) ([Robert Schulze](https://github.com/rschu1ze)). + +#### New Feature +* Added an ability to apply non-finished (not materialized by background process) mutations during the execution of `SELECT` queries immediately after submitting. It can be enabled by setting `apply_mutations_on_fly`. [#74877](https://github.com/ClickHouse/ClickHouse/pull/74877) ([Anton Popov](https://github.com/CurtizJ)). +* Implement `Iceberg` tables partition pruning for time-related transform partition operations in Iceberg. [#72044](https://github.com/ClickHouse/ClickHouse/pull/72044) ([Daniil Ivanik](https://github.com/divanik)). +* Support subcolumns in MergeTree sorting key and skip indexes. [#72644](https://github.com/ClickHouse/ClickHouse/pull/72644) ([Pavel Kruglov](https://github.com/Avogar)). +* Support reading `HALF_FLOAT` values from `Apache Arrow`/`Parquet`/`ORC` (they are read into `Float32`). This closes [#72960](https://github.com/ClickHouse/ClickHouse/issues/72960). Keep in mind that IEEE-754 half float is not the same as `BFloat16`. Closes [#73835](https://github.com/ClickHouse/ClickHouse/issues/73835). [#73836](https://github.com/ClickHouse/ClickHouse/pull/73836) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `system.trace_log` table will contain two new columns, `symbols` and `lines` containing symbolized stack trace. It allows for easy collection and export of profile information. This is controlled by the server configuration value `symbolize` inside `trace_log` and is enabled by default. [#73896](https://github.com/ClickHouse/ClickHouse/pull/73896) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a new function, `generateSerialID`, which can be used to generate auto-incremental numbers in tables. Continuation of [#64310](https://github.com/ClickHouse/ClickHouse/issues/64310) by [kazalika](https://github.com/kazalika). This closes [#62485](https://github.com/ClickHouse/ClickHouse/issues/62485). [#73950](https://github.com/ClickHouse/ClickHouse/pull/73950) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add syntax `query1 PARALLEL WITH query2 PARALLEL WITH query3 ... PARALLEL WITH queryN` for DDL queries. That means subqueries `{query1, query2, ... queryN}` are allowed to run in parallel with each other (and it's preferable). [#73983](https://github.com/ClickHouse/ClickHouse/pull/73983) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added an in-memory cache for deserialized skipping index granules. This should make repeated queries that use skipping indexes faster. The size of the new cache is controlled by server settings `skipping_index_cache_size` and `skipping_index_cache_max_entries`. The original motivation for the cache were vector similarity indexes which became a lot faster now. [#70102](https://github.com/ClickHouse/ClickHouse/pull/70102) ([Robert Schulze](https://github.com/rschu1ze)). +* Now, the embedded Web UI has a progress bar during query runtime. It allows cancelling queries. It displays the total number of records and the extended information about the speed. The table can be rendered incrementally as soon as data arrives. Enable HTTP compression. Rendering of the table became faster. The table header became sticky. It allows selecting cells and navigating them by arrow keys. Fix the issue when the outline of the selected cell makes it smaller. Cells no longer expand on mouse hover but only on selection. The moment to stop rendering the incoming data is decided on the client rather than on the server side. Highlight digit groups for numbers. The overall design was refreshed and became bolder. It checks if the server is reachable and the correctness of credentials and displays the server version and uptime. The cloud icon is contoured in every font, even in Safari. Big integers inside nested data types will be rendered better. It will display inf/nan correctly. It will display data types when the mouse is over a column header. [#74204](https://github.com/ClickHouse/ClickHouse/pull/74204) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add the ability to create min-max (skipping) indices by default for columns managed by MergeTree using settings `add_minmax_index_for_numeric_columns` (for numeric columns) and `add_minmax_index_for_string_columns` (for string columns). For now, both settings are disabled, so there is no behavior change yet. [#74266](https://github.com/ClickHouse/ClickHouse/pull/74266) ([Smita Kulkarni](https://github.com/SmitaRKulkarni)). +* Add `script_query_number` and `script_line_number` fields to `system.query_log`, to the ClientInfo in the native protocol, and to server logs. This closes [#67542](https://github.com/ClickHouse/ClickHouse/issues/67542). Credits to [pinsvin00](https://github.com/pinsvin00) for kicking off this feature earlier in [#68133](https://github.com/ClickHouse/ClickHouse/issues/68133). [#74477](https://github.com/ClickHouse/ClickHouse/pull/74477) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added aggregation function `sequenceMatchEvents` which return timestamps of matched events for longest chain of events in pattern. [#72349](https://github.com/ClickHouse/ClickHouse/pull/72349) ([UnamedRus](https://github.com/UnamedRus)). +* Added function `arrayNormalizedGini`. [#72823](https://github.com/ClickHouse/ClickHouse/pull/72823) ([flynn](https://github.com/ucasfl)). +* Add minus operator support for `DateTime64`, to allow subtraction between `DateTime64` values, as well as `DateTime`. [#74482](https://github.com/ClickHouse/ClickHouse/pull/74482) ([Li Yin](https://github.com/liyinsg)). + +#### Experimental Features +* The `BFloat16` data type is production-ready. [#73840](https://github.com/ClickHouse/ClickHouse/pull/73840) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement +* Optimized function `indexHint`. Now, columns that are only used as arguments of function `indexHint` are not read from the table. [#74314](https://github.com/ClickHouse/ClickHouse/pull/74314) ([Anton Popov](https://github.com/CurtizJ)). If the `indexHint` function is a central piece of your enterprise data architecture, this optimization will save your life. +* More accurate accounting for `max_joined_block_size_rows` setting for `parallel_hash` JOIN algorithm. Helps to avoid increased memory consumption compared to `hash` algorithm. [#74630](https://github.com/ClickHouse/ClickHouse/pull/74630) ([Nikita Taranov](https://github.com/nickitat)). +* Support predicate push down optimization on the query plan level for the `MergingAggregated` step. It improves performance for some queries with the analyzer. [#74073](https://github.com/ClickHouse/ClickHouse/pull/74073) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Splitting of left table blocks by hash was removed from the probe phase of the `parallel_hash` JOIN algorithm. [#73089](https://github.com/ClickHouse/ClickHouse/pull/73089) ([Nikita Taranov](https://github.com/nickitat)). +* Optimize RowBinary input format. Closes [#63805](https://github.com/ClickHouse/ClickHouse/issues/63805). [#65059](https://github.com/ClickHouse/ClickHouse/pull/65059) ([Pavel Kruglov](https://github.com/Avogar)). +* Write parts with level 1 if `optimize_on_insert` is enabled. It allows to use several optimizations of queries with `FINAL` for freshly written parts. [#73132](https://github.com/ClickHouse/ClickHouse/pull/73132) ([Anton Popov](https://github.com/CurtizJ)). +* Speedup string deserialization by some low-level optimisation. [#65948](https://github.com/ClickHouse/ClickHouse/pull/65948) ([Nikita Taranov](https://github.com/nickitat)). +* When running an equality comparison between records, such as during merges, start to compare rows from most likely unequal columns first. [#63780](https://github.com/ClickHouse/ClickHouse/pull/63780) ([UnamedRus](https://github.com/UnamedRus)). +* Improve grace hash join performance by re-ranking the right join table by keys. [#72237](https://github.com/ClickHouse/ClickHouse/pull/72237) ([kevinyhzou](https://github.com/KevinyhZou)). +* Allow `arrayROCAUC` and `arrayAUCPR` to compute partial area of the whole curve, so that its calculation can be parallelized over huge datasets. [#72904](https://github.com/ClickHouse/ClickHouse/pull/72904) ([Emmanuel](https://github.com/emmanuelsdias)). +* Avoid spawn too many idle threads. [#72920](https://github.com/ClickHouse/ClickHouse/pull/72920) ([Guo Wangyang](https://github.com/guowangy)). +* Don't list blob storage keys if we only have curly brackets expansion in table function. Closes [#73333](https://github.com/ClickHouse/ClickHouse/issues/73333). [#73518](https://github.com/ClickHouse/ClickHouse/pull/73518) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Short circuit optimization for functions executed over Nullable arguments. [#73820](https://github.com/ClickHouse/ClickHouse/pull/73820) ([李扬](https://github.com/taiyang-li)). +* Do not apply `maskedExecute` on non-function columns, improve the performance of short circuit execution. [#73965](https://github.com/ClickHouse/ClickHouse/pull/73965) ([lgbo](https://github.com/lgbo-ustc)). +* Disable the autodetection of headers in input formats for `Kafka`/`NATS`/`RabbitMQ`/`FileLog` to improve performance. [#74006](https://github.com/ClickHouse/ClickHouse/pull/74006) ([Azat Khuzhin](https://github.com/azat)). +* Execute pipeline with a higher degree of parallelism after aggregation with grouping sets. [#74082](https://github.com/ClickHouse/ClickHouse/pull/74082) ([Nikita Taranov](https://github.com/nickitat)). +* Reduce critical section in `MergeTreeReadPool`. [#74202](https://github.com/ClickHouse/ClickHouse/pull/74202) ([Guo Wangyang](https://github.com/guowangy)). +* Parallel replicas performance improvement. Packets deserialization on query initiator, for packets not related to parallel replicas protocol, now always happens in pipeline thread. Before, it could happen in a thread responsible for pipeline scheduling, which could make initiator less responsive and delay pipeline execution. [#74398](https://github.com/ClickHouse/ClickHouse/pull/74398) ([Igor Nikonov](https://github.com/devcrafter)). +* Improve performance of larger multi requests in Keeper. [#74849](https://github.com/ClickHouse/ClickHouse/pull/74849) ([Antonio Andelic](https://github.com/antonio2368)). +* Use log wrappers by value and don't allocate them in a heap. [#74034](https://github.com/ClickHouse/ClickHouse/pull/74034) ([Mikhail Artemenko](https://github.com/Michicosun)). +* Reestablish connection to MySQL and Postgres dictionary replicas in the background, so it wouldn't delay requests to corresponding dictionaries. [#71101](https://github.com/ClickHouse/ClickHouse/pull/71101) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Parallel replicas used historical information about replica availability to improve replica selection but did not update the replica's error count when the connection was unavailable. This PR updates the replica's error count when unavailable. [#72666](https://github.com/ClickHouse/ClickHouse/pull/72666) ([zoomxi](https://github.com/zoomxi)). +* Added a merge tree setting `materialize_skip_indexes_on_merge` which suppresses the creation of skip indexes during merge. This allows users to control explicitly (via `ALTER TABLE [..] MATERIALIZE INDEX [...]`) when skip indexes are created. This can be useful if skip indexes are expensive to build (e.g. vector similarity indexes). [#74401](https://github.com/ClickHouse/ClickHouse/pull/74401) ([Robert Schulze](https://github.com/rschu1ze)). +* Optimize keeper requests in Storage(S3/Azure)Queue. [#74410](https://github.com/ClickHouse/ClickHouse/pull/74410) ([Kseniia Sumarokova](https://github.com/kssenii)). [#74538](https://github.com/ClickHouse/ClickHouse/pull/74538) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Use up to `1000` parallel replicas by default. [#74504](https://github.com/ClickHouse/ClickHouse/pull/74504) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Improve HTTP session reuse when reading from s3 disk ([#72401](https://github.com/ClickHouse/ClickHouse/issues/72401)). [#74548](https://github.com/ClickHouse/ClickHouse/pull/74548) ([Julian Maicher](https://github.com/jmaicher)). + +#### Improvement +* Support SETTINGS in a CREATE TABLE query with an implicit ENGINE and support mixing engine and query settings. [#73120](https://github.com/ClickHouse/ClickHouse/pull/73120) ([Raúl Marín](https://github.com/Algunenano)). +* Enable `use_hive_partitioning` by default. [#71636](https://github.com/ClickHouse/ClickHouse/pull/71636) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Support CAST and ALTER between JSON types with different parameters. [#72303](https://github.com/ClickHouse/ClickHouse/pull/72303) ([Pavel Kruglov](https://github.com/Avogar)). +* Support equal comparison for values of JSON column. [#72991](https://github.com/ClickHouse/ClickHouse/pull/72991) ([Pavel Kruglov](https://github.com/Avogar)). +* Improve formatting of identifiers with JSON subcolumns to avoid unnecessary back quotes. [#73085](https://github.com/ClickHouse/ClickHouse/pull/73085) ([Pavel Kruglov](https://github.com/Avogar)). +* Interactive metrics improvements. Fix metrics from parallel replicas not being fully displayed. Display the metrics in order of the most recent update, then lexicographically by name. Do not display stale metrics. [#71631](https://github.com/ClickHouse/ClickHouse/pull/71631) ([Julia Kartseva](https://github.com/jkartseva)). +* Make JSON output format pretty by default. Add new setting `output_format_json_pretty_print` to control it and enable it by default. [#72148](https://github.com/ClickHouse/ClickHouse/pull/72148) ([Pavel Kruglov](https://github.com/Avogar)). +* Allow `LowCardinality(UUID)` by default. This has proven practical among ClickHouse Cloud customers. [#73826](https://github.com/ClickHouse/ClickHouse/pull/73826) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better message during installation. [#73827](https://github.com/ClickHouse/ClickHouse/pull/73827) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better message about password reset for ClickHouse Cloud. [#73831](https://github.com/ClickHouse/ClickHouse/pull/73831) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the error message with a File table that cannot perform appends into a file. [#73832](https://github.com/ClickHouse/ClickHouse/pull/73832) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Ask when a user accidentally requests to output binary format (such as Native, Parquet, Avro) in the terminal. This closes [#59524](https://github.com/ClickHouse/ClickHouse/issues/59524). [#73833](https://github.com/ClickHouse/ClickHouse/pull/73833) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Highlight trailing spaces in Pretty and Vertical formats in the terminal for better clarity. This is controlled with the `output_format_pretty_highlight_trailing_spaces` setting. Initial implementation by [Braden Burns](https://github.com/bradenburns) from [#72996](https://github.com/ClickHouse/ClickHouse/issues/72996). Closes [#71590](https://github.com/ClickHouse/ClickHouse/issues/71590). [#73847](https://github.com/ClickHouse/ClickHouse/pull/73847) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `clickhouse-client` and `clickhouse-local` will autodetect compression of stdin when it is redirected from a file. This closes [#70865](https://github.com/ClickHouse/ClickHouse/issues/70865). [#73848](https://github.com/ClickHouse/ClickHouse/pull/73848) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Cut too long column names in pretty formats by default. This is controlled by the `output_format_pretty_max_column_name_width_cut_to` and `output_format_pretty_max_column_name_width_min_chars_to_cut` settings. This is the continuation of the work of [tanmaydatta](https://github.com/tanmaydatta) in [#66502](https://github.com/ClickHouse/ClickHouse/issues/66502). This closes [#65968](https://github.com/ClickHouse/ClickHouse/issues/65968). [#73851](https://github.com/ClickHouse/ClickHouse/pull/73851) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make `Pretty` formats prettier: squash blocks if not much time passed since the output of the previous block. This is controlled by new settings `output_format_pretty_squash_consecutive_ms` (50 ms by default) and `output_format_pretty_squash_max_wait_ms` (1000 ms by default). Continuation of [#49537](https://github.com/ClickHouse/ClickHouse/issues/49537). This closes [#49153](https://github.com/ClickHouse/ClickHouse/issues/49153). [#73852](https://github.com/ClickHouse/ClickHouse/pull/73852) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a metric on the number of currently merging source parts. This closes [#70809](https://github.com/ClickHouse/ClickHouse/issues/70809). [#73868](https://github.com/ClickHouse/ClickHouse/pull/73868) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Highlight columns in the `Vertical` format if the output is to a terminal. This can be disabled with the `output_format_pretty_color` setting. [#73898](https://github.com/ClickHouse/ClickHouse/pull/73898) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enhanced the MySQL compatibility to a level that now, `mysqlsh` (a rich MySQL CLI from Oracle) can connect to ClickHouse. This is needed to facilitate testing. [#73912](https://github.com/ClickHouse/ClickHouse/pull/73912) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Pretty formats can render multi-line fields inside a table cell, which improves readability. This is enabled by default and can be controlled by the setting `output_format_pretty_multiline_fields`. Continuation of the work by [Volodyachan](https://github.com/Volodyachan) in [#64094](https://github.com/ClickHouse/ClickHouse/issues/64094). This closes [#56912](https://github.com/ClickHouse/ClickHouse/issues/56912). [#74032](https://github.com/ClickHouse/ClickHouse/pull/74032) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Expose X-ClickHouse HTTP headers to JavaScript in the browser. It makes writing applications more convenient. [#74180](https://github.com/ClickHouse/ClickHouse/pull/74180) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `JSONEachRowWithProgress` format will include events with metadata, as well as totals and extremes. It also includes `rows_before_limit_at_least` and `rows_before_aggregation`. The format prints the exception properly if it arrives after partial results. The progress now includes elapsed nanoseconds. One final progress event is emitted at the end. The progress during query runtime will be printed no more frequently than the value of the `interactive_delay` setting. [#74181](https://github.com/ClickHouse/ClickHouse/pull/74181) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Hourglass will rotate smoothly in Play UI. [#74182](https://github.com/ClickHouse/ClickHouse/pull/74182) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Even if the HTTP response is compressed, send packets as soon as they arrive. This allows the browser to receive progress packets and compressed data. [#74201](https://github.com/ClickHouse/ClickHouse/pull/74201) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* If the number of output records is larger than N = `output_format_pretty_max_rows`, instead of displaying only the first N rows, we will cut the output table in the middle, displaying N/2 first rows and N/2 last rows. Continuation of [#64200](https://github.com/ClickHouse/ClickHouse/issues/64200). This closes [#59502](https://github.com/ClickHouse/ClickHouse/issues/59502). [#73929](https://github.com/ClickHouse/ClickHouse/pull/73929) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow more general join planning algorithm when hash join algorithm is enabled. [#71926](https://github.com/ClickHouse/ClickHouse/pull/71926) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Allow to create bloom_filter index on columns with data type `DateTime64`. [#66416](https://github.com/ClickHouse/ClickHouse/pull/66416) ([Yutong Xiao](https://github.com/YutSean)). +* When `min_age_to_force_merge_seconds` and `min_age_to_force_merge_on_partition_only` are both enabled, the part merging will ignore the max bytes limit. [#73656](https://github.com/ClickHouse/ClickHouse/pull/73656) ([Kai Zhu](https://github.com/nauu)). +* Added HTTP headers to OpenTelemetry span logs table for enhanced traceability. [#70516](https://github.com/ClickHouse/ClickHouse/pull/70516) ([jonymohajanGmail](https://github.com/jonymohajanGmail)). +* Support writing `orc` file by custom time zone, not always by the `GMT` time zone. [#70615](https://github.com/ClickHouse/ClickHouse/pull/70615) ([kevinyhzou](https://github.com/KevinyhZou)). +* Respect IO scheduling settings when writing backups across clouds. [#71093](https://github.com/ClickHouse/ClickHouse/pull/71093) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Add `metric` column alias `name` to `system.asynchronous_metrics`. [#71164](https://github.com/ClickHouse/ClickHouse/pull/71164) ([megao](https://github.com/jetgm)). +* Historically for some reason, the query `ALTER TABLE MOVE PARTITION TO TABLE` checked `SELECT` and `ALTER DELETE` rights instead of dedicated `ALTER_MOVE_PARTITION`. This PR makes use of this access type. For compatibility, this permission is also will be granted implicitly if `SELECT` and `ALTER DELETE` are granted, but this behavior will be removed in future releases. Closes [#16403](https://github.com/ClickHouse/ClickHouse/issues/16403). [#71632](https://github.com/ClickHouse/ClickHouse/pull/71632) ([pufit](https://github.com/pufit)). +* Throw an exception when trying to materialize a column in the sort key instead of allowing it to break the sort order. [#71891](https://github.com/ClickHouse/ClickHouse/pull/71891) ([Peter Nguyen](https://github.com/petern48)). +* Hide secrets in `EXPLAIN QUERY TREE`. [#72025](https://github.com/ClickHouse/ClickHouse/pull/72025) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Support parquet integer logical types in the "native" reader. [#72105](https://github.com/ClickHouse/ClickHouse/pull/72105) ([Arthur Passos](https://github.com/arthurpassos)). +* Interactively request credentials in the browser if the default user requires a password. In previous versions, the server returned HTTP 403; now, it returns HTTP 401. [#72198](https://github.com/ClickHouse/ClickHouse/pull/72198) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Convert access types `CREATE_USER`, `ALTER_USER`, `DROP_USER`, `CREATE_ROLE`, `ALTER_ROLE`, `DROP_ROLE` from global to parameterized. That means users can now grant access management grants more precise:. [#72246](https://github.com/ClickHouse/ClickHouse/pull/72246) ([pufit](https://github.com/pufit)). +* Add the `latest_fail_error_code_name` column to `system.mutations`. We need this column to introduce a new metric on stuck mutations and use it to build graphs of the errors encountered in the cloud as well as, optionally, adding a new less-noisy alert. [#72398](https://github.com/ClickHouse/ClickHouse/pull/72398) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Reduce amount of allocation in the `ATTACH PARTITION` query. [#72583](https://github.com/ClickHouse/ClickHouse/pull/72583) ([Konstantin Morozov](https://github.com/k-morozov)). +* Make `max_bytes_before_external_sort` limit depends on total query memory consumption (previously it was number of bytes in the sorting block for one sorting thread, now it has the same meaning as `max_bytes_before_external_group_by` - it is total limit for the whole query memory for all threads). Also one more setting added to control on disk block size - `min_external_sort_block_bytes`. [#72598](https://github.com/ClickHouse/ClickHouse/pull/72598) ([Azat Khuzhin](https://github.com/azat)). +* Ignore memory restrictions by trace collector. [#72606](https://github.com/ClickHouse/ClickHouse/pull/72606) ([Azat Khuzhin](https://github.com/azat)). +* Add server settings `dictionaries_lazy_load` and `wait_dictionaries_load_at_startup` to `system.server_settings`. [#72664](https://github.com/ClickHouse/ClickHouse/pull/72664) ([Christoph Wurm](https://github.com/cwurm)). +* Adds setting `max_backup_bandwidth` to the list of settings that can be specified as part of `BACKUP`/`RESTORE` queries. [#72665](https://github.com/ClickHouse/ClickHouse/pull/72665) ([Christoph Wurm](https://github.com/cwurm)). +* Reducing the log level for appearing replicated parts in the ReplicatedMergeTree engine to help minimize the volume of logs generated in a replicated cluster. [#72876](https://github.com/ClickHouse/ClickHouse/pull/72876) ([mor-akamai](https://github.com/morkalfon)). +* Improve extraction of common expression in disjunctions. Allow simplifying the resulting filter expression even if there's no common subexpression for all the disjuncts. Continuation of [#71537](https://github.com/ClickHouse/ClickHouse/issues/71537). [#73271](https://github.com/ClickHouse/ClickHouse/pull/73271) ([Dmitry Novik](https://github.com/novikd)). +* In Storage `S3Queue`/`AzureQueue` allow to add settings where table was created without settings. [#73283](https://github.com/ClickHouse/ClickHouse/pull/73283) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Introduce a setting `least_greatest_legacy_null_behavior` (default: `false`) which controls if functions `least` and `greatest` handle `NULL` arguments by unconditionally returning `NULL` (if `true`) or by ignoring them (if `false`). [#73344](https://github.com/ClickHouse/ClickHouse/pull/73344) ([Robert Schulze](https://github.com/rschu1ze)). +* Use Keeper multi requests in the cleanup thread of ObjectStorageQueueMetadata. [#73357](https://github.com/ClickHouse/ClickHouse/pull/73357) ([Antonio Andelic](https://github.com/antonio2368)). +* When ClickHouse runs under a cgroup we will still collect system-wide asynchronous metrics related to system load, process scheduling, memory etc. They might provide useful signals when ClickHouse is the only process on the host with high resource consumption. [#73369](https://github.com/ClickHouse/ClickHouse/pull/73369) ([Nikita Taranov](https://github.com/nickitat)). +* In storage `S3Queue` allow to transfer old ordered tables created before 24.6 to new structure with buckets. [#73467](https://github.com/ClickHouse/ClickHouse/pull/73467) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `system.azure_queue` similar to existing `system.s3queue`. [#73477](https://github.com/ClickHouse/ClickHouse/pull/73477) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Function `parseDateTime64` (and its variants) now produces correct results for input dates before 1970 / after 2106. Example: `SELECT parseDateTime64InJodaSyntax('2200-01-01 00:00:00.000', 'yyyy-MM-dd HH:mm:ss.SSS')`. [#73594](https://github.com/ClickHouse/ClickHouse/pull/73594) ([zhanglistar](https://github.com/zhanglistar)). +* Address some `clickhouse-disks` usability issues addressed by users. Closes [#67136](https://github.com/ClickHouse/ClickHouse/issues/67136). [#73616](https://github.com/ClickHouse/ClickHouse/pull/73616) ([Daniil Ivanik](https://github.com/divanik)). +* Allow to alter commit settings in storage S3(Azure)Queue. (Commit settings are: `max_processed_files_before_commit`, `max_processed_rows_before_commit`, `max_processed_bytes_before_commit`, `max_processing_time_sec_before_commit`). [#73635](https://github.com/ClickHouse/ClickHouse/pull/73635) ([Kseniia Sumarokova](https://github.com/kssenii)). +* In storage S3(Azure)Queue aggregate progress between sources to compare with commit limit settings. [#73641](https://github.com/ClickHouse/ClickHouse/pull/73641) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support core settings in `BACKUP`/`RESTORE` query. [#73650](https://github.com/ClickHouse/ClickHouse/pull/73650) ([Vitaly Baranov](https://github.com/vitlibar)). +* Take into account the `output_format_compression_level` on Parquet output. [#73651](https://github.com/ClickHouse/ClickHouse/pull/73651) ([Arthur Passos](https://github.com/arthurpassos)). +* Adds reading Apache Arrow's `fixed_size_list` as an `Array` instead of treating it as an unsupported type. [#73654](https://github.com/ClickHouse/ClickHouse/pull/73654) ([Julian Meyers](https://github.com/J-Meyers)). +* Add two backup engines: `Memory` (keeps backups inside the current user session), and `Null` (don't keep backups anywhere), which is for testing. [#73690](https://github.com/ClickHouse/ClickHouse/pull/73690) ([Vitaly Baranov](https://github.com/vitlibar)). +* `concurrent_threads_soft_limit_num` and `concurrent_threads_soft_limit_num_ratio_to_cores` could be changed w/o restart of a server. [#73713](https://github.com/ClickHouse/ClickHouse/pull/73713) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for extended numeric types (`Decimal`, big integers) in `formatReadable` functions. [#73765](https://github.com/ClickHouse/ClickHouse/pull/73765) ([Raúl Marín](https://github.com/Algunenano)). +* Support TLS for Postgres wire protocol compatibility. [#73812](https://github.com/ClickHouse/ClickHouse/pull/73812) ([scanhex12](https://github.com/scanhex12)). +* The function `isIPv4String` returned true if the correct IPv4 address was followed by a zero byte, while it should return false in this case. Continuation of [#65387](https://github.com/ClickHouse/ClickHouse/issues/65387). [#73946](https://github.com/ClickHouse/ClickHouse/pull/73946) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make the error code in the MySQL wire protocol compatible with MySQL. Continuation of [#56831](https://github.com/ClickHouse/ClickHouse/issues/56831). Closes [#50957](https://github.com/ClickHouse/ClickHouse/issues/50957). [#73948](https://github.com/ClickHouse/ClickHouse/pull/73948) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add setting `validate_enum_literals_in_opearators` to validate enum literals in operators like `IN`, `NOT IN` against the enum type and throw an exception if the literal is not a valid enum value. [#73985](https://github.com/ClickHouse/ClickHouse/pull/73985) ([Vladimir Cherkasov](https://github.com/vdimir)). +* In Storage `S3(Azure)Queue` commit all files (in a single butch defined by commit settings) in a single keeper transaction. [#73991](https://github.com/ClickHouse/ClickHouse/pull/73991) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable header detection for executable UDFs and dictionaries (could lead to Function 'X': wrong result, expected Y row(s), actual Y-1). [#73992](https://github.com/ClickHouse/ClickHouse/pull/73992) ([Azat Khuzhin](https://github.com/azat)). +* Add the `distributed` option for `EXPLAIN PLAN.` Now, `EXPLAIN distributed=1 ... ` appends remote plan to `ReadFromParallelRemote*` steps. [#73994](https://github.com/ClickHouse/ClickHouse/pull/73994) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Use correct return type for not/xor with Dynamic arguments. [#74013](https://github.com/ClickHouse/ClickHouse/pull/74013) ([Pavel Kruglov](https://github.com/Avogar)). +* Allow changing `add_implicit_sign_column_constraint_for_collapsing_engine` after table creation. [#74014](https://github.com/ClickHouse/ClickHouse/pull/74014) ([Christoph Wurm](https://github.com/cwurm)). +* Support subcolumns in materialized view select query. [#74030](https://github.com/ClickHouse/ClickHouse/pull/74030) ([Pavel Kruglov](https://github.com/Avogar)). +* There are now three simple ways to set a custom prompt in `clickhouse-client`: 1. via command-line parameter `--prompt`, 2. in the configuration file, via settings `[...]`, and 3. also in the configuration file, via per-connection settings `[...]`. [#74168](https://github.com/ClickHouse/ClickHouse/pull/74168) ([Christoph Wurm](https://github.com/cwurm)). +* Autodetect secure connection based on connecting to port 9440 in ClickHouse Client. [#74212](https://github.com/ClickHouse/ClickHouse/pull/74212) ([Christoph Wurm](https://github.com/cwurm)). +* Authenticate users with username only for http_handlers (previously it requires user to put the password as well). [#74221](https://github.com/ClickHouse/ClickHouse/pull/74221) ([Azat Khuzhin](https://github.com/azat)). +* Support for the alternative query languages PRQL and KQL was marked experimental. To use them, specify settings `allow_experimental_prql_dialect = 1` and `allow_experimental_kusto_dialect = 1`. [#74224](https://github.com/ClickHouse/ClickHouse/pull/74224) ([Robert Schulze](https://github.com/rschu1ze)). +* Support returning the default Enum type in more aggregate functions. [#74272](https://github.com/ClickHouse/ClickHouse/pull/74272) ([Raúl Marín](https://github.com/Algunenano)). +* In `OPTIMIZE TABLE`, it is now possible to specify keyword `FORCE` as an alternative to existing keyword `FINAL`. [#74342](https://github.com/ClickHouse/ClickHouse/pull/74342) ([Robert Schulze](https://github.com/rschu1ze)). +* Add the `IsServerShuttingDown` metric, which is needed to trigger an alert when the server shutdown takes too much time. [#74429](https://github.com/ClickHouse/ClickHouse/pull/74429) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Added Iceberg tables names to EXPLAIN. [#74485](https://github.com/ClickHouse/ClickHouse/pull/74485) ([alekseev-maksim](https://github.com/alekseev-maksim)). +* Provide a better error message when using RECURSIVE CTE with the old analyzer. [#74523](https://github.com/ClickHouse/ClickHouse/pull/74523) ([Raúl Marín](https://github.com/Algunenano)). +* Show extended error messages in `system.errors`. [#74574](https://github.com/ClickHouse/ClickHouse/pull/74574) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow to use password for client communication with clickhouse-keeper. This feature is not very useful if you specify proper SSL configuration for server and client, but still can be useful for some cases. Password cannot be longer than 16 characters. It's not connected with Keeper Auth model. [#74673](https://github.com/ClickHouse/ClickHouse/pull/74673) ([alesapin](https://github.com/alesapin)). +* Add error code for config reloader. [#74746](https://github.com/ClickHouse/ClickHouse/pull/74746) ([Garrett Thomas](https://github.com/garrettthomaskth)). +* Added support for IPv6 addresses in MySQL and PostgreSQL table functions and engines. [#74796](https://github.com/ClickHouse/ClickHouse/pull/74796) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Implement short circuit optimization for `divideDecimal`. Fixes [#74280](https://github.com/ClickHouse/ClickHouse/issues/74280). [#74843](https://github.com/ClickHouse/ClickHouse/pull/74843) ([Kevin Mingtarja](https://github.com/kevinmingtarja)). +* Now users can be specified inside the startup scripts. [#74894](https://github.com/ClickHouse/ClickHouse/pull/74894) ([pufit](https://github.com/pufit)). +* Add support for Azure SAS Tokens. [#72959](https://github.com/ClickHouse/ClickHouse/pull/72959) ([Azat Khuzhin](https://github.com/azat)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Set parquet compression level only if compression codec supports it. [#74659](https://github.com/ClickHouse/ClickHouse/pull/74659) ([Arthur Passos](https://github.com/arthurpassos)). +* Fixed a regression that using collation locales with modifiers throws an error. As an example, `SELECT arrayJoin(['kk 50', 'KK 01', ' KK 2', ' KK 3', 'kk 1', 'x9y99', 'x9y100']) item ORDER BY item ASC COLLATE 'tr-u-kn-true-ka-shifted` now works. [#73544](https://github.com/ClickHouse/ClickHouse/pull/73544) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix cannot create SEQUENTIAL node with keeper-client. [#64177](https://github.com/ClickHouse/ClickHouse/pull/64177) ([Duc Canh Le](https://github.com/canhld94)). +* Fix incorrect character counting in the position functions. [#71003](https://github.com/ClickHouse/ClickHouse/pull/71003) ([思维](https://github.com/heymind)). +* `RESTORE` operations for access entities required more permission than necessary because of unhandled partial revokes. This PR fixes the issue. Closes [#71853](https://github.com/ClickHouse/ClickHouse/issues/71853). [#71958](https://github.com/ClickHouse/ClickHouse/pull/71958) ([pufit](https://github.com/pufit)). +* Avoid pause after `ALTER TABLE REPLACE/MOVE PARTITION FROM/TO TABLE`. Retrieve correct settings for background task scheduling. [#72024](https://github.com/ClickHouse/ClickHouse/pull/72024) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix handling of empty tuples in some input and output formats (e.g. Parquet, Arrow). [#72616](https://github.com/ClickHouse/ClickHouse/pull/72616) ([Michael Kolupaev](https://github.com/al13n321)). +* Column-level GRANT SELECT/INSERT statements on wildcard databases/tables now throw an error. [#72646](https://github.com/ClickHouse/ClickHouse/pull/72646) ([Johann Gan](https://github.com/johanngan)). +* Fix the situation when a user can't run `REVOKE ALL ON *.*` because of implicit grants in the target access entity. [#72872](https://github.com/ClickHouse/ClickHouse/pull/72872) ([pufit](https://github.com/pufit)). +* Fix positive timezone formatting of formatDateTime scalar function. [#73091](https://github.com/ClickHouse/ClickHouse/pull/73091) ([ollidraese](https://github.com/ollidraese)). +* Fix to correctly reflect source port when connection made through PROXYv1 and `auth_use_forwarded_address` is set - previously proxy port was incorrectly used. Add `currentQueryID()` function. [#73095](https://github.com/ClickHouse/ClickHouse/pull/73095) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Propagate format settings to NativeWriter in TCPHandler, so settings like `output_format_native_write_json_as_string` are applied correctly. [#73179](https://github.com/ClickHouse/ClickHouse/pull/73179) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix a crash in StorageObjectStorageQueue. [#73274](https://github.com/ClickHouse/ClickHouse/pull/73274) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix rare crash in refreshable materialized view during server shutdown. [#73323](https://github.com/ClickHouse/ClickHouse/pull/73323) ([Michael Kolupaev](https://github.com/al13n321)). +* The `%f` placeholder of function `formatDateTime` now unconditionally generates six (sub-second) digits. This makes the behavior compatible with MySQL `DATE_FORMAT` function. The previous behavior can be restored using setting `formatdatetime_f_prints_scale_number_of_digits = 1`. [#73324](https://github.com/ClickHouse/ClickHouse/pull/73324) ([ollidraese](https://github.com/ollidraese)). +* Fixed filtering by `_etag` column while reading from `s3` storage and table function. [#73353](https://github.com/ClickHouse/ClickHouse/pull/73353) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `Not-ready Set is passed as the second argument for function 'in'` error when `IN (subquery)` is used in `JOIN ON` expression, with the old analyzer. [#73382](https://github.com/ClickHouse/ClickHouse/pull/73382) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix preparing for squashin for Dynamic and JSON columns. Previously in some cases new types could be inserted into shared variant/shared data even when the limit on types/paths is not reached. [#73388](https://github.com/ClickHouse/ClickHouse/pull/73388) ([Pavel Kruglov](https://github.com/Avogar)). +* Check for corrupted sizes during types binary decoding to avoid too big allocations. [#73390](https://github.com/ClickHouse/ClickHouse/pull/73390) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixed a logical error when reading from single-replica cluster with parallel replicas enabled. [#73403](https://github.com/ClickHouse/ClickHouse/pull/73403) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix ObjectStorageQueue with ZooKeeper and older Keeper. [#73420](https://github.com/ClickHouse/ClickHouse/pull/73420) ([Antonio Andelic](https://github.com/antonio2368)). +* Implements fix, needed to enable hive partitioning by default. [#73479](https://github.com/ClickHouse/ClickHouse/pull/73479) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix data race when creating vector similarity index. [#73517](https://github.com/ClickHouse/ClickHouse/pull/73517) ([Antonio Andelic](https://github.com/antonio2368)). +* Fixes segfault when the source of the dictionary contains a function with wrong data. [#73535](https://github.com/ClickHouse/ClickHouse/pull/73535) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix retries on failed insert in storage S3(Azure)Queue. Closes [#70951](https://github.com/ClickHouse/ClickHouse/issues/70951). [#73546](https://github.com/ClickHouse/ClickHouse/pull/73546) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed error in function `tupleElement` which may appear in some cases for tuples with `LowCardinality` elements and enabled setting `optimize_functions_to_subcolumns`. [#73548](https://github.com/ClickHouse/ClickHouse/pull/73548) ([Anton Popov](https://github.com/CurtizJ)). +* Fix parsing enum glob followed by range one. Fixes [#73473](https://github.com/ClickHouse/ClickHouse/issues/73473). [#73569](https://github.com/ClickHouse/ClickHouse/pull/73569) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fixed parallel_replicas_for_non_replicated_merge_tree being ignored in subqueries for non-replicated tables. [#73584](https://github.com/ClickHouse/ClickHouse/pull/73584) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix for std::logical_error thrown when task cannot be scheduled. Found in stress tests. [#73629](https://github.com/ClickHouse/ClickHouse/pull/73629) ([Alexander Gololobov](https://github.com/davenger)). +* Do not interpret queries in `EXPLAIN SYNTAX` to avoid logical errors with incorrect processing stage for distributed queries. Fixes [#65205](https://github.com/ClickHouse/ClickHouse/issues/65205). [#73634](https://github.com/ClickHouse/ClickHouse/pull/73634) ([Dmitry Novik](https://github.com/novikd)). +* Fix possible data inconsistency in Dynamic column. Fixes possible logical error `Nested columns sizes are inconsistent with local_discriminators column size`. [#73644](https://github.com/ClickHouse/ClickHouse/pull/73644) ([Pavel Kruglov](https://github.com/Avogar)). +* Fixed `NOT_FOUND_COLUMN_IN_BLOCK` in queries with `FINAL` and `SAMPLE`. Fixed incorrect result in selects with `FINAL` from `CollapsingMergeTree` and enabled optimizations of `FINAL` . [#73682](https://github.com/ClickHouse/ClickHouse/pull/73682) ([Anton Popov](https://github.com/CurtizJ)). +* Fix crash in LIMIT BY COLUMNS. [#73686](https://github.com/ClickHouse/ClickHouse/pull/73686) ([Raúl Marín](https://github.com/Algunenano)). +* Fix the bug when the normal projection is forced to use, and query is exactly the same as the projection defined, but the projection is not selected and thus error is prompted. [#73700](https://github.com/ClickHouse/ClickHouse/pull/73700) ([Shichao Jin](https://github.com/jsc0218)). +* Fix deserialization of Dynamic/Object structure. It could lead to CANNOT_READ_ALL_DATA exceptions. [#73767](https://github.com/ClickHouse/ClickHouse/pull/73767) ([Pavel Kruglov](https://github.com/Avogar)). +* Skip `metadata_version.txt` in while restoring parts from a backup. [#73768](https://github.com/ClickHouse/ClickHouse/pull/73768) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix segmentation fault when Casting to Enum with LIKE. [#73775](https://github.com/ClickHouse/ClickHouse/pull/73775) ([zhanglistar](https://github.com/zhanglistar)). +* Fix for S3 Express bucket not working as disk. [#73777](https://github.com/ClickHouse/ClickHouse/pull/73777) ([Sameer Tamsekar](https://github.com/stamsekar)). +* Allow merging of rows with invalid sign column values in CollapsingMergeTree tables. [#73864](https://github.com/ClickHouse/ClickHouse/pull/73864) ([Christoph Wurm](https://github.com/cwurm)). +* Fix getting error when querying ddl with offline replica. [#73876](https://github.com/ClickHouse/ClickHouse/pull/73876) ([Tuan Pham Anh](https://github.com/tuanpach)). +* Fixes occasional failure to compare `map()` types due to possibility to create `Map` lacking explicit naming ('keys','values') of its nested tuple. [#73878](https://github.com/ClickHouse/ClickHouse/pull/73878) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Ignore window functions during GROUP BY ALL clause resolution. Fix [#73501](https://github.com/ClickHouse/ClickHouse/issues/73501). [#73916](https://github.com/ClickHouse/ClickHouse/pull/73916) ([Dmitry Novik](https://github.com/novikd)). +* Fix implicit privileges (worked as wildcard before). [#73932](https://github.com/ClickHouse/ClickHouse/pull/73932) ([Azat Khuzhin](https://github.com/azat)). +* Fix high memory usage during nested Maps creation. [#73982](https://github.com/ClickHouse/ClickHouse/pull/73982) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix parsing nested JSON with empty keys. [#73993](https://github.com/ClickHouse/ClickHouse/pull/73993) ([Pavel Kruglov](https://github.com/Avogar)). +* Fix: alias can be not added to the projection if it is referenced by another alias and selected in inverse order. [#74033](https://github.com/ClickHouse/ClickHouse/pull/74033) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Ignore object not found errors for Azure during plain_rewritable disk initialization. [#74059](https://github.com/ClickHouse/ClickHouse/pull/74059) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix behaviour of `any` and `anyLast` with enum types and empty table. [#74061](https://github.com/ClickHouse/ClickHouse/pull/74061) ([Joanna Hulboj](https://github.com/jh0x)). +* Fixes case when the user specifies keyword arguments in the kafka table engine. [#74064](https://github.com/ClickHouse/ClickHouse/pull/74064) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix altering Storage `S3Queue` settings with "s3queue_" prefix to without and vice versa. [#74075](https://github.com/ClickHouse/ClickHouse/pull/74075) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a setting `allow_push_predicate_ast_for_distributed_subqueries`. This adds AST-based predicate push-down for distributed queries with the analyzer. This is a temporary solution that we use until distributed queries with query plan serialization are supported. Closes [#66878](https://github.com/ClickHouse/ClickHouse/issues/66878) [#69472](https://github.com/ClickHouse/ClickHouse/issues/69472) [#65638](https://github.com/ClickHouse/ClickHouse/issues/65638) [#68030](https://github.com/ClickHouse/ClickHouse/issues/68030) [#73718](https://github.com/ClickHouse/ClickHouse/issues/73718). [#74085](https://github.com/ClickHouse/ClickHouse/pull/74085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixes issue when after [#73095](https://github.com/ClickHouse/ClickHouse/issues/73095) port can be present in the forwarded_for field, which leads to inability to resolve host name with port included. [#74116](https://github.com/ClickHouse/ClickHouse/pull/74116) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fixed incorrect formatting of `ALTER TABLE (DROP STATISTICS ...) (DROP STATISTICS ...)`. [#74126](https://github.com/ClickHouse/ClickHouse/pull/74126) ([Han Fei](https://github.com/hanfei1991)). +* Fix for issue [#66112](https://github.com/ClickHouse/ClickHouse/issues/66112). [#74128](https://github.com/ClickHouse/ClickHouse/pull/74128) ([Anton Ivashkin](https://github.com/ianton-ru)). +* It is no longer possible to use `Loop` as a table engine in `CREATE TABLE`. This combination was previously causing segfaults. [#74137](https://github.com/ClickHouse/ClickHouse/pull/74137) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix security issue to prevent SQL injection in postgresql and sqlite table functions. [#74144](https://github.com/ClickHouse/ClickHouse/pull/74144) ([Pablo Marcos](https://github.com/pamarcos)). +* Fix crash when reading a subcolumn from the compressed Memory engine table. Fixes [#74009](https://github.com/ClickHouse/ClickHouse/issues/74009). [#74161](https://github.com/ClickHouse/ClickHouse/pull/74161) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed an infinite loop occurring with queries to the system.detached_tables. [#74190](https://github.com/ClickHouse/ClickHouse/pull/74190) ([Konstantin Morozov](https://github.com/k-morozov)). +* Fix logical error in s3queue during setting file as failed. [#74216](https://github.com/ClickHouse/ClickHouse/pull/74216) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix native copy settings (`allow_s3_native_copy`/`allow_azure_native_copy`) for `RESTORE` from base backup. [#74286](https://github.com/ClickHouse/ClickHouse/pull/74286) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue when the number of detached tables in the database is a multiple of max_block_size. [#74289](https://github.com/ClickHouse/ClickHouse/pull/74289) ([Konstantin Morozov](https://github.com/k-morozov)). +* Fix copying via ObjectStorage (i.e. S3) when source and destination credentials differs. [#74331](https://github.com/ClickHouse/ClickHouse/pull/74331) ([Azat Khuzhin](https://github.com/azat)). +* Fix detection of "use the Rewrite method in the JSON API" for native copy on GCS. [#74338](https://github.com/ClickHouse/ClickHouse/pull/74338) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect calculation of `BackgroundMergesAndMutationsPoolSize` (it was x2 from real value). [#74509](https://github.com/ClickHouse/ClickHouse/pull/74509) ([alesapin](https://github.com/alesapin)). +* Fix the bug of leaking keeper watches when enable Cluster Discovery. [#74521](https://github.com/ClickHouse/ClickHouse/pull/74521) ([RinChanNOW](https://github.com/RinChanNOWWW)). +* Fix mem alignment issue reported by UBSan [#74512](https://github.com/ClickHouse/ClickHouse/issues/74512). [#74534](https://github.com/ClickHouse/ClickHouse/pull/74534) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix KeeperMap concurrent cleanup during table creation. [#74568](https://github.com/ClickHouse/ClickHouse/pull/74568) ([Antonio Andelic](https://github.com/antonio2368)). +* Do not remove unused projection columns in subqueries in the presence of `EXCEPT` or `INTERSECT` to preserve the correct query result. Fixes [#73930](https://github.com/ClickHouse/ClickHouse/issues/73930). Fixes [#66465](https://github.com/ClickHouse/ClickHouse/issues/66465). [#74577](https://github.com/ClickHouse/ClickHouse/pull/74577) ([Dmitry Novik](https://github.com/novikd)). +* Fixed `INSERT SELECT` queries between tables with `Tuple` columns and enabled sparse serialization. [#74698](https://github.com/ClickHouse/ClickHouse/pull/74698) ([Anton Popov](https://github.com/CurtizJ)). +* Function `right` works incorrectly for const negative offset. [#74701](https://github.com/ClickHouse/ClickHouse/pull/74701) ([Daniil Ivanik](https://github.com/divanik)). +* Fix insertion of gzip-ed data sometimes fails due to flawed decompression on client side. [#74707](https://github.com/ClickHouse/ClickHouse/pull/74707) ([siyuan](https://github.com/linkwk7)). +* Partial revokes with wildcard grants could remove more privileges than expected. Closes [#74263](https://github.com/ClickHouse/ClickHouse/issues/74263). [#74751](https://github.com/ClickHouse/ClickHouse/pull/74751) ([pufit](https://github.com/pufit)). +* Keeper fix: fix reading log entries from disk. [#74785](https://github.com/ClickHouse/ClickHouse/pull/74785) ([Antonio Andelic](https://github.com/antonio2368)). +* Fixed checking grants for SYSTEM REFRESH/START/STOP VIEW, now it's not required to have this grant on `*.*` to execute a query for a specific view, only grant for this view are required. [#74789](https://github.com/ClickHouse/ClickHouse/pull/74789) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The `hasColumnInTable` function doesn't account for alias columns. Fix it to also work for alias columns. [#74841](https://github.com/ClickHouse/ClickHouse/pull/74841) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix FILE_DOESNT_EXIST error occurring during data parts merge for a table with an empty column in Azure Blob Storage. [#74892](https://github.com/ClickHouse/ClickHouse/pull/74892) ([Julia Kartseva](https://github.com/jkartseva)). +* Fix projection column name when joining temporary tables, close [#68872](https://github.com/ClickHouse/ClickHouse/issues/68872). [#74897](https://github.com/ClickHouse/ClickHouse/pull/74897) ([Vladimir Cherkasov](https://github.com/vdimir)). + +#### Build/Testing/Packaging Improvement +* The universal installation script will propose installation even on macOS. [#74339](https://github.com/ClickHouse/ClickHouse/pull/74339) ([Alexey Milovidov](https://github.com/alexey-milovidov)). diff --git a/translation-architecture-diagram.md b/translation-architecture-diagram.md new file mode 100644 index 00000000000..835fd34f0d8 --- /dev/null +++ b/translation-architecture-diagram.md @@ -0,0 +1,135 @@ +# ClickHouse Documentation Translation System Architecture + +```mermaid +flowchart TD + %% Input Sources + A[📁 docs/] --> B[🔄 Translation Script] + A1[📄 Config Files
languages/jp.json] --> B + A2[🔑 OpenAI API] --> B + + %% Main Translation Process + B --> C{📋 File Processing} + + %% File Type Routing + C -->|.md/.mdx files| D[📝 Markdown Translation Pipeline] + C -->|.json files| E[🔧 Plugin Data Translation] + C -->|Other files| F[📋 Direct Copy] + + %% Markdown Translation Pipeline + D --> D1[🔍 Change Detection
xxhash comparison] + D1 -->|Changed| D2[📤 Pre-processing] + D1 -->|Unchanged| D9[⏭️ Skip Translation] + + D2 --> D3[🧩 Extract Components
Code blocks, JSX, Imports] + D3 --> D4[✂️ Text Chunking
30KB max chunks] + D4 --> D5[🤖 OpenAI Translation
gpt-4o-mini] + D5 --> D6[🔧 Post-processing
Restore components] + D6 --> D7[💾 Write Output] + D7 --> D8[#️⃣ Generate Hash] + + %% Plugin Data Translation + E --> E1[🔍 Check .done files] + E1 -->|Not done| E2[🤖 Translate JSON] + E1 -->|Done| E3[⏭️ Skip] + E2 --> E4[✅ Mark .done] + + %% Output Structure + D8 --> G[📁 i18n/{lang}/docusaurus-plugin-content-docs/current/] + E4 --> H[📁 i18n/{lang}/code.json] + F --> I[📁 i18n/{lang}/other files] + + %% Deployment Pipeline + G --> J[🏗️ Docusaurus Build] + H --> J + I --> J + J --> K[🚀 Vercel Deployment
Per-language projects] + K --> L[🌐 clickhouse-docs-proxy
Language routing] + + %% File State Management + subgraph "File States" + S1[📄 source.md] + S2[📄 source.md.hash] + S3[📄 source.translate] + S4[📄 source.translated] + S5[📄 source.md final] + S6[📄 config.json.done] + + S1 -->|hash created| S2 + S3 -->|translation done| S4 + S4 -->|renamed| S5 + end + + %% Content Protection System + subgraph "Content Protection" + P1[🔒 Code Block Protection
```code``` → <CODEBLOCK_N>] + P2[🔒 Component Protection
<VersionHistory/> → <COMPONENT_N>] + P3[🔒 Import Path Transform
@site/docs → @site/i18n/{lang}/...] + P4[🔒 ALL CAPS Preservation
SELECT, CREATE, etc.] + end + + %% Translation Rules + subgraph "Translation Intelligence" + T1[📚 Glossary Terms
Technical consistency] + T2[🎯 Context-aware Prompts
Database-specific] + T3[📝 Override Files
Manual corrections] + T4[🚫 Exclusion Lists
Skip certain files] + end + + %% Parallel Processing + subgraph "Processing" + PR1[⚡ ThreadPoolExecutor
5 workers max] + PR2[🔄 Concurrent translation] + PR3[⚠️ Error handling
Graceful failures] + end + + %% Configuration Files + subgraph "Config System" + CF1[📋 docusaurus.config.en.js
Main config] + CF2[📋 docusaurus.config.jp.js
Japanese config] + CF3[📋 docusaurus.config.ru.js
Russian config] + CF4[📋 docusaurus.config.zh.js
Chinese config] + end + + %% Styling + classDef inputNode fill:#e1f5fe + classDef processNode fill:#f3e5f5 + classDef outputNode fill:#e8f5e8 + classDef configNode fill:#fff3e0 + classDef protectionNode fill:#ffebee + + class A,A1,A2 inputNode + class B,D,E processNode + class G,H,I,J,K,L outputNode + class CF1,CF2,CF3,CF4 configNode + class P1,P2,P3,P4 protectionNode +``` + +## Key Architecture Components + +### 1. **Input Layer** +- **Source Documentation** (`docs/`) - English markdown/MDX files +- **Language Configurations** - JSON files with glossaries and prompts +- **OpenAI API** - GPT models for translation + +### 2. **Processing Engine** +- **Multi-threaded Translation** - 5 concurrent workers +- **Intelligent Change Detection** - xxhash-based incremental updates +- **Content-aware Processing** - Different pipelines for different file types + +### 3. **Content Protection System** +- **Code Block Preservation** - Prevents translation of code samples +- **Component Protection** - Preserves React/JSX components +- **Technical Term Protection** - Maintains ALL CAPS SQL keywords +- **Import Path Transformation** - Updates paths for i18n structure + +### 4. **Output & Deployment** +- **Structured Output** - Mirrors source structure in i18n folders +- **Per-language Builds** - Independent Docusaurus builds +- **Proxy Routing** - Central proxy routes to language-specific deployments + +### 5. **State Management** +- **File State Tracking** - `.hash`, `.done`, `.translate` files +- **Incremental Processing** - Only processes changed files +- **Error Recovery** - Handles interrupted translations gracefully + +This architecture enables **scalable, automated, and reliable** translation of complex technical documentation while maintaining quality and consistency across multiple languages. \ No newline at end of file From 2b46ee9362d04d6c5b13f846079ba6840fdc06e2 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:17:11 +0200 Subject: [PATCH 19/29] sed link from core repo --- scripts/sed_links.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/sed_links.sh b/scripts/sed_links.sh index 6a21ae6cc43..92af7b732a6 100755 --- a/scripts/sed_links.sh +++ b/scripts/sed_links.sh @@ -14,6 +14,7 @@ if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md + sed -i '' 's|(/whats-new/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md else # Linux sed -i 's|(../../quick-start\.mdx)|(/get-started/quick-start)|g' docs/operations/utilities/clickhouse-local.md @@ -21,4 +22,5 @@ else sed -i 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md + sed -i 's|(/whats-new/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md fi From cb437a113903eece6c11e5c4ab34f37655eb03c6 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:49:23 +0200 Subject: [PATCH 20/29] fix links with sed --- scripts/sed_links.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/sed_links.sh b/scripts/sed_links.sh index 92af7b732a6..d7f6e078551 100755 --- a/scripts/sed_links.sh +++ b/scripts/sed_links.sh @@ -14,7 +14,7 @@ if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md - sed -i '' 's|(/whats-new/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md + sed -i '' 's|(/cloud/reference/cloud-compatibility)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md else # Linux sed -i 's|(../../quick-start\.mdx)|(/get-started/quick-start)|g' docs/operations/utilities/clickhouse-local.md @@ -22,5 +22,5 @@ else sed -i 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md - sed -i 's|(/whats-new/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md + sed -i 's|(/cloud/reference/cloud-compatibility)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md fi From 5933e504053a2e53d5a1deac33ffcdd0825bcc92 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:46:14 +0200 Subject: [PATCH 21/29] sed --- scripts/sed_links.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/sed_links.sh b/scripts/sed_links.sh index d7f6e078551..707c36df5ed 100755 --- a/scripts/sed_links.sh +++ b/scripts/sed_links.sh @@ -14,7 +14,7 @@ if [[ "$OSTYPE" == "darwin"* ]]; then sed -i '' 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i '' 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md - sed -i '' 's|(/cloud/reference/cloud-compatibility)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md + sed -i '' 's|(/cloud/reference/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md else # Linux sed -i 's|(../../quick-start\.mdx)|(/get-started/quick-start)|g' docs/operations/utilities/clickhouse-local.md @@ -22,5 +22,5 @@ else sed -i 's|(https://clickhouse.com/docs/sql-reference/statements/select#apply)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#replace)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md sed -i 's|(/sql-reference/statements/select#except)|(/sql-reference/statements/select)|g' docs/guides/developer/dynamic-column-selection.md - sed -i 's|(/cloud/reference/cloud-compatibility)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md + sed -i 's|(/cloud/reference/cloud-compatibility.md)|(/whats-new/cloud-compatibility)|g' docs/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md fi From 20f171d8835859c46ec6083b254f8107faac0ffe Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Wed, 13 Aug 2025 20:31:37 +0200 Subject: [PATCH 22/29] Users -> you --- docs/cloud/onboard/01_discover/04_cloud-tiers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cloud/onboard/01_discover/04_cloud-tiers.md b/docs/cloud/onboard/01_discover/04_cloud-tiers.md index d41d4ee57c9..8df76ce14f1 100644 --- a/docs/cloud/onboard/01_discover/04_cloud-tiers.md +++ b/docs/cloud/onboard/01_discover/04_cloud-tiers.md @@ -164,7 +164,7 @@ This page discusses which tiers are right for your specific use case. :::note Services in the basic tier are meant to be fixed in size and do not allow scaling, both automatic and manual. -Users can upgrade to the Scale or Enterprise tier to scale their services. +You can upgrade to the Scale or Enterprise tier to scale their services. ::: ## Scale {#scale} @@ -186,7 +186,7 @@ Caters to large-scale, mission critical deployments that have stringent security - Supports enterprise-grade security: - Single Sign On (SSO) - Enhanced Encryption: For AWS and GCP services. Services are encrypted by our key by default and can be rotated to their key to enable Customer Managed Encryption Keys (CMEK). -- Allows Scheduled upgrades: Users can select the day of the week/time window for upgrades, both database and cloud releases. +- Allows Scheduled upgrades: you can select the day of the week/time window for upgrades, both database and cloud releases. - Offers [HIPAA](/cloud/security/compliance-overview#hipaa-since-2024) Compliance. - Exports Backups to the user's account. From 5159790f6f6d3f7a10f71d333452d0204e727d07 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Wed, 13 Aug 2025 20:39:49 +0200 Subject: [PATCH 23/29] incorporate review feedback --- sidebars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sidebars.js b/sidebars.js index ff0cbf444fb..9f8b0aeeb4b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -208,7 +208,7 @@ const sidebars = { label: "Get started", collapsed: false, collapsible: true, - link: { type: "doc", id: "cloud/onboard/index" }, + link: { type: "doc", id: "/cloud/get-started" }, items: [ { type: "category", From f543b322e9933e482595485fce4c1cfcc3e5ab1f Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:29:02 +0200 Subject: [PATCH 24/29] update page with private preview badge --- docs/cloud/features/replica-aware-routing.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/cloud/features/replica-aware-routing.md b/docs/cloud/features/replica-aware-routing.md index 8b8376b8667..370e46737cd 100644 --- a/docs/cloud/features/replica-aware-routing.md +++ b/docs/cloud/features/replica-aware-routing.md @@ -5,7 +5,11 @@ description: 'How to use Replica-aware routing to increase cache re-use' keywords: ['cloud', 'sticky endpoints', 'sticky', 'endpoints', 'sticky routing', 'routing', 'replica aware routing'] --- -# Replica-aware routing (private preview) +import PrivatePreviewBadge from '@theme/badges/PrivatePreviewBadge'; + +# Replica-aware routing + + Replica-aware routing (also known as sticky sessions, sticky routing, or session affinity) utilizes [Envoy proxy's ring hash load balancing](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/load_balancing/load_balancers#ring-hash). The main purpose of replica-aware routing is to increase the chance of cache reuse. It does not guarantee isolation. From d76986c22024f31b96f1921156db2616d561ae51 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:24:21 +0200 Subject: [PATCH 25/29] sunset PPV2 docs --- docs/cloud/_snippets/_clickpipes_faq.md | 0 .../01_cloud_tiers.md} | 0 ...tic_scaling.md => 02_automatic_scaling.md} | 0 .../01_sql-console.md | 0 .../02_query-insights.md | 0 .../03_query-endpoints.md | 0 .../04_dashboards.md | 0 .../_category_.json | 0 .../_category_.json | 0 .../byoc.md | 0 .../shared-catalog.md | 0 .../shared-merge-tree.md | 0 .../warehouses.md | 0 .../_category_.json | 0 .../advanced_dashboard.md | 0 .../prometheus.md | 0 .../01_shared-responsibility-model.md | 4 +- .../_category_.json | 5 + .../cloud-access-management.md | 0 .../cloud-authentication.md | 0 .../02_cloud-access-management}/index.md | 0 .../inviting-new-users.md | 0 .../03_connectivity/_category_.json | 5 + .../03_connectivity}/cloud-endpoints-api.md | 0 .../03_connectivity}/connectivity-overview.md | 0 .../private_networking/aws-privatelink.md | 0 .../private_networking/azure-privatelink.md | 0 .../gcp-private-service-connect.md | 0 .../private-link-overview.md | 0 .../03_connectivity}/setting-ip-filters.md | 0 .../_category_.json | 0 .../{04_security => 05_security}/cmek.md | 0 ...5_notifications.md => 07_notifications.md} | 0 docs/cloud/features/index.md | 7 - .../01_discover/02_use_cases/00_overview.md | 2 +- .../01_discover/02_use_cases/_category_.json | 1 - .../05_elastic/01_overview.md | 2 +- .../01_clickhouse-to-cloud.md | 0 .../07_OSS_to_Cloud/_category_.json | 5 + .../01_clickhouse-local-etl.md} | 0 .../02_etl-tool-to-clickhouse.md} | 0 .../03_object-storage-to-clickhouse.md} | 0 .../_category_.json | 0 docs/cloud/onboard/index.md | 14 +- .../03_billing/01_billing_overview.md | 2 +- .../_snippets/_clickpipes_faq.md | 145 ------------------ docs/cloud/reference/09_jan2025_faq/backup.md | 18 --- .../cloud/reference/09_jan2025_faq/billing.md | 47 ------ .../reference/09_jan2025_faq/dimensions.md | 38 ----- docs/cloud/reference/09_jan2025_faq/index.md | 25 --- .../reference/09_jan2025_faq/new_tiers.md | 64 -------- .../09_jan2025_faq/plan_migrations.md | 108 ------------- .../cloud/reference/09_jan2025_faq/scaling.md | 36 ----- .../cloud/reference/09_jan2025_faq/summary.md | 93 ----------- sidebars.js | 2 +- vercel.json | 40 +++++ 56 files changed, 67 insertions(+), 596 deletions(-) create mode 100644 docs/cloud/_snippets/_clickpipes_faq.md rename docs/cloud/{onboard/01_discover/04_cloud-tiers.md => features/01_cloud_tiers.md} (100%) rename docs/cloud/features/{01_automatic_scaling.md => 02_automatic_scaling.md} (100%) rename docs/cloud/features/{01_cloud_console_features => 02_cloud_console_features}/01_sql-console.md (100%) rename docs/cloud/features/{01_cloud_console_features => 02_cloud_console_features}/02_query-insights.md (100%) rename docs/cloud/features/{01_cloud_console_features => 02_cloud_console_features}/03_query-endpoints.md (100%) rename docs/cloud/features/{01_cloud_console_features => 02_cloud_console_features}/04_dashboards.md (100%) rename docs/cloud/features/{01_cloud_console_features => 02_cloud_console_features}/_category_.json (100%) rename docs/cloud/features/{02_infrastructure_and_deploy => 03_infrastructure_and_deploy}/_category_.json (100%) rename docs/cloud/features/{02_infrastructure_and_deploy => 03_infrastructure_and_deploy}/byoc.md (100%) rename docs/cloud/features/{02_infrastructure_and_deploy => 03_infrastructure_and_deploy}/shared-catalog.md (100%) rename docs/cloud/features/{02_infrastructure_and_deploy => 03_infrastructure_and_deploy}/shared-merge-tree.md (100%) rename docs/cloud/features/{02_infrastructure_and_deploy => 03_infrastructure_and_deploy}/warehouses.md (100%) rename docs/cloud/features/{03_monitoring => 04_monitoring}/_category_.json (100%) rename docs/cloud/features/{03_monitoring => 04_monitoring}/advanced_dashboard.md (100%) rename docs/cloud/features/{03_monitoring => 04_monitoring}/prometheus.md (100%) rename docs/cloud/features/{04_security => 05_security}/01_shared-responsibility-model.md (99%) create mode 100644 docs/cloud/features/05_security/02_cloud-access-management/_category_.json rename docs/cloud/features/{04_security/cloud-access-management => 05_security/02_cloud-access-management}/cloud-access-management.md (100%) rename docs/cloud/features/{04_security/cloud-access-management => 05_security/02_cloud-access-management}/cloud-authentication.md (100%) rename docs/cloud/features/{04_security/cloud-access-management => 05_security/02_cloud-access-management}/index.md (100%) rename docs/cloud/features/{04_security/cloud-access-management => 05_security/02_cloud-access-management}/inviting-new-users.md (100%) create mode 100644 docs/cloud/features/05_security/03_connectivity/_category_.json rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/cloud-endpoints-api.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/connectivity-overview.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/private_networking/aws-privatelink.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/private_networking/azure-privatelink.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/private_networking/gcp-private-service-connect.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/private_networking/private-link-overview.md (100%) rename docs/cloud/features/{04_security/connectivity => 05_security/03_connectivity}/setting-ip-filters.md (100%) rename docs/cloud/features/{04_security => 05_security}/_category_.json (100%) rename docs/cloud/features/{04_security => 05_security}/cmek.md (100%) rename docs/cloud/features/{05_notifications.md => 07_notifications.md} (100%) delete mode 100644 docs/cloud/features/index.md rename docs/cloud/onboard/02_migrate/01_migration_guides/{07_other_methods => 07_OSS_to_Cloud}/01_clickhouse-to-cloud.md (100%) create mode 100644 docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/_category_.json rename docs/cloud/onboard/02_migrate/01_migration_guides/{07_other_methods/02_clickhouse-local-etl.md => 08_other_methods/01_clickhouse-local-etl.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/{07_other_methods/03_etl-tool-to-clickhouse.md => 08_other_methods/02_etl-tool-to-clickhouse.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/{07_other_methods/04_object-storage-to-clickhouse.md => 08_other_methods/03_object-storage-to-clickhouse.md} (100%) rename docs/cloud/onboard/02_migrate/01_migration_guides/{07_other_methods => 08_other_methods}/_category_.json (100%) delete mode 100644 docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/backup.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/billing.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/dimensions.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/index.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/new_tiers.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/plan_migrations.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/scaling.md delete mode 100644 docs/cloud/reference/09_jan2025_faq/summary.md diff --git a/docs/cloud/_snippets/_clickpipes_faq.md b/docs/cloud/_snippets/_clickpipes_faq.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/cloud/onboard/01_discover/04_cloud-tiers.md b/docs/cloud/features/01_cloud_tiers.md similarity index 100% rename from docs/cloud/onboard/01_discover/04_cloud-tiers.md rename to docs/cloud/features/01_cloud_tiers.md diff --git a/docs/cloud/features/01_automatic_scaling.md b/docs/cloud/features/02_automatic_scaling.md similarity index 100% rename from docs/cloud/features/01_automatic_scaling.md rename to docs/cloud/features/02_automatic_scaling.md diff --git a/docs/cloud/features/01_cloud_console_features/01_sql-console.md b/docs/cloud/features/02_cloud_console_features/01_sql-console.md similarity index 100% rename from docs/cloud/features/01_cloud_console_features/01_sql-console.md rename to docs/cloud/features/02_cloud_console_features/01_sql-console.md diff --git a/docs/cloud/features/01_cloud_console_features/02_query-insights.md b/docs/cloud/features/02_cloud_console_features/02_query-insights.md similarity index 100% rename from docs/cloud/features/01_cloud_console_features/02_query-insights.md rename to docs/cloud/features/02_cloud_console_features/02_query-insights.md diff --git a/docs/cloud/features/01_cloud_console_features/03_query-endpoints.md b/docs/cloud/features/02_cloud_console_features/03_query-endpoints.md similarity index 100% rename from docs/cloud/features/01_cloud_console_features/03_query-endpoints.md rename to docs/cloud/features/02_cloud_console_features/03_query-endpoints.md diff --git a/docs/cloud/features/01_cloud_console_features/04_dashboards.md b/docs/cloud/features/02_cloud_console_features/04_dashboards.md similarity index 100% rename from docs/cloud/features/01_cloud_console_features/04_dashboards.md rename to docs/cloud/features/02_cloud_console_features/04_dashboards.md diff --git a/docs/cloud/features/01_cloud_console_features/_category_.json b/docs/cloud/features/02_cloud_console_features/_category_.json similarity index 100% rename from docs/cloud/features/01_cloud_console_features/_category_.json rename to docs/cloud/features/02_cloud_console_features/_category_.json diff --git a/docs/cloud/features/02_infrastructure_and_deploy/_category_.json b/docs/cloud/features/03_infrastructure_and_deploy/_category_.json similarity index 100% rename from docs/cloud/features/02_infrastructure_and_deploy/_category_.json rename to docs/cloud/features/03_infrastructure_and_deploy/_category_.json diff --git a/docs/cloud/features/02_infrastructure_and_deploy/byoc.md b/docs/cloud/features/03_infrastructure_and_deploy/byoc.md similarity index 100% rename from docs/cloud/features/02_infrastructure_and_deploy/byoc.md rename to docs/cloud/features/03_infrastructure_and_deploy/byoc.md diff --git a/docs/cloud/features/02_infrastructure_and_deploy/shared-catalog.md b/docs/cloud/features/03_infrastructure_and_deploy/shared-catalog.md similarity index 100% rename from docs/cloud/features/02_infrastructure_and_deploy/shared-catalog.md rename to docs/cloud/features/03_infrastructure_and_deploy/shared-catalog.md diff --git a/docs/cloud/features/02_infrastructure_and_deploy/shared-merge-tree.md b/docs/cloud/features/03_infrastructure_and_deploy/shared-merge-tree.md similarity index 100% rename from docs/cloud/features/02_infrastructure_and_deploy/shared-merge-tree.md rename to docs/cloud/features/03_infrastructure_and_deploy/shared-merge-tree.md diff --git a/docs/cloud/features/02_infrastructure_and_deploy/warehouses.md b/docs/cloud/features/03_infrastructure_and_deploy/warehouses.md similarity index 100% rename from docs/cloud/features/02_infrastructure_and_deploy/warehouses.md rename to docs/cloud/features/03_infrastructure_and_deploy/warehouses.md diff --git a/docs/cloud/features/03_monitoring/_category_.json b/docs/cloud/features/04_monitoring/_category_.json similarity index 100% rename from docs/cloud/features/03_monitoring/_category_.json rename to docs/cloud/features/04_monitoring/_category_.json diff --git a/docs/cloud/features/03_monitoring/advanced_dashboard.md b/docs/cloud/features/04_monitoring/advanced_dashboard.md similarity index 100% rename from docs/cloud/features/03_monitoring/advanced_dashboard.md rename to docs/cloud/features/04_monitoring/advanced_dashboard.md diff --git a/docs/cloud/features/03_monitoring/prometheus.md b/docs/cloud/features/04_monitoring/prometheus.md similarity index 100% rename from docs/cloud/features/03_monitoring/prometheus.md rename to docs/cloud/features/04_monitoring/prometheus.md diff --git a/docs/cloud/features/04_security/01_shared-responsibility-model.md b/docs/cloud/features/05_security/01_shared-responsibility-model.md similarity index 99% rename from docs/cloud/features/04_security/01_shared-responsibility-model.md rename to docs/cloud/features/05_security/01_shared-responsibility-model.md index 9ada3976aa9..08c6a3e073c 100644 --- a/docs/cloud/features/04_security/01_shared-responsibility-model.md +++ b/docs/cloud/features/05_security/01_shared-responsibility-model.md @@ -1,7 +1,7 @@ --- -sidebar_label: 'Shared Responsibility Model' +sidebar_label: 'Shared responsibility model' slug: /cloud/security/shared-responsibility-model -title: 'Security Shared Responsibility Model' +title: 'Shared responsibility model' description: 'Learn more about the security model of ClickHouse Cloud' --- diff --git a/docs/cloud/features/05_security/02_cloud-access-management/_category_.json b/docs/cloud/features/05_security/02_cloud-access-management/_category_.json new file mode 100644 index 00000000000..784ea5ce006 --- /dev/null +++ b/docs/cloud/features/05_security/02_cloud-access-management/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Cloud access management", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/features/04_security/cloud-access-management/cloud-access-management.md b/docs/cloud/features/05_security/02_cloud-access-management/cloud-access-management.md similarity index 100% rename from docs/cloud/features/04_security/cloud-access-management/cloud-access-management.md rename to docs/cloud/features/05_security/02_cloud-access-management/cloud-access-management.md diff --git a/docs/cloud/features/04_security/cloud-access-management/cloud-authentication.md b/docs/cloud/features/05_security/02_cloud-access-management/cloud-authentication.md similarity index 100% rename from docs/cloud/features/04_security/cloud-access-management/cloud-authentication.md rename to docs/cloud/features/05_security/02_cloud-access-management/cloud-authentication.md diff --git a/docs/cloud/features/04_security/cloud-access-management/index.md b/docs/cloud/features/05_security/02_cloud-access-management/index.md similarity index 100% rename from docs/cloud/features/04_security/cloud-access-management/index.md rename to docs/cloud/features/05_security/02_cloud-access-management/index.md diff --git a/docs/cloud/features/04_security/cloud-access-management/inviting-new-users.md b/docs/cloud/features/05_security/02_cloud-access-management/inviting-new-users.md similarity index 100% rename from docs/cloud/features/04_security/cloud-access-management/inviting-new-users.md rename to docs/cloud/features/05_security/02_cloud-access-management/inviting-new-users.md diff --git a/docs/cloud/features/05_security/03_connectivity/_category_.json b/docs/cloud/features/05_security/03_connectivity/_category_.json new file mode 100644 index 00000000000..6e137e0592d --- /dev/null +++ b/docs/cloud/features/05_security/03_connectivity/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Connectivity", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md b/docs/cloud/features/05_security/03_connectivity/cloud-endpoints-api.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/cloud-endpoints-api.md rename to docs/cloud/features/05_security/03_connectivity/cloud-endpoints-api.md diff --git a/docs/cloud/features/04_security/connectivity/connectivity-overview.md b/docs/cloud/features/05_security/03_connectivity/connectivity-overview.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/connectivity-overview.md rename to docs/cloud/features/05_security/03_connectivity/connectivity-overview.md diff --git a/docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md b/docs/cloud/features/05_security/03_connectivity/private_networking/aws-privatelink.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/private_networking/aws-privatelink.md rename to docs/cloud/features/05_security/03_connectivity/private_networking/aws-privatelink.md diff --git a/docs/cloud/features/04_security/connectivity/private_networking/azure-privatelink.md b/docs/cloud/features/05_security/03_connectivity/private_networking/azure-privatelink.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/private_networking/azure-privatelink.md rename to docs/cloud/features/05_security/03_connectivity/private_networking/azure-privatelink.md diff --git a/docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md b/docs/cloud/features/05_security/03_connectivity/private_networking/gcp-private-service-connect.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/private_networking/gcp-private-service-connect.md rename to docs/cloud/features/05_security/03_connectivity/private_networking/gcp-private-service-connect.md diff --git a/docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md b/docs/cloud/features/05_security/03_connectivity/private_networking/private-link-overview.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/private_networking/private-link-overview.md rename to docs/cloud/features/05_security/03_connectivity/private_networking/private-link-overview.md diff --git a/docs/cloud/features/04_security/connectivity/setting-ip-filters.md b/docs/cloud/features/05_security/03_connectivity/setting-ip-filters.md similarity index 100% rename from docs/cloud/features/04_security/connectivity/setting-ip-filters.md rename to docs/cloud/features/05_security/03_connectivity/setting-ip-filters.md diff --git a/docs/cloud/features/04_security/_category_.json b/docs/cloud/features/05_security/_category_.json similarity index 100% rename from docs/cloud/features/04_security/_category_.json rename to docs/cloud/features/05_security/_category_.json diff --git a/docs/cloud/features/04_security/cmek.md b/docs/cloud/features/05_security/cmek.md similarity index 100% rename from docs/cloud/features/04_security/cmek.md rename to docs/cloud/features/05_security/cmek.md diff --git a/docs/cloud/features/05_notifications.md b/docs/cloud/features/07_notifications.md similarity index 100% rename from docs/cloud/features/05_notifications.md rename to docs/cloud/features/07_notifications.md diff --git a/docs/cloud/features/index.md b/docs/cloud/features/index.md deleted file mode 100644 index ce8d1500485..00000000000 --- a/docs/cloud/features/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -sidebar_label: 'Features' -slug: /cloud/features -title: 'Features' -description: 'Table of contents page linking to Cloud features' ---- - diff --git a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md index 53eeaeb7e99..7ff402f77ea 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md +++ b/docs/cloud/onboard/01_discover/02_use_cases/00_overview.md @@ -16,6 +16,6 @@ Broadly, the most common use cases for ClickHouse Cloud are: | Use case | Description | |----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [Real-Time analytics](/cloud/get-started/cloud/use-cases/real-time-analytics) | ClickHouse Cloud excels at real-time analytics by delivering sub-second query responses on billions of rows through its columnar storage architecture and vectorized execution engine. The platform handles high-throughput data ingestion of millions of events per second while enabling direct queries on raw data without requiring pre-aggregation. Materialized Views provide real-time aggregations and pre-computed results, while approximate functions for quantiles and counts deliver instant insights perfect for interactive dashboards and real-time decision making.| -| [Data Lake and Warehouse](/cloud/get-started/cloud/use-cases/data_lake_and_warehouse) | As a modern data warehouse solution, ClickHouse Cloud combines native cloud storage integration with S3, GCS, and Azure Blob for cost-effective storage with schema-on-read flexibility that supports semi-structured data like JSON and nested types. The platform achieves massive compression ratios of 10:1 or better, significantly reducing storage costs, while its compute-storage separation architecture allows independent scaling and cost optimization. Users benefit from a standard SQL interface enhanced with advanced analytics functions, making it easy to query and analyze data at any scale.| | [Observability](/cloud/get-started/cloud/use-cases/observability) | ClickHouse Cloud is purpose-built for observability workloads, featuring specialized engines and functions optimized for time-series data that can ingest and query terabytes of logs, metrics, and traces with ease. Through ClickStack, ClickHouse's comprehensive observability solution, organizations can break down the traditional three silos of logs, metrics, and traces by unifying all observability data in a single platform, enabling correlated analysis and eliminating the complexity of managing separate systems. This unified approach makes it ideal for application performance monitoring, infrastructure monitoring, and security event analysis at enterprise scale, with ClickStack providing the tools and integrations needed for complete observability workflows without data silos.| | [Machine Learning and GenAI](/cloud/get-started/cloud/use-cases/AI_ML) | ClickHouse Cloud powers modern AI applications through four key capabilities: native vector similarity search for RAG applications and embedding storage, comprehensive feature store functionality for real-time ML feature engineering and serving, specialized LLM observability for tracking model performance and usage patterns, and integrated MCP (Model Context Protocol) server support that enables AI agents and LLMs to directly query and analyze data. This unified platform eliminates the complexity of managing separate systems for vector databases, feature stores, and observability tools, providing a single solution for the entire AI/ML data pipeline with ClickHouse's signature performance and scalability.| +| [Data Lake and Warehouse](/cloud/get-started/cloud/use-cases/data_lake_and_warehouse) | As a modern data warehouse solution, ClickHouse Cloud combines native cloud storage integration with S3, GCS, and Azure Blob for cost-effective storage with schema-on-read flexibility that supports semi-structured data like JSON and nested types. The platform achieves massive compression ratios of 10:1 or better, significantly reducing storage costs, while its compute-storage separation architecture allows independent scaling and cost optimization. Users benefit from a standard SQL interface enhanced with advanced analytics functions, making it easy to query and analyze data at any scale.| diff --git a/docs/cloud/onboard/01_discover/02_use_cases/_category_.json b/docs/cloud/onboard/01_discover/02_use_cases/_category_.json index c066b9c4fdc..70c6591bd01 100644 --- a/docs/cloud/onboard/01_discover/02_use_cases/_category_.json +++ b/docs/cloud/onboard/01_discover/02_use_cases/_category_.json @@ -1,5 +1,4 @@ { - "position": 2.5, "label": "Use cases", "collapsible": true, "collapsed": true, diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index 5b6a7476b7c..2104a173b02 100644 --- a/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -9,4 +9,4 @@ show_related_blogs: true # Elasticsearch to ClickHouse migration -This document provides an introduction to migrating data from Elasticsearch to ClickHouse. +For observability use cases, see the [Elasticsearch to ClickStack](/use-cases/observability/clickstack/migration/elastic) migration docs. diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md b/docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/01_clickhouse-to-cloud.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/_category_.json new file mode 100644 index 00000000000..9720f826193 --- /dev/null +++ b/docs/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "OSS to Cloud", + "collapsible": true, + "collapsed": true, +} \ No newline at end of file diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/02_clickhouse-local-etl.md b/docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/02_clickhouse-local-etl.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/03_etl-tool-to-clickhouse.md b/docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/03_etl-tool-to-clickhouse.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md b/docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/04_object-storage-to-clickhouse.md rename to docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md diff --git a/docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/_category_.json b/docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/_category_.json similarity index 100% rename from docs/cloud/onboard/02_migrate/01_migration_guides/07_other_methods/_category_.json rename to docs/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/_category_.json diff --git a/docs/cloud/onboard/index.md b/docs/cloud/onboard/index.md index f5edd4cc175..742a9c87254 100644 --- a/docs/cloud/onboard/index.md +++ b/docs/cloud/onboard/index.md @@ -16,9 +16,8 @@ you through each step of the process as you explore ClickHouse Cloud. ## Discover ClickHouse Cloud {#discover-clickhouse-cloud} -- Learn about what ClickHouse Cloud is, and how it differs from the open-source version -- Discover the main use-cases of ClickHouse Cloud -- Learn about ClickHouse Cloud pricing +- [Learn](/cloud/overview) about what ClickHouse Cloud is, and how it differs from the open-source version +- [Discover](/cloud/get-started/cloud/use-cases/overview) the main use-cases of ClickHouse Cloud ## Get set up with ClickHouse Cloud {#get-set-up-with-clickhouse-cloud} @@ -28,8 +27,7 @@ and point you towards some general best practices you should know. Topics include: -- Migration guides from various platforms -- Cloud architecture +- [Migration guides](/integrations/migration/overview) from various platforms ## Tune your ClickHouse Cloud deployment {#evaluate-clickhouse-cloud} @@ -39,9 +37,9 @@ what the platform has to offer. Topics include: -- Query performance -- Monitoring -- Security considerations +- [Query performance and optimization](/cloud/get-started/cloud/resource-tour#query-optimization) +- [Monitoring](/cloud/get-started/cloud/resource-tour#monitoring) +- [Security considerations](/cloud/get-started/cloud/resource-tour#security) - Troubleshooting tips \ No newline at end of file diff --git a/docs/cloud/reference/03_billing/01_billing_overview.md b/docs/cloud/reference/03_billing/01_billing_overview.md index 81e237cb4a4..c14bef64805 100644 --- a/docs/cloud/reference/03_billing/01_billing_overview.md +++ b/docs/cloud/reference/03_billing/01_billing_overview.md @@ -5,7 +5,7 @@ title: 'Pricing' description: 'Overview page for ClickHouse Cloud pricing' --- -import ClickPipesFAQ from '../09_jan2025_faq/_snippets/_clickpipes_faq.md' +import ClickPipesFAQ from '../../_snippets/_clickpipes_faq.md' For pricing information, see the [ClickHouse Cloud Pricing](https://clickhouse.com/pricing#pricing-calculator) page. ClickHouse Cloud bills based on the usage of compute, storage, [data transfer](/cloud/manage/network-data-transfer) (egress over the internet and cross-region), and [ClickPipes](/integrations/clickpipes). diff --git a/docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md b/docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md deleted file mode 100644 index 436a1cb705b..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/_snippets/_clickpipes_faq.md +++ /dev/null @@ -1,145 +0,0 @@ -import Image from '@theme/IdealImage'; -import clickpipesPricingFaq1 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_1.png'; -import clickpipesPricingFaq2 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_2.png'; -import clickpipesPricingFaq3 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_3.png'; - -
- -Why are we introducing a pricing model for ClickPipes now? - -We decided to initially launch ClickPipes for free with the idea to gather -feedback, refine features, and ensure it meets user needs. -As the GA platform has grown, it has effectively stood the test of time by -moving trillions of rows. Introducing a pricing model allows us to continue -improving the service, maintaining the infrastructure, and providing dedicated -support and new connectors. - -
- -
- -What are ClickPipes replicas? - -ClickPipes ingests data from remote data sources via a dedicated infrastructure -that runs and scales independently of the ClickHouse Cloud service. -For this reason, it uses dedicated compute replicas. -The diagrams below show a simplified architecture. - -For streaming ClickPipes, ClickPipes replicas access the remote data sources (e.g., a Kafka broker), -pull the data, process and ingest it into the destination ClickHouse service. - - - -In the case of object storage ClickPipes, -the ClickPipes replica orchestrates the data loading task -(identifying files to copy, maintaining the state, and moving partitions), -while the data is pulled directly from the ClickHouse service. - - - -
- -
- -What's the default number of replicas and their size? - -Each ClickPipe defaults to 1 replica that's provided with 2 GiB of RAM and 0.5 vCPU. -This corresponds to **0.25** ClickHouse compute units (1 unit = 8 GiB RAM, 2 vCPUs). - -
- -
- -Can ClickPipes replicas be scaled? - -Yes, ClickPipes for streaming can be scaled both horizontally and vertically. -Horizontal scaling adds more replicas to increase throughput, while vertical scaling increases the resources (CPU and RAM) allocated to each replica to handle more intensive workloads. -This can be configured during ClickPipe creation, or at any other point under **Settings** -> **Advanced Settings** -> **Scaling**. - -
- -
- -How many ClickPipes replicas do I need? - -It depends on the workload throughput and latency requirements. -We recommend starting with the default value of 1 replica, measuring your latency, and adding replicas if needed. -Keep in mind that for Kafka ClickPipes, you also have to scale the Kafka broker partitions accordingly. -The scaling controls are available under "settings" for each streaming ClickPipe. - - - -
- -
- -What does the ClickPipes pricing structure look like? - -It consists of two dimensions: -- **Compute**: Price per unit per hour - Compute represents the cost of running the ClickPipes replica pods whether they actively ingest data or not. - It applies to all ClickPipes types. -- **Ingested data**: per GB pricing - The ingested data rate applies to all streaming ClickPipes - (Kafka, Confluent, Amazon MSK, Amazon Kinesis, Redpanda, WarpStream, - Azure Event Hubs) for the data transferred via the replica pods. - The ingested data size (GB) is charged based on bytes received from the source (uncompressed or compressed). - -
- -
- -What are the ClickPipes public prices? - -- Compute: \$0.20 per unit per hour ($0.05 per replica per hour) -- Ingested data: $0.04 per GB - -
- -
- -How does it look in an illustrative example? - -For example, ingesting 1 TB of data over 24 hours using the Kafka connector using a single replica (0.25 compute unit) costs: - -$$ -(0.25 \times 0.20 \times 24) + (0.04 \times 1000) = \$41.2 -$$ -
- -For object storage connectors (S3 and GCS), -only the ClickPipes compute cost is incurred since the ClickPipes pod is not processing data -but only orchestrating the transfer which is operated by the underlying ClickHouse service: - -$$ -0.25 \times 0,20 \times 24 = \$1.2 -$$ - -
- -
- -When does the new pricing model take effect? - -The new pricing model takes effect for all organizations created after January 27th, 2025. - -
- -
- -What happens to current users? - -Existing users will have a **60-day grace period** where the ClickPipes service continues to be offered for free. -Billing will automatically start for ClickPipes for existing users on **March 24th, 2025.** - -
- -
- -How does ClickPipes pricing compare to the market? - -The philosophy behind ClickPipes pricing is -to cover the operating costs of the platform while offering an easy and reliable way to move data to ClickHouse Cloud. -From that angle, our market analysis revealed that we are positioned competitively. - -
diff --git a/docs/cloud/reference/09_jan2025_faq/backup.md b/docs/cloud/reference/09_jan2025_faq/backup.md deleted file mode 100644 index 579788f8dec..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/backup.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 'Backup Policy' -slug: /cloud/manage/jan-2025-faq/backup -keywords: ['new tiers', 'plans', 'pricing', 'backups'] -description: 'Backup policy in new tiers' ---- - -## What is the backup policy? {#what-is-the-backup-policy} -In Basic, Scale, and Enterprise tiers backups are metered and billed separately from storage. -All services will default to one daily backup with the ability to configure more, starting with the Scale tier, via the Settings tab of the Cloud console. Each backup will be retained for at least 24 hours. - -## What happens to current configurations that users have set up separate from default backups? {#what-happens-to-current-configurations-that-users-have-set-up-separate-from-default-backups} - -Customer specific backup configurations will carry over. Users can change these as they see fit in the new tiers. - -## Are backups charged differently across tiers? {#are-backups-charged-differently-across-tiers} - -The cost of backups is the same across all tiers. diff --git a/docs/cloud/reference/09_jan2025_faq/billing.md b/docs/cloud/reference/09_jan2025_faq/billing.md deleted file mode 100644 index 4147cc9976d..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/billing.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: 'Billing' -slug: /cloud/manage/jan-2025-faq/billing -keywords: ['new pricing', 'billing'] -description: 'Billing details for new pricing tiers' ---- - -## Billing {#billing} - -### Are there any changes to how usage is metered and charged? {#are-there-any-changes-to-how-usage-is-metered-and-charged} - -The per-dimension unit cost for compute and storage has changed, and there are two additional dimensions to account for data transfer and ClickPipes usage. - -Some notable changes: - -- Storage price per TB will be reduced, and storage cost will no longer include backups (we will charge for them separately and will make only one backup required). Storage costs are the same across tiers and vary by region and cloud service provider. -- Compute costs will vary by tier, region, and cloud service provider. -- The new pricing dimension for data transfer is applicable for data egress across regions and on the public internet only. -- New pricing dimension for ClickPipes usage. - -### What happens to users with existing committed spend contracts? {#what-happens-to-users-with-existing-committed-spend-contracts} - -Users with active committed spend contracts will not be affected by the new per-dimension unit cost prices for compute and storage until their contract expires. However, the new pricing dimensions for data transfer and ClickPipes will be applicable starting March 24, 2025. Most customers will not see a significant increase in their monthly bill from these new dimensions. - -### Can users on a committed spend agreement with ClickHouse continue to launch services on the old plan? {#can-users-on-a-committed-spend-agreement-with-clickhouse-continue-to-launch-services-on-the-old-plan} - -Yes, users will be able to launch Development and Production services until the end date of their contract, and renewals will reflect the new pricing plan. - -If you need to modify your contract or have questions about how these changes might affect you in the future, please contact our support team or your sales representative. - -### What happens if users exhaust their credits before the end of the contract and go to PAYG? {#what-happens-if-users-exhaust-their-credits-before-the-end-of-the-contract-and-go-to-payg} - -If committed spend contracts exhaust credits before their renewal date, we bill them at the current rates until renewal (as per current policy). - -### What happens to users on the monthly PAYG? {#what-happens-to-users-on-the-monthly-payg} - -Users on a monthly PAYG plan will continue to be billed using the old pricing plan for the Development and Production services. They have until July 23, 2025, to migrate to the new plan self-serve, or they will all be migrated to the Scale configuration on this day and billed based on the new plan. - -### Where can I reference legacy plans? {#where-can-i-reference-legacy-plans} - -Legacy plans are available for reference [here](https://clickhouse.com/pricing?legacy=true). - -## Marketplaces {#marketplaces} - -### Are there changes to how users are charged via the CSP marketplaces? {#are-there-changes-to-how-users-are-charged-via-the-csp-marketplaces} - -Users who sign up to ClickHouse Cloud via a CSP Marketplace incur usage in terms of CHCs (ClickHouse Cloud Credits). This behavior has not changed. However, the underlying composition of the credit usage will align with the pricing and packaging changes outlined here and include charges for any data transfer usage and ClickPipes once those are live. diff --git a/docs/cloud/reference/09_jan2025_faq/dimensions.md b/docs/cloud/reference/09_jan2025_faq/dimensions.md deleted file mode 100644 index 01e4937000f..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/dimensions.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: 'New pricing dimensions' -slug: /cloud/manage/jan-2025-faq/pricing-dimensions -keywords: ['new pricing', 'dimensions'] -description: 'Pricing dimensions for data transfer and ClickPipes' ---- - -import Image from '@theme/IdealImage'; -import clickpipesPricingFaq1 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_1.png'; -import clickpipesPricingFaq2 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_2.png'; -import clickpipesPricingFaq3 from '@site/static/images/cloud/manage/jan2025_faq/external_clickpipes_pricing_faq_3.png'; -import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; -import ClickPipesFAQ from './_snippets/_clickpipes_faq.md' - -The following dimensions have been added to the new ClickHouse Cloud pricing. - -:::note -Data transfer and ClickPipes pricing doesn't apply to legacy plans, i.e. Development, Production, and Dedicated, until 24 March 2025. -::: - -## Data transfer pricing {#data-transfer-pricing} - -### How are users charged for data transfer, and will this vary across organization tiers and regions? {#how-are-users-charged-for-data-transfer-and-will-this-vary-across-organization-tiers-and-regions} - -- Users pay for data transfer along two dimensions — public internet egress and inter-region egress. There are no charges for intra-region data transfer or Private Link/Private Service Connect use and data transfer. However, we reserve the right to implement additional data transfer pricing dimensions if we see usage patterns that impact our ability to charge users appropriately. -- Data transfer pricing varies by Cloud Service Provider (CSP) and region. -- Data transfer pricing does **not** vary between organizational tiers. -- Public egress pricing is based only on the origin region. Inter-region (or cross-region) pricing depends on both the origin and destination regions. - - - -### Will data transfer pricing be tiered as usage increases? {#will-data-transfer-pricing-be-tiered-as-usage-increases} - -Data transfer prices will **not** be tiered as usage increases. Pricing varies by region and cloud service provider. - -## ClickPipes pricing FAQ {#clickpipes-pricing-faq} - - diff --git a/docs/cloud/reference/09_jan2025_faq/index.md b/docs/cloud/reference/09_jan2025_faq/index.md deleted file mode 100644 index e7ada80e8ed..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/index.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: 'Jan 2025 Changes FAQ' -slug: /cloud/manage/jan-2025-faq -description: 'Index page for new pricing FAQ' -keywords: ['new pricing', 'faq'] ---- - - - - -| Page | Description | -|-----|-----| -| | | -| [Backup Policy](/cloud/manage/jan-2025-faq/backup) | Backup policy in new tiers | -| [Billing](/cloud/manage/jan-2025-faq/billing) | Billing details for new pricing tiers | -| [Description of new tiers](/cloud/manage/jan-2025-faq/new-tiers) | Description of new tiers and features | -| [Migrating to new plans](/cloud/manage/jan-2025-faq/plan-migrations) | Migrating to new plans, tiers, pricing, how to decide and estimate costs | -| [New pricing dimensions](/cloud/manage/jan-2025-faq/pricing-dimensions) | Pricing dimensions for data transfer and ClickPipes | -| [Scaling](/cloud/manage/jan-2025-faq/scaling) | Scaling behavior in new pricing tiers | -| [Summary](/cloud/manage/jan-2025-faq/summary) | Summary of New ClickHouse Cloud Tiers | - diff --git a/docs/cloud/reference/09_jan2025_faq/new_tiers.md b/docs/cloud/reference/09_jan2025_faq/new_tiers.md deleted file mode 100644 index 6aa943808d2..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/new_tiers.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: 'Description of new tiers' -slug: /cloud/manage/jan-2025-faq/new-tiers -keywords: ['new tiers', 'features', 'pricing', 'description'] -description: 'Description of new tiers and features' ---- - -## Summary of key changes {#summary-of-key-changes} - -### What key changes to expect with regard to features to tier mapping? {#what-key-changes-to-expect-with-regard-to-features-to-tier-mapping} - -- **Private Link/Private Service Connect:** Private connections are now supported across all service types on Scale and Enterprise tiers (including single-replica services). This means you can now have Private Link for both your production (large scale) and development (small scale) environments. -- **Backups:** All services now come with one backup by default and additional backups are charged separately. Users can leverage the configurable backup controls to manage additional backups. This means that services with lesser backup requirements do not need to pay a higher bundled price. Please see more details in the Backup FAQ. -- **Enhanced Encryption:** This feature is available in Enterprise tier services, including for single replica services, in AWS and GCP. Services are encrypted by our key by default and can be rotated to their key to enable Customer Managed Encryption Keys (CMEK). -- **Single Sign On (SSO):** This feature is offered in Enterprise tier and requires a support ticket to be enabled for an Organization. Users who have multiple Organizations should ensure all of their organizations are on the Enterprise tier to use SSO for each organization. - -## Basic tier {#basic-tier} - -### What are the considerations for the Basic tier? {#what-are-the-considerations-for-the-basic-tier} - -The basic tier is meant for small workloads - users want to deploy a small analytics application that does not require high availability or work on a prototype. This tier is not suitable for workloads that need scale, reliability (DR/HA), and data durability. The tier supports single replica services of fixed size 1x8GiB or 1x12GiB. Please refer to the docs and [support policy](https://clickhouse.com/support/program) for more information. - -### Can users on the Basic tier access Private Link and Private Service Connect? {#can-users-on-the-basic-tier-access-private-link-and-private-service-connect} - -No, Users will need to upgrade to Scale or Enterprise to access this feature. - -### Can users on the Basic and Scale tiers set up SSO for the organization? {#can-users-on-the-basic-and-scale-tiers-set-up-sso-for-the-organization} - -No, users will need to upgrade to the Enterprise tier to access this feature. - -### Can users launch single replica services in all tiers? {#can-users-launch-single-replica-services-in-all-tiers} - -Yes, single replica services are supported on all three tiers. Users can scale out, but are not permitted to scale into a single replica. - -### Can users scale up/down and add more replicas on the Basic tier? {#can-users-scale-updown-and-add-more-replicas-on-the-basic-tier} - -No, services on this tier are meant to support workloads that are small and fixed size (single replica `1x8GiB` or `1x12GiB`). The size of the single replica is fixed upon service creation and cannot be adjusted or scaled after service creation. If users need to scale up/down or add replicas, they will be prompted to upgrade to Scale or Enterprise tiers. - -## Scale tier {#scale-tier} - -### Which tiers on the new plans (Basic/Scale/Enterprise) support compute-compute separation? {#which-tiers-on-the-new-plans-basicscaleenterprise-support-compute-compute-separation} - -Only Scale and Enterprise tiers support compute-compute separation. Please also note that this capability requires running at least a 2+ replica parent service. - -### Can users on the legacy plans (Production/Development) access compute-compute separation? {#can-users-on-the-legacy-plans-productiondevelopment-access-compute-compute-separation} - -Compute-compute separation is not supported on existing Development and Production services, except for users who already participated in the Private Preview and Beta. If you have additional questions, please contact [support](https://clickhouse.com/support/program). - -## Enterprise tier {#enterprise-tier} - -### What different hardware profiles are supported for the Enterprise tier? {#what-different-hardware-profiles-are-supported-for-the-enterprise-tier} - -The enterprise tier will support standard profiles (1:4 vCPU:memory ratio), as well as `highMem (1:8 ratio)` and `highCPU (1:2 ratio)` **custom profiles,** offering users more flexibility to select the configuration that best suits their needs. The Enterprise Tier will use shared compute resources deployed alongside the Basic and Scale tiers. - -### What are the features exclusively offered on the Enterprise tier? {#what-are-the-features-exclusively-offered-on-the-enterprise-tier} - -- **Custom profiles:** Options for instance type selection standard profiles (1:4 vCPU: memory ratio) and `highMem (1:8 ratio)` and `highCPU (1:2 ratio)` custom profiles. -- **Enterprise-grade security:** - - **Single Sign On (SSO**) - - **Enhanced Encryption:** For AWS and GCP services. Services are encrypted by our key by default and can be rotated to their key to enable Customer Managed Encryption Keys (CMEK). -- **Scheduled upgrades:** Users can select the day of the week/time window for upgrades, both database and cloud releases. -- **HIPAA Compliance:** The customer must sign a Business Associate Agreement (BAA) through Legal before we enable HIPAA-compliant regions for them. -- **Private Regions:** It is not self-serve enabled and will need users to route requests through Sales sales@clickhouse.com. -- **Export Backups** to the customer's cloud account. diff --git a/docs/cloud/reference/09_jan2025_faq/plan_migrations.md b/docs/cloud/reference/09_jan2025_faq/plan_migrations.md deleted file mode 100644 index fc5cfc56233..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/plan_migrations.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: 'Migrating to new plans' -slug: /cloud/manage/jan-2025-faq/plan-migrations -keywords: ['migration', 'new tiers', 'pricing', 'cost', 'estimation'] -description: 'Migrating to new plans, tiers, pricing, how to decide and estimate costs' ---- - -## Choosing new plans {#choosing-new-plans} - -### Can new organizations launch services on the old (legacy) plan? {#can-new-organizations-launch-services-on-the-old-legacy-plan} - -No, newly created organizations will not have access to the old plan after the announcement. - -### Can users migrate to the new pricing plan self-serve? {#can-users-migrate-to-the-new-pricing-plan-self-serve} - -Yes, see below for guidance on self-serve migrations: - -| Current Plan | New Plan | Self-Serve Migration | -|--------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------| -| Development | Basic | Supported if all services in the organization support are Development | -| Development | Scale (2 replicas+) | :white_check_mark: | -| Development | Enterprise (2 replicas+) | :white_check_mark: | -| Production | Scale (3 replicas+) | :white_check_mark: | -| Production | Enterprise (3 replicas+) | :white_check_mark: | -| Dedicated | Contact [support](https://clickhouse.com/support/program) | - -### What will the experience be for users in trial running Development and Production services? {#what-will-the-experience-be-for-users-in-trial-running-development-and-production-services} - -Users can upgrade during the trial and continue to use the trial credits to evaluate the new service tiers and the features it supports. However, if they choose to continue using the same Development and Production services, they can do so and upgrade to PAYG. They will still have to migrate before July 23, 2025. - -### Can users upgrade their tiers {#can-users-upgrade-their-tiers-ie-basic--scale-scale--enterprise-etc} - -Can users upgrade their tiers, for example, Basic → Scale, Scale → Enterprise, etc. -Yes, users can upgrade self-serve, and the pricing will reflect the tier selection after upgrade. - -### Can users move from a higher to a lower-cost tier {#can-users-move-from-a-higher-to-a-lower-cost-tier-eg-enterprise--scale-scale--basic-enterprise--basic-self-serve} - -For example, Enterprise → Scale, Scale → Basic, Enterprise → Basic self-serve? -Yes, but users will need to remove all premium features and may be guided to scale their multi-replica services into a single replica. - -### Can users with only development services in the organization migrate to the Basic tier? {#can-users-with-only-development-services-in-the-organization-migrate-to-the-basic-tier} - -Yes, this would be permitted. Users will be given a recommendation based on their past use and can select Basic `1x8GiB` or `1x12GiB`. - -### Can users with a development and production service in the same organization move to the basic tier? {#can-users-with-a-development-and-production-service-in-the-same-organization-move-to-the-basic-tier} - -No, if a user has both Development and Production services in the same organization, they can self-serve and migrate only to the Scale or Enterprise tier. If they want to migrate to Basic, they should delete all existing Production services. - -### Are there any changes related to the Scaling behavior with the new tiers? {#are-there-any-changes-related-to-the-scaling-behavior-with-the-new-tiers} - -We are introducing a new vertical scaling mechanism for compute replicas, which we call "Make Before Break" (MBB). This approach adds one or more replicas of the new size before removing the old replicas, preventing any loss of capacity during scaling operations. By eliminating the gap between removing existing replicas and adding new ones, MBB creates a more seamless and less disruptive scaling process. It is especially beneficial in scale-up scenarios, where high resource utilization triggers the need for additional capacity, since removing replicas prematurely would only exacerbate the resource constraints. - -Please note that as part of this change, historical system table data will be retained for up to a maximum of 30 days as part of scaling events. In addition, any system table data older than December 19, 2024, for services on AWS or GCP and older than January 14, 2025, for services on Azure will not be retained as part of the migration to the new organization tiers. - -## Estimating costs {#estimating-costs} - -### How will users be guided during migration, understanding what tier best fits their needs? {#how-will-users-be-guided-during-migration-understanding-what-tier-best-fits-their-needs} - -The console will prompt you with recommended options for each service based on historical use if you have a service. New users can review the capabilities and features listed in detail and decide on the tier that best suits their needs. - -### How do users size and estimate the cost of "warehouses" in the new pricing? {#how-do-users-size-and-estimate-the-cost-of-warehouses-in-the-new-pricing} - -Please refer to the pricing calculator on the [Pricing](https://clickhouse.com/pricing) page, which will help estimate the cost based on your workload size and tier selection. - -## Undertaking the migration {#undertaking-the-migration} - -### What are service version pre-requisites to undertaking the migration? {#what-are-service-version-pre-requisites-to-undertaking-the-migration} - -Your service has to be on version 24.8 or later and already migrated to SharedMergeTree. - -### What is the migration experience for users of the current Development and Production services? Do users need to plan for a maintenance window where the service is unavailable? {#what-is-the-migration-experience-for-users-of-the-current-development-and-production-services-do-users-need-to-plan-for-a-maintenance-window-where-the-service-is-unavailable} - -Migrations of Development and Production services to the new pricing tiers may trigger a rolling restart. To migrate a Dedicated service, please contact [support](https://clickhouse.com/support/program). - -### What other actions should a user take after the migration? {#what-other-actions-should-a-user-take-after-the-migration} - -API access patterns will be different. - -Users that use our OpenAPI to create new services will be required to remove the `tier` field in the service creation `POST` request. - -The `tier` field has been removed from the service object as we no longer have service tiers. -This will affect the objects returned by the `POST`, `GET`, and `PATCH` service requests. Therefore, any code that consumes these APIs may need to be adjusted to handle these changes. - -The number of replicas each service will be created with defaults to 3 for the Scale and Enterprise tiers, while it defaults to 1 for the Basic tier. -For the Scale and the Enterprise tiers it is possible to adjust it by passing a `numReplicas` field in the service creation request. -The value of the `numReplicas` field must be between 2 and 20 for the first service in a warehouse. Services that are created in an existing warehouse can have a number of replicas as low as 1. - -### What changes should the users make if using the existing Terraform provider for automation? {#what-changes-should-the-users-make-if-using-the-existing-terraform-provider-for-automation} - -Once an organization has been migrated to one of the new plans, users will be required to use our Terraform provider version 2.0.0 or above. - -The new Terraform provider is required to handle changes in the `tier` attribute of the service. - -After the migration, the `tier` field is no longer accepted, and references to it should be removed. - -Users will also be able to specify the `num_replicas` field as a property of the service resource. - -The number of replicas each service will be created with defaults to 3 for the Scale and Enterprise tiers, while it defaults to 1 for the Basic tier. -For the Scale and the Enterprise tiers, it is possible to adjust it by passing a `numReplicas` field in the service creation request. -The value of the `num_replicas` filed must be between 2 and 20 for the first service in a warehouse. Services that are created in an existing warehouse can have a number of replicas as low as 1. - -### Will users have to make any changes to the database access? {#will-users-have-to-make-any-changes-to-the-database-access} - -No, the database username/password will work the same as before. - -### Will users have to reconfigure private networking features? {#will-users-have-to-reconfigure-private-networking-features} - -No, users can use their existing private networking (Private Link, PSC, etc..) configuration after moving their Production service to Scale or Enterprise. diff --git a/docs/cloud/reference/09_jan2025_faq/scaling.md b/docs/cloud/reference/09_jan2025_faq/scaling.md deleted file mode 100644 index e65aff7345e..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/scaling.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: 'Scaling' -slug: /cloud/manage/jan-2025-faq/scaling -keywords: ['new pricing', 'faq', 'scaling'] -description: 'Scaling behavior in new pricing tiers' ---- - -ClickHouse Cloud allows scaling in both directions - vertical (increasing replica size) and horizontal (adding more replicas). - -## What scaling options will be available for each tier? {#what-scaling-options-will-be-available-for-each-tier} - -The scaling behavior per tier is as follows: - -* **Basic**: Basic tier supports only single replica services. These services are meant to be fixed in size and do not allow vertical or horizontal scaling. Users can upgrade to the Scale or Enterprise tier to scale their services. -* **Scale**: Scale tier supports single and multi-replica services. Scaling will be permitted for Multi-replica services. - * Services can vertically scale to the maximum replica size supported for a CSP/region AFTER they have scaled to a multi-replica setup; only 2+ replicas can be vertically scaled. - * Manual horizontal scaling will be available. -* **Enterprise**: Enterprise tier supports single and multi-replica services, and scaling will be permitted for Multi-replica services - * Services can vertically scale to maximum replica sizes supported for a CSP/region. - * Standard profiles (1:4 CPU to memory ratio) will support vertical auto-scaling - * Custom profiles (`highMemory` and `highCPU`) can be scaled vertically through a support ticket. - * Manual horizontal scaling will be available. - -:::note -Services can scale horizontally to a maximum of 20 replicas. If you need additional replicas, please contact our support team. -::: - -## Can users scale in their service? {#can-users-scale-in-their-service} - -Scaling in will be restricted to 2+ replicas. Once scaled out, users will not be permitted to scale down to a single replica, as this may result in instability and potential data loss. - -## Are there any changes related to the Scaling behavior with the new tiers? {#are-there-any-changes-related-to-the-scaling-behavior-with-the-new-tiers} - -We are introducing a new vertical scaling mechanism for compute replicas, which we call "Make Before Break" (MBB). This approach adds one or more replicas of the new size before removing the old replicas, preventing any loss of capacity during scaling operations. By eliminating the gap between removing existing replicas and adding new ones, MBB creates a more seamless and less disruptive scaling process. It is especially beneficial in scale-up scenarios, where high resource utilization triggers the need for additional capacity, since removing replicas prematurely would only exacerbate the resource constraints. - -Please note that as part of this change, historical system table data will be retained for up to a maximum of 30 days as part of scaling events. In addition, any system table data older than December 19, 2024, for services on AWS or GCP and older than January 14, 2025, for services on Azure will not be retained as part of the migration to the new organization tiers. diff --git a/docs/cloud/reference/09_jan2025_faq/summary.md b/docs/cloud/reference/09_jan2025_faq/summary.md deleted file mode 100644 index dfeafe642d3..00000000000 --- a/docs/cloud/reference/09_jan2025_faq/summary.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: 'Summary' -slug: /cloud/manage/jan-2025-faq/summary -keywords: ['new tiers', 'packaging', 'pricing faq', 'summary'] -description: 'Summary of New ClickHouse Cloud Tiers' ---- - -The following FAQ summarizes common questions with respect to new tiers introduced in ClickHouse Cloud starting in January 2025. - -## What has changed with ClickHouse Cloud tiers? {#what-has-changed-with-clickhouse-cloud-tiers} - -At ClickHouse, we are dedicated to adapting our products to meet the ever-changing requirements of our customers. Since its introduction in GA over the past two years, ClickHouse Cloud has evolved substantially, and we've gained invaluable insights into how our customers leverage our cloud offerings. - -We are introducing new features to optimize the sizing and cost-efficiency of ClickHouse Cloud services for your workloads. These include compute-compute separation, high-performance machine types, and single-replica services. We are also evolving automatic scaling and managed upgrades to execute in a more seamless and reactive fashion. - -We are adding a new Enterprise tier to serve the needs of the most demanding customers and workloads, with focus on industry-specific security and compliance features, even more controls over underlying hardware and upgrades, and advanced disaster recovery features. - -You can read about these and other functional changes in this [blog](https://clickhouse.com/blog/evolution-of-clickhouse-cloud-new-features-superior-performance-tailored-offerings). - -## What action is required? {#what-action-is-required} - -To support these changes, we are restructuring our current tiers to more closely match how our evolving customer base is using our offerings, and you need to take action to select a new plan. - -Details and timelines for making these selections are described below. - -## How are tiers changing? {#how-are-tiers-changing} - -We are transitioning from a model that organizes paid tiers purely by "service types" which are delineated by both capacity and features (namely, these are Development, Production, and Dedicated tiers) to one that organizes paid tiers by feature availability. These new tiers are called Basic, Scale, and Enterprise and are described in more detail below. - -This change brings several key benefits: - -* **Consistent Feature Access**: Features present in a tier will be available in that tier for all sizes of services, as well as in all tiers above it. For example, private networking, previously available only for Production service types, will now be accessible for all services starting with the Scale tier, so you can deploy it for services sized both for development and production workloads as you see fit. - -* **Organizational-Level Features**: We can now provide features built at an organizational level with the appropriate plan, ensuring that customers receive the tools they need at the right level of service. For example, access to SSO (single-sign-on) and CMEK (customer-managed encryption keys) will be available at the Enterprise tier. - -* **Optimized Support Plans**: The new packaging structure also allows us to align support response times with paid tiers, which more effectively meet the needs of our diverse customer base. For example, we are now making named support engineers available to our Enterprise tier customers. - -Below we provide an overview of the new tiers, describe how they relate to use cases, and outline key features. - -**Basic: A taste of ClickHouse** - -* Basic tier is designed to offer a budget-friendly option for organizations with smaller data volumes and less demanding workloads. It allows you to run single-replica deployments with up to 12GB of memory and less than 1TB of storage and is ideal for small-scale use cases that do not require reliability guarantees. - -**Scale: Enhanced SLAs and scalability** - -* Scale tier is suitable for workloads that require enhanced SLAs, greater scalability, and advanced security measures. -* It offers unlimited compute and storage with any replication factor, access to compute-compute separation, and automatic vertical and horizontal scaling. -* Key features include: - * Support for private networking, customized backup controls, multi-factor auth, and more - * Compute-compute separation for optimized resource usage - * Flexible scaling options (both vertical and horizontal) to meet changing demands - -**Enterprise: Mission-critical deployments** - -* Enterprise tier is the best place to run large-scale, mission-critical ClickHouse deployments. -* It is best suited for organizations with stringent security and compliance needs, requiring the highest levels of performance and reliability. -* Key features include: - * Industry-specific compliance certifications, such as HIPAA - * Self-service access to SSO (Single Sign-On) and CMEK (Customer Managed Encryption Keys) - * Scheduled upgrades to ensure minimal disruption - * Support for custom configurations, including high-memory, high-CPU options, and private regions - -New tiers are described in more detail on our [website](https://clickhouse.com/pricing). - -## How is pricing changing? {#how-is-pricing-changing} - -In addition to evolving our paid tiers, we are making the following adjustments to our overall pricing structure and price points: - -* **Storage**: Storage price per TB will be reduced and will no longer bundle backups in the storage cost. -* **Backups**: Backups will be charged separately, with only one backup being mandatory. -* **Compute**: Compute costs will increase, varying by tier and region. This increase may be balanced by the introduction of compute-compute separation and single-replica services, which allow you to optimize compute usage by deploying and right-sizing services tailored to different workload types. -* **Data Transfer**: We are introducing charges for data egress, specifically for data transfer over the internet and cross region. Based on our analysis, most customers will not see a substantial increase in their monthly bill based on this new dimension. -* **ClickPipes**: Our managed ingest service, which was offered for free during the introductory period, will now incur charges based on compute and ingested data. Based on our analysis, most customers will not see a substantial increase in their monthly bill based on this new dimension. - -## When will these changes take effect? {#when-will-these-changes-take-effect} - -While changes are effective immediately for new customers, existing customers will have from 6 months to a year to transition to new plans. - -Detailed breakdown of effective dates is below: - -* **New Customers**: The new plans will take effect on **January 27, 2025** for new customers of ClickHouse Cloud. -* **Existing PAYG Customers**: Pay-as-you-go (PAYG) customers will have 6 months until **July 23, 2025** to migrate to new plans. -* **Existing Committed Spend Customers**: Customers with committed spend agreements can renegotiate their terms at the end of their current contract. -* **New usage dimensions** for Data Transfer and ClickPipes are effective for both PAYG and Committed Spend customers 8 weeks following this announcement on **March 24, 2025**. - -## What actions should you take? {#what-actions-should-you-take} - -If you are a **pay-as-you-go (PAYG) customer**, you can migrate to a new plan through the self-service options available in your ClickHouse Cloud console. - -If you are a **committed spend customer**, please reach out to your account representative to discuss your custom migration plan and timeline. - -**Need assistance?** -We're here to support you through this transition. If you have any questions or need personalized help, please reach out to your account representative or contact our support team. diff --git a/sidebars.js b/sidebars.js index 9f8b0aeeb4b..ff0cbf444fb 100644 --- a/sidebars.js +++ b/sidebars.js @@ -208,7 +208,7 @@ const sidebars = { label: "Get started", collapsed: false, collapsible: true, - link: { type: "doc", id: "/cloud/get-started" }, + link: { type: "doc", id: "cloud/onboard/index" }, items: [ { type: "category", diff --git a/vercel.json b/vercel.json index 71916810c3c..75c38c0ccb8 100644 --- a/vercel.json +++ b/vercel.json @@ -3390,6 +3390,46 @@ "source": "/docs/faq/troubleshooting", "destination": "/docs/knowledge-base/unable-to-access-cloud-service", "permanent": true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq/summary", + "destination": "/cloud/manage/cloud-tiers", + "permanent": true + }, + { + "source" : "/docs/cloud/manage/jan-2025-faq/new-tiers", + "destination" : "/cloud/manage/cloud-tiers", + "permanent" : true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq/scaling", + "destination": "/manage/scaling", + "permanent": true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq/backup", + "destination": "/docs/cloud/manage/backups/overview", + "permanent": true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq/pricing-dimensions", + "destination": "/docs/cloud/manage/cloud-tiers", + "permanent": true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq/billing", + "destination": "/docs/cloud/manage/billing", + "permanent": true + }, + { + "source": "/docs/cloud/manage/jan-2025-faq", + "destination": "/cloud/manage/cloud-tiers", + "permanent": true + }, + { + "source": "/cloud/manage/jan-2025-faq/plan-migrations", + "destination": "/cloud/manage/cloud-tiers", + "permanent": true } ] } From ca6cf31ed342c0d251a7767b63dbbc4c063aeb18 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Fri, 15 Aug 2025 17:30:32 +0200 Subject: [PATCH 26/29] remove FAQ section --- scripts/autogenerate-table-of-contents.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/autogenerate-table-of-contents.sh b/scripts/autogenerate-table-of-contents.sh index f57755a96d7..09c96c3dfdd 100644 --- a/scripts/autogenerate-table-of-contents.sh +++ b/scripts/autogenerate-table-of-contents.sh @@ -40,7 +40,6 @@ COMMANDS=( '--single-toc --dir="docs/sql-reference/aggregate-functions/reference" --md="docs/sql-reference/aggregate-functions/reference/index.md"' '--single-toc --dir="docs/sql-reference/table-functions" --md="docs/sql-reference/table-functions/index.md"' '--single-toc --dir="docs/chdb/guides" --md="docs/chdb/guides/index.md" --ignore images' - '--single-toc --dir="docs/cloud/reference/09_jan2025_faq" --md="docs/cloud/reference/09_jan2025_faq/index.md" --ignore images' '--single-toc --dir="docs/cloud/reference/01_changelog" --md="docs/cloud/reference/01_changelog/02_release_notes/index.md"' '--single-toc --dir="docs/development" --md="docs/development/index.md" --ignore images' '--single-toc --dir="docs/getting-started/example-datasets" --md="docs/getting-started/index.md" --ignore images' From 1a81baa49263b3ad351106163b1d818b94713831 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Fri, 15 Aug 2025 17:40:19 +0200 Subject: [PATCH 27/29] fix spelling --- docs/cloud/features/03_infrastructure_and_deploy/byoc.md | 2 +- scripts/aspell-ignore/en/aspell-dict.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/cloud/features/03_infrastructure_and_deploy/byoc.md b/docs/cloud/features/03_infrastructure_and_deploy/byoc.md index 1b07d16e82e..d3a64f34b03 100644 --- a/docs/cloud/features/03_infrastructure_and_deploy/byoc.md +++ b/docs/cloud/features/03_infrastructure_and_deploy/byoc.md @@ -128,7 +128,7 @@ Contact ClickHouse Support to enable Private Load Balancer. 2. Select Peering Connections. 3. Click Create Peering Connection 4. Set the VPC Requester to the ClickHouse VPC ID. -5. Set the VPC Acceptor to the target VPC ID. (Select another account if applicable) +5. Set the VPC Accepter to the target VPC ID. (Select another account if applicable) 6. Click Create Peering Connection.
diff --git a/scripts/aspell-ignore/en/aspell-dict.txt b/scripts/aspell-ignore/en/aspell-dict.txt index 4195360fd28..577878e87a4 100644 --- a/scripts/aspell-ignore/en/aspell-dict.txt +++ b/scripts/aspell-ignore/en/aspell-dict.txt @@ -57,6 +57,7 @@ Authenticators Authy AutoFDO AutoML +Autoscaler Autocompletion AvroConfluent AzureQueue @@ -1344,6 +1345,7 @@ VARCHAR VIEWs VLDB VNet +VNets VPCs VPNs Vadim From 26291e2f979f34fdb4f4201a502ef36307d145ce Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Fri, 15 Aug 2025 17:52:53 +0200 Subject: [PATCH 28/29] fix spelling --- scripts/aspell-ignore/en/aspell-dict.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/aspell-ignore/en/aspell-dict.txt b/scripts/aspell-ignore/en/aspell-dict.txt index 577878e87a4..e147feca71b 100644 --- a/scripts/aspell-ignore/en/aspell-dict.txt +++ b/scripts/aspell-ignore/en/aspell-dict.txt @@ -1,6 +1,7 @@ personal_ws-1.1 en 3611 AArch ACLs +Accepter AICPA ALTERs AMPLab From 109499698a812b3df2539cfcd9b14ffeaf708264 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Fri, 15 Aug 2025 18:26:03 +0200 Subject: [PATCH 29/29] fix broken links after removing PPV2 docs --- docs/cloud/features/01_cloud_tiers.md | 2 +- docs/cloud/reference/01_changelog/01_changelog.md | 4 ++-- docs/cloud/reference/03_billing/01_billing_overview.md | 2 +- docs/integrations/data-ingestion/clickpipes/index.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/cloud/features/01_cloud_tiers.md b/docs/cloud/features/01_cloud_tiers.md index 8df76ce14f1..c8ab9279619 100644 --- a/docs/cloud/features/01_cloud_tiers.md +++ b/docs/cloud/features/01_cloud_tiers.md @@ -174,7 +174,7 @@ Designed for workloads requiring enhanced SLAs (2+ replica deployments), scalabi - Offers support for features such as: - [Private networking support](/cloud/security/private-link-overview). - [Compute-compute separation](../reference/warehouses#what-is-compute-compute-separation). - - [Flexible scaling](/cloud/manage/jan-2025-faq/scaling) options (scale up/down, in/out). + - [Flexible scaling](/manage/scaling) options (scale up/down, in/out). ## Enterprise {#enterprise} diff --git a/docs/cloud/reference/01_changelog/01_changelog.md b/docs/cloud/reference/01_changelog/01_changelog.md index 59e93b13b98..9298f5d6bca 100644 --- a/docs/cloud/reference/01_changelog/01_changelog.md +++ b/docs/cloud/reference/01_changelog/01_changelog.md @@ -169,7 +169,7 @@ to get up and running. ## April 4, 2025 {#april-4-2025} - Slack notifications for ClickHouse Cloud: ClickHouse Cloud now supports Slack notifications for billing, scaling, and ClickPipes events, in addition to in-console and email notifications. These notifications are sent via the ClickHouse Cloud Slack application. Organization admins can configure these notifications via the notification center by specifying slack channels to which notifications should be sent. -- Users running Production and Development services will now see ClickPipes and data transfer usage price on their bills. Please refer to the [announcement](/cloud/manage/jan-2025-faq/pricing-dimensions) from January 2025 for more details. +- Users running Production and Development services will now see ClickPipes and data transfer usage price on their bills. ## March 21, 2025 {#march-21-2025} @@ -252,7 +252,7 @@ We are adding a **new Enterprise tier** to serve the needs of the most demanding To support these changes, we are restructuring our current **Development** and **Production** tiers to more closely match how our evolving customer base is using our offerings. We are introducing the **Basic** tier, oriented toward users that are testing out new ideas and projects, and the **Scale** tier, matching users working with production workloads and data at scale. -You can read about these and other functional changes in this [blog](https://clickhouse.com/blog/evolution-of-clickhouse-cloud-new-features-superior-performance-tailored-offerings). Existing customers will need to take action to select a [new plan](https://clickhouse.com/pricing). Customer-facing communication was sent via email to organization administrators, and the following [FAQ](/cloud/manage/jan-2025-faq/summary) covers the key changes and timelines. +You can read about these and other functional changes in this [blog](https://clickhouse.com/blog/evolution-of-clickhouse-cloud-new-features-superior-performance-tailored-offerings). Existing customers will need to take action to select a [new plan](https://clickhouse.com/pricing). Customer-facing communication was sent via email to organization administrators. ### Warehouses: Compute-compute separation (GA) {#warehouses-compute-compute-separation-ga} diff --git a/docs/cloud/reference/03_billing/01_billing_overview.md b/docs/cloud/reference/03_billing/01_billing_overview.md index c14bef64805..cdbe6c40355 100644 --- a/docs/cloud/reference/03_billing/01_billing_overview.md +++ b/docs/cloud/reference/03_billing/01_billing_overview.md @@ -15,7 +15,7 @@ To understand what can affect your bill, and ways that you can manage your spend :::note - Prices reflect AWS us-east-1 pricing. -- Explore applicable data transfer and ClickPipes charges [here](/cloud/manage/jan-2025-faq/pricing-dimensions). +- Explore applicable data transfer and ClickPipes charges [here](/cloud/manage/network-data-transfer). ::: ### Basic: from $66.52 per month {#basic-from-6652-per-month} diff --git a/docs/integrations/data-ingestion/clickpipes/index.md b/docs/integrations/data-ingestion/clickpipes/index.md index 45526f155cb..852d0363e5f 100644 --- a/docs/integrations/data-ingestion/clickpipes/index.md +++ b/docs/integrations/data-ingestion/clickpipes/index.md @@ -101,7 +101,7 @@ If ClickPipes cannot connect to a data source after 15 min or to a destination a - **Does using ClickPipes incur an additional cost?** - ClickPipes is billed on two dimensions: Ingested Data and Compute. The full details of the pricing are available on [this page](/cloud/manage/jan-2025-faq/pricing-dimensions#clickpipes-pricing-faq). Running ClickPipes might also generate an indirect compute and storage cost on the destination ClickHouse Cloud service similar to any ingest workload. + ClickPipes is billed on two dimensions: Ingested Data and Compute. Running ClickPipes might also generate an indirect compute and storage cost on the destination ClickHouse Cloud service similar to any ingest workload. - **Is there a way to handle errors or failures when using ClickPipes for Kafka?**