GithubHelp home page GithubHelp logo

clickhouse / clickbench Goto Github PK

View Code? Open in Web Editor NEW
570.0 25.0 126.0 3.32 MB

ClickBench: a Benchmark For Analytical Databases

Home Page: https://benchmark.clickhouse.com/

License: Other

Shell 16.81% Python 0.28% HTML 80.20% JavaScript 2.70%
analytics benchmark big-data databases olap sql

clickbench's Introduction

ClickBench: a Benchmark For Analytical Databases

https://benchmark.clickhouse.com/

Discussion: https://news.ycombinator.com/item?id=32084571

Overview

This benchmark represents typical workload in the following areas: clickstream and traffic analysis, web analytics, machine-generated data, structured logs, and events data. It covers the typical queries in ad-hoc analytics and real-time dashboards.

The dataset from this benchmark was obtained from the actual traffic recording of one of the world's largest web analytics platforms. It is anonymized while keeping all the essential distributions of the data. The set of queries was improvised to reflect the realistic workloads, while the queries are not directly from production.

Goals

The main goals of this benchmark are:

Reproducibility

You can quickly reproduce every test in as little as 20 minutes (although some systems may take several hours) in a semi-automated way. The test setup is documented and uses inexpensive cloud VMs. The test process is documented in the form of a shell script, covering the installation of every system, loading of the data, running the workload, and collecting the result numbers. The dataset is published and made available for download in multiple formats.

Compatibility

The tables and queries use mostly standard SQL and require minimum or no adaptation for most SQL DBMS. The dataset has been filtered to avoid difficulties with parsing and loading.

Diversity

The benchmark process is easy enough to cover a wide range of systems. It includes: modern and historical self-managed OLAP DBMS; traditional OLTP DBMS are included for comparison baseline; managed database-as-a-service offerings are included, as well as serverless cloud-native databases; some NoSQL, document, and specialized time-series databases are included as well for a reference, even if they should not be comparable on the same workload.

Realism

The dataset is derived from accurate production data. The realistic data distributions allow for correctly accounting for compression, indices, codecs, custom data structures, etc., which is not possible with most of the random dataset generators. The workload consists of 43 queries and can test the efficiency of full scan and filtered scan, as well as index lookups, and main relational operations. It can test various aspects of hardware as well: some queries require high storage throughput; some queries benefit from a large number of CPU cores, and some benefit from single-core speed; some queries benefit from high main memory bandwidth.

Limitations

The limitations of this benchmark allow keeping it easy to reproduce and to include more systems in the comparison. The benchmark represents only a subset of all possible workloads and scenarios. While it aims to be as fair as possible, focusing on a specific subset of workloads may give an advantage to the systems that specialise in those workloads.

The following limitations should be acknowledged:

  1. The dataset is represented by one flat table. This is not representative of classical data warehouses, which use a normalized star or snowflake data model. The systems for classical data warehouses may get an unfair disadvantage on this benchmark.

  2. The table consists of exactly 99 997 497 records. This is rather small by modern standards but allows tests to be performed in a reasonable time.

  3. While this benchmark allows testing distributed systems, and it includes multi-node and serverless cloud-native setups, most of the results so far have been obtained on a single node setup.

  4. The benchmark runs queries one after another and does not test a workload with concurrent requests; neither does it test for system capacity. Every query is run only a few times, and this allows some variability in the results.

  5. Many setups and systems are different enough to make direct comparison tricky. It is not possible to test the efficiency of storage used for in-memory databases, or the time of data loading for stateless query engines. The goal of the benchmark is to give the numbers for comparison and let you derive the conclusions on your own.

TLDR: All Benchmarks Are Bastards Liars.

Rules and Contribution

How To Add a New Result

To introduce a new system, simply copy-paste one of the directories and edit the files accordingly:

  • benchmark.sh: this is the main script to run the benchmark on a fresh VM; Ubuntu 22.04 or newer should be used by default, or any other system if specified in the comments. The script may not necessarily run in a fully automated manner - it is recommended always to copy-paste the commands one by one and observe the results. For managed databases, if the setup requires clicking in the UI, write a README.md instead.
  • README.md: contains comments and observations if needed. For managed databases, it can describe the setup procedure to be used instead of a shell script.
  • create.sql: a CREATE TABLE statement. If it's a NoSQL system, another file like wtf.json can be presented.
  • queries.sql: contains 43 queries to run;
  • run.sh: a loop for running the queries; every query is run three times; if it's a database with local on-disk storage, the first query should be run after dropping the page cache;
  • results: put the .json files with the results for every hardware configuration there.

To introduce a new result for an existing system on different hardware configurations, add a new file to results.

To introduce a new result for an existing system with a different usage scenario, either copy the whole directory and name it differently (e.g. timescaledb, timescaledb-compression) or add a new file to the results directory.

Installation And Fine-Tuning

The systems can be installed or used in any reasonable way: from a binary distribution, from a Docker container, from the package manager, or compiled - whatever is more natural and simple or gives better results.

It's better to use the default settings and avoid fine-tuning. Configuration changes can be applied if it is considered strictly necessary and documented.

Fine-tuning and optimization for the benchmark are not recommended but allowed. In this case, add the results on vanilla configuration and fine-tuned configuration separately.

Data Loading

The dataset is available in CSV, TSV, JSONlines and Parquet formats by the following links:

You can select the dataset format at your convenience.

Additional sources for stateless table engines are provided:

To correctly compare the insertion time, the dataset should be downloaded and decompressed before loading (if it's using external compression; the parquet file includes internal compression and can be loaded as is). The dataset should be loaded as a single file in the most straightforward way. Splitting the dataset for parallel loading is not recommended, as it will make comparisons more difficult. Splitting the dataset is possible if the system cannot eat it as a whole due to its limitations.

You should not wait for cool down after data loading or running OPTIMIZE / VACUUM before the main benchmark queries unless it is strictly required for the system.

The used storage size can be measured without accounting for temporary data if there is temporary data that will be removed in the background. The built-in introspection capabilities can be used to measure the storage size, or it can be measured by checking the used space in the filesystem.

Indexing

The benchmark table has one index - the primary key. The primary key is not necessary to be unique. The index of the primary key can be made clustered (ordered, partitioned, sharded).

Manual creation of other indices is not recommended, although if the system creates indexes automatically, it is considered ok.

Preaggregation

The creation of pre-aggregated tables or indices, projections, or materialized views is not recommended for the purpose of this benchmark. Although you can add fine-tuned setup and results for reference, they will be out of competition.

If a system is of a "multidimensional OLAP" kind, and so is always or implicitly doing aggregations, it can be added for comparison.

Caching

If the system contains a cache for query results, it should be disabled.

It is okay if the system performs caching for source data (buffer pools and similar). If the cache or buffer pools can be flushed, they should be flushed before the first run of every query.

If the system contains a cache for intermediate data, that cache should be disabled if it is located near the end of the query execution pipeline, thus similar to a query result cache.

Incomplete Results

Many systems cannot run the full benchmark suite successfully due to OOMs, crashes, or unsupported queries. The partial results should be included nevertheless. Put null for the missing numbers.

If The Results Cannot Be Published

Some vendors don't allow publishing benchmark results due to the infamous DeWitt Clause. Most of them still allow the use of the system for benchmarks. In this case, please submit the full information about installation and reproduction, but without the results directory. A .gitignore file can be added to prevent accidental publishing.

We allow both open-source and proprietary systems in our benchmark, as well as managed services, even if registration, credit card, or salesperson call is required - you still can submit the testing description if you don't violate the TOS.

Please let us know if some results were published by mistake by opening an issue on GitHub.

If a Mistake Or Misrepresentation Is Found

It is easy to accidentally misrepresent some systems. While acting in good faith, the authors admit their lack of deep knowledge of most systems. Please send a pull request to correct the mistakes.

Results Usage And Scoreboards

The results can be used for comparison of various systems, but always take them with a grain of salt due to the vast amount of caveats and hidden details. Always reference the original benchmark and this text.

We allow but do not recommend creating scoreboards from this benchmark or saying that one system is better (faster, cheaper, etc.) than another.

There is a web page to navigate across benchmark results and present a summary report. It allows filtering out some systems, setups, or queries. For example, if you found some subset of the 43 queries are irrelevant, you can simply exclude them from the calculation and share the report without these queries.

You can select the summary metric from one of the following: "Cold Run", "Hot Run", "Load Time", and "Data Size". If you select the "Load Time" or "Data Size", the entries will be simply ordered from best to worst, and additionally, the ratio to the best non-zero result will be shown (the number of times one system is worse than the best system in this metric). Load time can be zero for stateless query engines like clickhouse-local or Amazon Athena.

If you select "Cold Run" or "Hot Run", the aggregation across the queries is performed in the following way:

  1. The first run for every query is selected for Cold Run. For Hot Run, the minimum from 2nd and 3rd run time is selected, if both runs are successful, or null if some were unsuccessful.

By default, the "Hot Run" metric is selected, because it's not always possible to obtain a cold runtime for managed services, while for on-premise a quite slow EBS volume is used by default which makes the comparison slightly less interesting.

  1. For every query, find a system that demonstrated the best (fastest) query time and take it as a baseline.

This gives us a point of comparison. Alternatively, we can take a benchmark entry like "ClickHouse on c6a.metal" as a baseline and divide all query times by the baseline time. This would be quite arbitrary and asymmetric. Instead, we take the best result for every query separately.

  1. For every query, if the result is present, calculate the ratio to the baseline, but add constant 10ms to the nominator and denominator, so the formula will be: (10ms + query_time) / (10ms + baseline_query_time). This formula gives a value >= 1, which is equal to 1 for the best benchmark entry on this query.

We are interested in relative query run times, not absolute. The benchmark has a broad set of queries, and there can be queries that typically run in 100ms (e.g., for interactive dashboards) and some queries that typically run in a minute (e.g., complex ad-hoc queries). And we want to treat these queries as equally important in the benchmark, that's why we need relative values.

The constant shift is needed to make the formula well-defined when query time approaches zero. For example, some systems can get query results in 0 ms using table metadata lookup, and another in 10 ms by range scan. But this should not be treated as the infinite advantage of one system over the other. With the constant shift, we will treat it as only two times an advantage.

  1. For every query, if the result is not present, substitute it with a "penalty" calculated as follows: take the maximum query runtime for this benchmark entry across other queries that have a result, but if it is less than 300 seconds, put it 300 seconds. Then multiply the value by 2. Then calculate the ratio as explained above.

For example, one system crashed while trying to run a query which can highlight the maturity, or lack of maturity, of a system. Or does not run a query due to limitations. If this system shows run times like 1..1000 sec. on other queries, we will substitute 2000 sec. instead of this missing result.

  1. Take the geometric mean of the ratios across the queries. It will be the summary rating.

Why geometric mean? The ratios can only be naturally averaged in this way. Imagine there are two queries and two systems. The first system ran the first query in 1s and the second query in 20s. The second system ran the first query in 2s and the second query in 10s. So, the first system is two times faster on the first query and two times slower on the second query and vice-versa. The final score should be identical for these systems.

History and Motivation

The benchmark was created in October 2013 to evaluate various DBMS to use for a web analytics system. It has been made by taking 1/50th of one week of production pageviews (a.k.a. "hits") data and taking the first one billion, one hundred million, and ten million records from it. It has been run on a 3-node cluster of Xeon E2650v2 with 128 GiB RAM, 8x6TB HDD in md-RAID-6, and 10 Gbit network in a private datacenter in Finland.

The following systems were tested in 2013: ClickHouse, MonetDB, InfiniDB, Infobright, LucidDB, Vertica, Hive and MySQL. To ensure fairness, the benchmark has been conducted by a person without ClickHouse experience. ClickHouse has been selected for production usage by the results of this benchmark.

The benchmark continued to be occasionally used privately until 2016 when the results were published with the ClickHouse release in open-source. While the results were made public, the datasets were not, as they contain customer data.

We needed to publish the dataset to facilitate open-source development and testing, but it was not possible to do it as is. In 2019, the clickhouse-obfuscator tool was introduced to anonymize the data, and the dataset was published. Read more about the challenge of data obfuscation here.

More systems were included in the benchmark over time: Greenplum, MemSQL (now SingleStore), OmniSci (now HeavyAI), DuckDB, PostgreSQL, and TimescaleDB.

In 2021 the original cluster for benchmark stopped being used, and we were unable to add new results without rerunning the old results on different hardware. Rerunning the old results appeared to be difficult: due to the natural churn of the software, the old step-by-step instructions become stale.

The original benchmark dataset included many details that were natural for ClickHouse and web analytics data but hard for other systems: unsigned integers (not supported by standard SQL), strings with zero bytes, fixed-length string data types, etc. Only ClickHouse was able to load the dataset as is, while most other databases required non-trivial adjustments to the data and queries.

The idea of the new benchmark is:

  • normalize the dataset to a "common denominator", so it can be loaded to most of the systems without a hassle.
  • normalize the queries to use only standard SQL - they will not use any advantages of ClickHouse but will be runnable on every system.
  • ideally make it automated. At least make it simple - runnable by a short shell script that can be run by copy-pasting a few commands in the terminal, in the worst case.
  • run everything on widely available cloud VMs and allow recording the results from various types of instances.

The benchmark is created and used by the ClickHouse team. It can be surprising, but we did not perform any specific optimizations in ClickHouse for the queries in the benchmark, which allowed us to keep some reasonable sense of fairness with respect to other systems.

Now the new benchmark is easy to use and the results for any system can be reproduced in around 20 minutes.

We also introduced the Hardware Benchmark for testing servers and VMs.

Systems Included

  • ClickHouse
  • ClickHouse on local Parquet files
  • ClickHouse operating like "Athena" on remote Parquet files
  • ClickHouse on a VFS over HTTPs on CDN
  • MySQL InnoDB
  • MySQL MyISAM
  • MariaDB
  • MariaDB ColumnStore
  • MemSQL/SingleStore
  • PostgreSQL
  • Greenplum
  • TimescaleDB
  • Citus
  • Vertica (without publishing)
  • QuestDB
  • DuckDB
  • DuckDB over local Parquet files
  • DuckDB operating like "Athena" on remote Parquet files
  • MonetDB
  • mapD/Omnisci/HeavyAI
  • Databend
  • DataFusion
  • ByteHouse
  • Doris/PALO
  • SelectDB
  • Druid
  • Pinot
  • CrateDB
  • Spark SQL
  • Starrocks
  • ShitholeDB
  • Hive
  • Hydra
  • Impala
  • Hyper
  • Umbra
  • SQLite
  • Redshift
  • Redshift Serverless
  • Redshift Spectrum
  • Presto
  • Trino
  • Amazon Athena
  • Bigquery (without publishing)
  • Snowflake
  • Rockset
  • CockroachDB
  • CockroachDB Serverless
  • Databricks
  • Planetscale (without publishing)
  • TiDB (TiFlash)
  • Amazon RDS Aurora for MySQL
  • Amazon RDS Aurora for Postgres
  • InfluxDB
  • TDEngine
  • MongoDB
  • Cassandra
  • ScyllaDB
  • Elasticsearch
  • Apache Ignite
  • Motherduck
  • Infobright
  • Actian Vector
  • Manticore Search
  • Vertica (without publishing)
  • Azure Synapse
  • Starburst Galaxy
  • MS SQL Server with Column Store Index (without publishing)
  • Dremio (without publishing)
  • Exasol
  • LocustDB
  • EventQL
  • Apache Drill
  • Apache Kudu
  • Apache Kylin
  • S3 select command in AWS
  • Kinetica
  • YDB
  • OceanBase
  • Boilingdata
  • Byteconity
  • DolphinDB
  • Oxla
  • Quickwit
  • AlloyDB
  • ParadeDB
  • GlareDB
  • Seafowl
  • Sneller
  • Tablespace
  • Tembo

By default, all tests are run on c6a.4xlarge VM in AWS with 500 GB gp2.

Please help us add more systems and run the benchmarks on more types of VMs.

Similar Projects

Many alternative benchmarks are applicable to OLAP DBMS with their own advantages and disadvantages.

Brown University Mgbench

https://github.com/crottyan/mgbench

A new analytical benchmark for machine-generated log data. By Andrew Crottyan from Brown University.

Advantages:

  • somewhat realistic dataset;
  • a diverse set of queries;
  • good coverage of systems;
  • easy to reproduce;

Disadvantages:

  • very small dataset size;
  • favors in-memory databases;
  • mostly abandoned.

UC Berkeley AMPLab Big Data Benchmark

https://amplab.cs.berkeley.edu/benchmark/

Poor coverage of queries that are too simple. The benchmark is abandoned.

Mark Litwinschik's NYC Taxi

https://tech.marksblogg.com/benchmarks.html

Advantages:

  • real-world dataset;
  • good coverage of systems; many unusual entries;
  • contains a story for every benchmark entry;

Disadvantages:

  • unreasonably small set of queries: 4 mostly trivial queries don't represent any realistic workload and are subjects for over-optimization;
  • compares different systems on different hardware;
  • many results are outdated;
  • no automated or easy way to reproduce the results;
  • while many results are performed independently of corporations or academia, some benchmark entries may have been sponsored;
  • the dataset is not readily available for downloads: originally 1.1 billion records are used, while it's more than 4 billion records in 2022.

Database-like ops Benchmark from h2o.ai

https://h2oai.github.io/db-benchmark/

A benchmark for data-frame libraries and embedded databases. Good coverage of data-frame libraries and a few full-featured DBMS as well.

A benchmark for querying large JSON datasets

https://colab.research.google.com/github/dcmoura/spyql/blob/master/notebooks/json_benchmark.ipynb

A good benchmark for command-line tools for processing semistructured data. Can be used to test DBMS as well.

Star Schema Benchmark

Pat O'Neil, Betty O'Neil, Xuedong Chen https://www.cs.umb.edu/~poneil/StarSchemaB.PDF

It is a simplified version of TPC-H.

Advantages:

  • well-specified;
  • popular in academia;

Disadvantages:

  • represents a classic data warehouse schema;
  • database generator produces random distributions that are not realistic and the benchmark does not allow for the capture of differences in various optimizations that matter on real-world data;
  • many research systems in academia targeting for this benchmark which makes many aspects of it exhausted;

TPC-H

A benchmark suite from Transaction Processing Council - one of the oldest organizations specializing in DBMS benchmarks.

Advantages:

  • well-specified;

Disadvantages:

  • requires official certification;
  • represents a classic data warehouse schema;
  • database generator produces random distributions that are not realistic and the benchmark does not allow for the capture of differences in various optimizations that matter on real-world data;
  • many systems are targeting this benchmark which makes many aspects of it exhausted;

TPC-DS

More advanced than TPC-H, focused on complex ad-hoc queries. This also requires official certification.

Advantages:

  • an extensive collection of complex queries.

Disadvantages:

  • requires official certification;
  • official results have only sparse coverage of systems;
  • biased towards complex queries over many tables.

Ontime

Introduced by Vadim Tkachenko from Percona in 2009.

Based on the US Bureau of Transportation Statistics open data.

Advantages:

  • real-world dataset;

Disadvantages:

  • not widely used;
  • the set of queries is not standardized;
  • the table contains too much redundancy;

TSBS

Time Series Benchmark Suite. https://github.com/timescale/tsbs Originally from InfluxDB, and supported by TimescaleDB.

Advantages:

  • a benchmark for time-series scenarios;

Disadvantages:

  • not applicable for scenarios with data analytics.

Fair Database Benchmarks

https://github.com/db-benchmarks/db-benchmarks

A benchmark suite inspired by ClickHouse benchmarks. Used mostly to compare search engines: Elasticsearch and Manticore.

SciTS

https://arxiv.org/abs/2204.09795 or https://dl.acm.org/doi/10.1145/3538712.3538723 A new benchmark for time-series workloads.
Tests both insertion and query speeds, as well as resource consumption.

Includes TimescaleDB, InfluxDB, PostgreSQL and ClickHouse.
This benchmark is fully independent and open-source.

STAC

https://www.stacresearch.com/

Disadvantages:

  • requires a paid membership.

More...

Please let me know if you know more well-defined, realistic, and reproducible benchmarks for analytical workloads.

In addition, I collect every benchmark that includes ClickHouse here.

Additional Outcomes

This benchmark can be used to collect the snippets for installation and data loading across a wide variety of DBMS. The usability and quality of the documentation can be compared. It has been used to improve the quality of the participants as demonstrated in duckdb#3969, timescaledb#4473, mariadb-corporation#16, MonetDB#7309, questdb#2272, crate#12654, LocustDB#152, databend#9738, databend#9612, databend#10226, databend#10195, databend#9978, databend#9965, databend#9809, databend#9716, databend#9600, databend#9565 etc.

References and Citation

Alexey Milovidov, 2022.

clickbench's People

Contributors

alexey-milovidov avatar azat avatar cnkk avatar dandandan avatar farthur-cmd avatar felixoid avatar gingerwizard avatar hello-stephen avatar jasonthorsness avatar jychen7 avatar kmitchener avatar mofeiatwork avatar mosinnik avatar mytherin avatar nickitat avatar nmreadelf avatar osawyerr avatar patricklauer avatar philippemnoel avatar pkartaviy avatar puzpuzpuz avatar qoega avatar silverbullet233 avatar sundy-li avatar tbragin avatar tinybit avatar toschmidt avatar tylerhannan avatar waitingkuo avatar wuputah avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

clickbench's Issues

ClickBench query 29

Running q29 produces results like

http://rihanner.ferio.ru/katalogOrigin	38	149869	http://rihanner.ferio.ru/katalogOrigin
http://irr.ru/jobs-educations/tehnik	36	123637	http://irr.ru/jobs-educations/tehnik
https://google.com/fee=меньше	35	2958167	https://google.com/fee=меньше
http://kirov.irr.ru/index.php%3Ftb	34	273645	http://kirov.irr.ru/index.php%3Ftb
http://video.yandsearch/price=от	34	268732	http://video.yandsearch/price=от
http://irr.ru/jobinmoscow.ru/Nike	33	260592	http://irr.ru/jobinmoscow.ru/Nike
http://bdsmpeople.ru/register2123	33	164925	http://bdsmpeople.ru/register2123
...

I would have expect to see host names return as a result

With Postgres I do receive correct result

postgres=# 
postgres=# SELECT REGEXP_REPLACE('http://irr.ru/jobs-educations/tehnik', '^https?://(?:www.)?([^/]+)/.*$', '\1');
 regexp_replace 
----------------
 irr.ru
(1 row)

postgres=# SELECT REGEXP_REPLACE('http://rihanner.ferio.ru/katalogOrigin', '^https?://(?:www.)?([^/]+)/.*$', '\1');
  regexp_replace   
-------------------
 rihanner.ferio.ru
(1 row)

postgres=# 

inconsistent parquet format between hits.parquet and hits_0.parquet

hits.parquet has the String tag for binaries; all the fields are required

e.g. required binary field_id=-1 Title (String);

In [7]: pq.read_metadata('hits.parquet').schema
Out[7]: 
<pyarrow._parquet.ParquetSchema object at 0x11238ab40>
required group field_id=-1 schema {
  required int64 field_id=-1 WatchID;
  required int32 field_id=-1 JavaEnable (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 Title (String);
  required int32 field_id=-1 GoodEvent (Int(bitWidth=16, isSigned=true));
  required int64 field_id=-1 EventTime;
  required int32 field_id=-1 EventDate (Int(bitWidth=16, isSigned=false));
  required int32 field_id=-1 CounterID;
  required int32 field_id=-1 ClientIP;
  required int32 field_id=-1 RegionID;
  required int64 field_id=-1 UserID;
  required int32 field_id=-1 CounterClass (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 OS (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 UserAgent (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 URL (String);
  required binary field_id=-1 Referer (String);
  required int32 field_id=-1 IsRefresh (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 RefererCategoryID (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 RefererRegionID;
  required int32 field_id=-1 URLCategoryID (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 URLRegionID;
  required int32 field_id=-1 ResolutionWidth (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 ResolutionHeight (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 ResolutionDepth (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 FlashMajor (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 FlashMinor (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 FlashMinor2 (String);
  required int32 field_id=-1 NetMajor (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 NetMinor (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 UserAgentMajor (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 UserAgentMinor (String);
  required int32 field_id=-1 CookieEnable (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 JavascriptEnable (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsMobile (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 MobilePhone (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 MobilePhoneModel (String);
  required binary field_id=-1 Params (String);
  required int32 field_id=-1 IPNetworkID;
  required int32 field_id=-1 TraficSourceID (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 SearchEngineID (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 SearchPhrase (String);
  required int32 field_id=-1 AdvEngineID (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsArtifical (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 WindowClientWidth (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 WindowClientHeight (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 ClientTimeZone (Int(bitWidth=16, isSigned=true));
  required int64 field_id=-1 ClientEventTime;
  required int32 field_id=-1 SilverlightVersion1 (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 SilverlightVersion2 (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 SilverlightVersion3;
  required int32 field_id=-1 SilverlightVersion4 (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 PageCharset (String);
  required int32 field_id=-1 CodeVersion;
  required int32 field_id=-1 IsLink (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsDownload (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsNotBounce (Int(bitWidth=16, isSigned=true));
  required int64 field_id=-1 FUniqID;
  required binary field_id=-1 OriginalURL (String);
  required int32 field_id=-1 HID;
  required int32 field_id=-1 IsOldCounter (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsEvent (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 IsParameter (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 DontCountHits (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 WithHash (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 HitColor (String);
  required int64 field_id=-1 LocalEventTime;
  required int32 field_id=-1 Age (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 Sex (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 Income (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 Interests (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 Robotness (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 RemoteIP;
  required int32 field_id=-1 WindowName;
  required int32 field_id=-1 OpenerName;
  required int32 field_id=-1 HistoryLength (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 BrowserLanguage (String);
  required binary field_id=-1 BrowserCountry (String);
  required binary field_id=-1 SocialNetwork (String);
  required binary field_id=-1 SocialAction (String);
  required int32 field_id=-1 HTTPError (Int(bitWidth=16, isSigned=true));
  required int32 field_id=-1 SendTiming;
  required int32 field_id=-1 DNSTiming;
  required int32 field_id=-1 ConnectTiming;
  required int32 field_id=-1 ResponseStartTiming;
  required int32 field_id=-1 ResponseEndTiming;
  required int32 field_id=-1 FetchTiming;
  required int32 field_id=-1 SocialSourceNetworkID (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 SocialSourcePage (String);
  required int64 field_id=-1 ParamPrice;
  required binary field_id=-1 ParamOrderID (String);
  required binary field_id=-1 ParamCurrency (String);
  required int32 field_id=-1 ParamCurrencyID (Int(bitWidth=16, isSigned=true));
  required binary field_id=-1 OpenstatServiceName (String);
  required binary field_id=-1 OpenstatCampaignID (String);
  required binary field_id=-1 OpenstatAdID (String);
  required binary field_id=-1 OpenstatSourceID (String);
  required binary field_id=-1 UTMSource (String);
  required binary field_id=-1 UTMMedium (String);
  required binary field_id=-1 UTMCampaign (String);
  required binary field_id=-1 UTMContent (String);
  required binary field_id=-1 UTMTerm (String);
  required binary field_id=-1 FromTag (String);
  required int32 field_id=-1 HasGCLID (Int(bitWidth=16, isSigned=true));
  required int64 field_id=-1 RefererHash;
  required int64 field_id=-1 URLHash;
  required int32 field_id=-1 CLID;
}

while hits_0.parquet has no String tag for binaries, and all the fields are optional

e.g. optional binary field_id=-1 Title;

In [8]: pq.read_metadata('hits_0.parquet').schema
Out[8]: 
<pyarrow._parquet.ParquetSchema object at 0x114c30fc0>
required group field_id=-1 schema {
  optional int64 field_id=-1 WatchID;
  optional int32 field_id=-1 JavaEnable (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 Title;
  optional int32 field_id=-1 GoodEvent (Int(bitWidth=16, isSigned=true));
  optional int64 field_id=-1 EventTime;
  optional int32 field_id=-1 EventDate (Int(bitWidth=16, isSigned=false));
  optional int32 field_id=-1 CounterID;
  optional int32 field_id=-1 ClientIP;
  optional int32 field_id=-1 RegionID;
  optional int64 field_id=-1 UserID;
  optional int32 field_id=-1 CounterClass (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 OS (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 UserAgent (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 URL;
  optional binary field_id=-1 Referer;
  optional int32 field_id=-1 IsRefresh (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 RefererCategoryID (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 RefererRegionID;
  optional int32 field_id=-1 URLCategoryID (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 URLRegionID;
  optional int32 field_id=-1 ResolutionWidth (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 ResolutionHeight (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 ResolutionDepth (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 FlashMajor (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 FlashMinor (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 FlashMinor2;
  optional int32 field_id=-1 NetMajor (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 NetMinor (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 UserAgentMajor (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 UserAgentMinor;
  optional int32 field_id=-1 CookieEnable (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 JavascriptEnable (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsMobile (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 MobilePhone (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 MobilePhoneModel;
  optional binary field_id=-1 Params;
  optional int32 field_id=-1 IPNetworkID;
  optional int32 field_id=-1 TraficSourceID (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 SearchEngineID (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 SearchPhrase;
  optional int32 field_id=-1 AdvEngineID (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsArtifical (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 WindowClientWidth (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 WindowClientHeight (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 ClientTimeZone (Int(bitWidth=16, isSigned=true));
  optional int64 field_id=-1 ClientEventTime;
  optional int32 field_id=-1 SilverlightVersion1 (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 SilverlightVersion2 (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 SilverlightVersion3;
  optional int32 field_id=-1 SilverlightVersion4 (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 PageCharset;
  optional int32 field_id=-1 CodeVersion;
  optional int32 field_id=-1 IsLink (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsDownload (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsNotBounce (Int(bitWidth=16, isSigned=true));
  optional int64 field_id=-1 FUniqID;
  optional binary field_id=-1 OriginalURL;
  optional int32 field_id=-1 HID;
  optional int32 field_id=-1 IsOldCounter (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsEvent (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 IsParameter (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 DontCountHits (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 WithHash (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 HitColor;
  optional int64 field_id=-1 LocalEventTime;
  optional int32 field_id=-1 Age (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 Sex (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 Income (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 Interests (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 Robotness (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 RemoteIP;
  optional int32 field_id=-1 WindowName;
  optional int32 field_id=-1 OpenerName;
  optional int32 field_id=-1 HistoryLength (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 BrowserLanguage;
  optional binary field_id=-1 BrowserCountry;
  optional binary field_id=-1 SocialNetwork;
  optional binary field_id=-1 SocialAction;
  optional int32 field_id=-1 HTTPError (Int(bitWidth=16, isSigned=true));
  optional int32 field_id=-1 SendTiming;
  optional int32 field_id=-1 DNSTiming;
  optional int32 field_id=-1 ConnectTiming;
  optional int32 field_id=-1 ResponseStartTiming;
  optional int32 field_id=-1 ResponseEndTiming;
  optional int32 field_id=-1 FetchTiming;
  optional int32 field_id=-1 SocialSourceNetworkID (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 SocialSourcePage;
  optional int64 field_id=-1 ParamPrice;
  optional binary field_id=-1 ParamOrderID;
  optional binary field_id=-1 ParamCurrency;
  optional int32 field_id=-1 ParamCurrencyID (Int(bitWidth=16, isSigned=true));
  optional binary field_id=-1 OpenstatServiceName;
  optional binary field_id=-1 OpenstatCampaignID;
  optional binary field_id=-1 OpenstatAdID;
  optional binary field_id=-1 OpenstatSourceID;
  optional binary field_id=-1 UTMSource;
  optional binary field_id=-1 UTMMedium;
  optional binary field_id=-1 UTMCampaign;
  optional binary field_id=-1 UTMContent;
  optional binary field_id=-1 UTMTerm;
  optional binary field_id=-1 FromTag;
  optional int32 field_id=-1 HasGCLID (Int(bitWidth=16, isSigned=true));
  optional int64 field_id=-1 RefererHash;
  optional int64 field_id=-1 URLHash;
  optional int32 field_id=-1 CLID;
}

Add YTsaurus support

What is YTsaurus: https://ytsaurus.tech/

Since YTsaurus does not have a built-in benchmark tool, could be a good idea to add YTsaurus support to ClickBench to get a possibility to benchmark YTsaurus somehow. Since YTsaurus supports YQL and has CLI, it should be possible quite easy to adopt ClickBench (at least from the interface perspective).

Honestly, not sure how typical workloads from ClickBench are for YTsaurus - needs to be clarified.

@gritukan you could be interested in this issue. Resolving this one can help with ytsaurus/ytsaurus#40

Elasticsearch benchmarks flush the cache between queries

I've been trying to understand with my local benchmarking of roughly equivalent queries from my app (at least to get the data I need) why ES is outperforming CH by a factor of 10x in some cases, especially compared to the benchmarks here.

https://github.com/ClickHouse/ClickBench/blob/main/elasticsearch/run.sh#L11-L12

I can sort of see the reasoning for clearing the ES cache between queries but I feel that it's misleading with regards to the real world performance people will see.

While it's true from my observations that my equivalent CH and ES queries take around the same time from a cold start, ES quickly improves while CH stays relatively consistent and so on the whole much slower. ES also deals with concurrency much better, using Apache Benchmark with a concurrency of 3 I could see little change for ES but CH was taking up 4x longer than normal to deal with 1000 requests.

I feel at the very least there should be some indication that caches are not a factor in these benchmarks, and so should not be viewed as representative of real-world performance, at least in this case.

Inaccurate table size calculation of Mysql

At the moment, the below command is used in order to calculate the storage size of the table in MySQL:

sudo du -bcs /var/lib/mysql

Because of the irrelevant files of the Mysql (about 1G) and Binlog files (tens of Gigabytes), it doesn't seem reasonable to me to calculate table size in the mentioned way. Instead, it may be more appropriate to use the below query:

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "test"
    AND table_name = "hits";

This will give us the actual size of the hits table. For 10M rows of the table, I got 14G for the first command and 6.4G for the proposed query. I found out that about 6G of 14G was due to the Binlog files, which are ephemeral, and I don't see any point to include them in the storage result.

Consequently, for the full hits table, we may end up with at most 70G instead of 160G, which is more rational to me.

What do you think?

Segmentation fault running hardware.sh while running Test 17

Hello,

I am running the hardware.sh on a Ubuntu 22.04 LTS setup with a i9-12900K processor but I always get a segfault which I guess is not what should happen?

~/ClickBench/hardware/clickhouse-benchmark ~/ClickBench/hardware
 19:05:33 up 36 min,  0 users,  load average: 0.48, 1.17, 1.08
Starting clickhouse-server
Waiting for clickhouse-server to start
Ok.
Dataset already downloaded
Dataset already prepared

Will perform benchmark. Results:

[0.001, 0.013, 0.001],
[0.011, 0.008, 0.011],
[0.044, 0.037, 0.032],
[0.062, 0.030, 0.025],
[0.100, 0.060, 0.074],
[0.161, 0.184, 0.139],
[0.001, 0.001, 0.001],
[0.013, 0.015, 0.008],
[0.414, 0.374, 0.367],
[0.473, 0.419, 0.410],
[0.147, 0.095, 0.086],
[0.128, 0.115, 0.121],
[0.671, 0.624, 0.630],
[0.876, 0.797, 0.802],
[0.805, 0.705, 0.645],
[0.629, 0.672, 0.673],
[2.454, [Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.218443 [ 11856 ] <Fatal> BaseDaemon: ########################################
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.218522 [ 11856 ] <Fatal> BaseDaemon: (version 22.10.1.934 (official build), build id: 833BDA9C186AC201676309D415DD72D3E0D5F458) (from thread 11592) (query_id: 464568b4-3d14-4903-9a6c-a5a6f48410d7) (query: SELECT UserID, SearchPhrase, count() FROM hits GROUP BY UserID, SearchPhrase ORDER BY count() DESC LIMIT 10;) Received signal Segmentation fault (11)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.218565 [ 11856 ] <Fatal> BaseDaemon: Address: 0x10 Access: read. Address not mapped to object.
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.218577 [ 11856 ] <Fatal> BaseDaemon: Stack trace: 0x11c78a52 0x11adcdf6 0x134b2e08 0x132dd655 0x132dd1e6 0x132f92c6 0x132ed49c 0x132efb1d 0xcd88f8c 0xcd8e69e 0x7f335b04ab43 0x7f335b0dca00
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612117 [ 11856 ] <Fatal> BaseDaemon: 2.1. inlined from ./build_docker/../base/base/StringRef.h:78: compareSSE2(char const*, char const*)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612187 [ 11856 ] <Fatal> BaseDaemon: 2.2. inlined from ./build_docker/../base/base/StringRef.h:152: memequalSSE2Wide(char const*, char const*, unsigned long)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612198 [ 11856 ] <Fatal> BaseDaemon: 2.3. inlined from ./build_docker/../base/base/StringRef.h:171: operator==(StringRef, StringRef)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612211 [ 11856 ] <Fatal> BaseDaemon: 2.4. inlined from ./build_docker/../src/Common/HashTable/HashTable.h:95: bool bitEquals<StringRef const&>(StringRef const&, StringRef const&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612224 [ 11856 ] <Fatal> BaseDaemon: 2.5. inlined from ./build_docker/../src/Common/HashTable/HashMap.h:174: HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>::keyEquals(StringRef const&, unsigned long) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612238 [ 11856 ] <Fatal> BaseDaemon: 2.6. inlined from ./build_docker/../src/Common/HashTable/HashMap.h:175: HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>::keyEquals(StringRef const&, unsigned long, HashTableNoState const&) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612252 [ 11856 ] <Fatal> BaseDaemon: 2.7. inlined from ./build_docker/../src/Common/HashTable/HashTable.h:486: HashTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >::findCell(StringRef const&, unsigned long, unsigned long) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612270 [ 11856 ] <Fatal> BaseDaemon: 2.8. inlined from ./build_docker/../src/Common/HashTable/HashTable.h:989: void HashTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >::emplaceNonZero<StringRef const&>(StringRef const&, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>*&, bool&, unsigned long)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612284 [ 11856 ] <Fatal> BaseDaemon: 2.9. inlined from ./build_docker/../src/Common/HashTable/HashTable.h:1069: void HashTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >::emplace<StringRef const&>(StringRef const&, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>*&, bool&, unsigned long)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612314 [ 11856 ] <Fatal> BaseDaemon: 2.10. inlined from ./build_docker/../src/Common/HashTable/HashMap.h:232: void HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >::mergeToViaEmplace<void DB::Aggregator::mergeDataImpl<DB::AggregationMethodSerialized<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true>, HashMapTable> >, true, false, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> > >(HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, DB::Arena*) const::'lambda'(char*&, char*&, bool), false>(HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, void DB::Aggregator::mergeDataImpl<DB::AggregationMethodSerialized<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true>, HashMapTable> >, true, false, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> > >(HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, DB::Arena*) const::'lambda'(char*&, char*&, bool)&&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.612333 [ 11856 ] <Fatal> BaseDaemon: 2. ./build_docker/../src/Interpreters/Aggregator.cpp:2437: void DB::Aggregator::mergeDataImpl<DB::AggregationMethodSerialized<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true>, HashMapTable> >, true, false, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> > >(HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true> >&, DB::Arena*) const @ 0x11c78a52 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.903818 [ 11856 ] <Fatal> BaseDaemon: 3.1. inlined from ./build_docker/../src/Interpreters/Aggregator.cpp:2616: void DB::Aggregator::mergeBucketImpl<DB::AggregationMethodSerialized<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true, true>, HashMapTable> > >(std::__1::vector<std::__1::shared_ptr<DB::AggregatedDataVariants>, std::__1::allocator<std::__1::shared_ptr<DB::AggregatedDataVariants> > >&, int, DB::Arena*, std::__1::atomic<bool>*) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.904102 [ 11856 ] <Fatal> BaseDaemon: 3. ./build_docker/../src/Interpreters/Aggregator.cpp:1668: DB::Aggregator::mergeAndConvertOneBucketToBlock(std::__1::vector<std::__1::shared_ptr<DB::AggregatedDataVariants>, std::__1::allocator<std::__1::shared_ptr<DB::AggregatedDataVariants> > >&, DB::Arena*, bool, unsigned long, std::__1::atomic<bool>*) const @ 0x11adcdf6 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.967403 [ 11856 ] <Fatal> BaseDaemon: 4. ./build_docker/../src/Processors/Transforms/AggregatingTransform.cpp:127: DB::ConvertingAggregatedToChunksSource::generate() @ 0x134b2e08 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.983802 [ 11856 ] <Fatal> BaseDaemon: 5.1. inlined from ./build_docker/../src/Processors/Chunk.h:90: DB::Chunk::hasRows() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.983867 [ 11856 ] <Fatal> BaseDaemon: 5.2. inlined from ./build_docker/../src/Processors/Chunk.h:92: DB::Chunk::empty() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.983878 [ 11856 ] <Fatal> BaseDaemon: 5.3. inlined from ./build_docker/../src/Processors/Chunk.h:93: DB::Chunk::operator bool() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.983887 [ 11856 ] <Fatal> BaseDaemon: 5. ./build_docker/../src/Processors/ISource.cpp:125: DB::ISource::tryGenerate() @ 0x132dd655 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.990772 [ 11856 ] <Fatal> BaseDaemon: 6.1. inlined from ./build_docker/../contrib/libcxx/include/optional:321: std::__1::__optional_storage_base<DB::Chunk, false>::has_value() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.990843 [ 11856 ] <Fatal> BaseDaemon: 6.2. inlined from ./build_docker/../contrib/libcxx/include/optional:975: std::__1::optional<DB::Chunk>::operator bool() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.990849 [ 11856 ] <Fatal> BaseDaemon: 6. ./build_docker/../src/Processors/ISource.cpp:94: DB::ISource::work() @ 0x132dd1e6 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.997860 [ 11856 ] <Fatal> BaseDaemon: 7.1. inlined from ./build_docker/../src/Processors/Executors/ExecutionThreadContext.cpp:0: DB::executeJob(DB::ExecutingGraph::Node*, DB::ReadProgressCallback*)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:53.997936 [ 11856 ] <Fatal> BaseDaemon: 7. ./build_docker/../src/Processors/Executors/ExecutionThreadContext.cpp:92: DB::ExecutionThreadContext::executeTask() @ 0x132f92c6 in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.011623 [ 11856 ] <Fatal> BaseDaemon: 8. ./build_docker/../src/Processors/Executors/PipelineExecutor.cpp:228: DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic<bool>*) @ 0x132ed49c in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.019734 [ 11856 ] <Fatal> BaseDaemon: 9.1. inlined from ./build_docker/../src/Processors/Executors/PipelineExecutor.cpp:0: operator()
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.019756 [ 11856 ] <Fatal> BaseDaemon: 9.2. inlined from ./build_docker/../contrib/libcxx/include/type_traits:3640: decltype(static_cast<DB::PipelineExecutor::spawnThreads()::$_0>(fp)()) std::__1::__invoke<ThreadFromGlobalPoolImpl<true>::ThreadFromGlobalPoolImpl<DB::PipelineExecutor::spawnThreads()::$_0>(DB::PipelineExecutor::spawnThreads()::$_0&&)::'lambda'()&>(DB::PipelineExecutor::spawnThreads()::$_0&&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.019762 [ 11856 ] <Fatal> BaseDaemon: 9.3. inlined from ./build_docker/../contrib/libcxx/include/__functional/invoke.h:61: void std::__1::__invoke_void_return_wrapper<void, true>::__call<ThreadFromGlobalPoolImpl<true>::ThreadFromGlobalPoolImpl<DB::PipelineExecutor::spawnThreads()::$_0>(DB::PipelineExecutor::spawnThreads()::$_0&&)::'lambda'()&>(ThreadFromGlobalPoolImpl<true>::ThreadFromGlobalPoolImpl<DB::PipelineExecutor::spawnThreads()::$_0>(DB::PipelineExecutor::spawnThreads()::$_0&&)::'lambda'()&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.019768 [ 11856 ] <Fatal> BaseDaemon: 9.4. inlined from ./build_docker/../contrib/libcxx/include/__functional/function.h:230: std::__1::__function::__default_alloc_func<ThreadFromGlobalPoolImpl<true>::ThreadFromGlobalPoolImpl<DB::PipelineExecutor::spawnThreads()::$_0>(DB::PipelineExecutor::spawnThreads()::$_0&&)::'lambda'(), void ()>::operator()()
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.019770 [ 11856 ] <Fatal> BaseDaemon: 9. ./build_docker/../contrib/libcxx/include/__functional/function.h:711: void std::__1::__function::__policy_invoker<void ()>::__call_impl<std::__1::__function::__default_alloc_func<ThreadFromGlobalPoolImpl<true>::ThreadFromGlobalPoolImpl<DB::PipelineExecutor::spawnThreads()::$_0>(DB::PipelineExecutor::spawnThreads()::$_0&&)::'lambda'(), void ()> >(std::__1::__function::__policy_storage const*) @ 0x132efb1d in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.025178 [ 11856 ] <Fatal> BaseDaemon: 10.1. inlined from ./build_docker/../base/base/wide_integer_impl.h:772: bool wide::integer<128ul, unsigned int>::_impl::operator_eq<wide::integer<128ul, unsigned int> >(wide::integer<128ul, unsigned int> const&, wide::integer<128ul, unsigned int> const&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.025190 [ 11856 ] <Fatal> BaseDaemon: 10.2. inlined from ./build_docker/../base/base/wide_integer_impl.h:1439: bool wide::operator==<128ul, unsigned int, 128ul, unsigned int>(wide::integer<128ul, unsigned int> const&, wide::integer<128ul, unsigned int> const&)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.025195 [ 11856 ] <Fatal> BaseDaemon: 10.3. inlined from ./build_docker/../base/base/strong_typedef.h:42: StrongTypedef<wide::integer<128ul, unsigned int>, DB::UUIDTag>::operator==(StrongTypedef<wide::integer<128ul, unsigned int>, DB::UUIDTag> const&) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.025200 [ 11856 ] <Fatal> BaseDaemon: 10.4. inlined from ./build_docker/../src/Common/OpenTelemetryTraceContext.h:39: DB::OpenTelemetry::Span::isTraceEnabled() const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.025202 [ 11856 ] <Fatal> BaseDaemon: 10. ./build_docker/../src/Common/ThreadPool.cpp:296: ThreadPoolImpl<std::__1::thread>::worker(std::__1::__list_iterator<std::__1::thread, void*>) @ 0xcd88f8c in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031601 [ 11856 ] <Fatal> BaseDaemon: 11.1. inlined from ./build_docker/../contrib/libcxx/include/__memory/unique_ptr.h:312: std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >::reset(std::__1::__thread_struct*)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031608 [ 11856 ] <Fatal> BaseDaemon: 11.2. inlined from ./build_docker/../contrib/libcxx/include/__memory/unique_ptr.h:269: ~unique_ptr
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031613 [ 11856 ] <Fatal> BaseDaemon: 11.3. inlined from ./build_docker/../contrib/libcxx/include/tuple:210: ~__tuple_leaf
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031616 [ 11856 ] <Fatal> BaseDaemon: 11.4. inlined from ./build_docker/../contrib/libcxx/include/tuple:470: ~tuple
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031621 [ 11856 ] <Fatal> BaseDaemon: 11.5. inlined from ./build_docker/../contrib/libcxx/include/__memory/unique_ptr.h:54: std::__1::default_delete<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()> >::operator()(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()>*) const
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031628 [ 11856 ] <Fatal> BaseDaemon: 11.6. inlined from ./build_docker/../contrib/libcxx/include/__memory/unique_ptr.h:315: std::__1::unique_ptr<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()>, std::__1::default_delete<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()> > >::reset(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()>*)
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031632 [ 11856 ] <Fatal> BaseDaemon: 11.7. inlined from ./build_docker/../contrib/libcxx/include/__memory/unique_ptr.h:269: ~unique_ptr
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031636 [ 11856 ] <Fatal> BaseDaemon: 11. ./build_docker/../contrib/libcxx/include/thread:295: void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, int, std::__1::optional<unsigned long>, bool)::'lambda0'()> >(void*) @ 0xcd8e69e in /home/mike/ClickBench/hardware/clickhouse-benchmark/clickhouse
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031641 [ 11856 ] <Fatal> BaseDaemon: 12. ? @ 0x7f335b04ab43 in ?
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.031644 [ 11856 ] <Fatal> BaseDaemon: 13. ? @ 0x7f335b0dca00 in ?
[Ubuntu-2204-jammy-amd64-base] 2022.10.05 19:05:54.118399 [ 11856 ] <Fatal> BaseDaemon: Integrity check of the executable successfully passed (checksum: B355A90358E27C0884733C9EB49D0A6E)
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from localhost:9000: (in query: SELECT UserID, SearchPhrase, count() FROM hits GROUP BY UserID, SearchPhrase ORDER BY count() DESC LIMIT 10;). (ATTEMPT_TO_READ_AFTER_EOF), Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR)],
[Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR), Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR), Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR)],
[Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR), Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR), Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR)],

Benchmark for StarRocks

Hey there, I found that you got some problems when trying to benchmark StarRocks, and I'm willing to help, to make the benchmark result public.

Several ways to download StarRocks:

Current latest stable version is 2.2.2, and latest RC version is 2.3.0-rc2.

If you got any more problems when downloading or benchmarking, please contact our team at this issue or our slack channel.

Add Quickwit support

Would be nice to see Quickwit comparison as well since at least ElasticSearch is supported here right now.

Pinging @fulmicoton - probably you could be interested in it at least from the perspective "where Quickwit performance could be improved compared to other engines".

Help wanted: Databricks

We need your help adding Databricks.

Note: if you will not help, I will add it by myself, and it might be with less attention to nuances.

ClickHouse appears to run into an overflow on Q3

Ran into this while adding result verification, the result produced by ClickHouse for Q3 appears to be incorrect - likely due to an internal overflow:

SELECT AVG(UserID) FROM hits;
┌─────────avg(UserID)─┐
│ -55945124888.916016 │
└─────────────────────┘

I'm not sure if this is intended behavior - it does not appear to be listed on the documentation.

Adding a cast to INT128 or DOUBLE fixes the problem:

SELECT AVG(toInt128(UserID)) FROM hits;
┌─avg(toInt128(UserID))─┐
│   2528953029789716000 │
└───────────────────────┘

SELECT AVG(CAST(UserID AS DOUBLE)) FROM hits;
┌─avg(CAST(UserID, 'DOUBLE'))─┐
│         2528953029789716000 │
└─────────────────────────────┘

Can we get a larger dataset?

Is it possible to get a larger data set, say 2TB or 5TB? Testing on a 200GB data set that is easily compressible down to 50GB with modern compression algorithms might exclude disk IO from the equation on systems with large caches (even if those are simple disk caches)

Biased reports: Benchmark uses a different input for Clickhouse than for other databases

Since Clickhouse is running these benchmarks, it's not surprising that Clickhouse gets preferential treatment.

For example the "Detailed Comparison" shows in a strong red color that Snowflake took 42 minutes to load the data, while Clickhouse only a little more than 2 minutes:

image

How is that possible? What's the magic that allows Clickhouse to load data in 2 minutes, instead of 42?

The magic is that Clickhouse is feeding Clickhouse a different source of data:

If Clickhouse had used the same 100 Parquet files as input for Snowflake, loading times would have been roughly equivalent - as this is an I/O bounded operation that can be parallelized.

Disclosure: I'm Felipe Hoffa, and I work for Snowflake. By the way, I'm glad to see the great results Snowflake got in this "potentially" biased benchmark.

Ps: While we are here, I would recommend Clickhouse to delete the unprofessional snarky comments on https://github.com/ClickHouse/ClickBench/blob/main/snowflake/NOTES.md - if they want to keep the appearances of running a fair comparison.

Syntax error for postgresql CREATE TABLE

Hi, When I use ClickHouse run benchmark for PostgreSQL, I found there is a syntax error in create.sql. Here we should remove the last comma.

diff --git a/postgresql/create.sql b/postgresql/create.sql
index 10185d5..41c961c 100644
--- a/postgresql/create.sql
+++ b/postgresql/create.sql
@@ -104,5 +104,5 @@ CREATE TABLE hits
     HasGCLID SMALLINT NOT NULL,
     RefererHash BIGINT NOT NULL,
     URLHash BIGINT NOT NULL,
-    CLID INTEGER NOT NULL,
+    CLID INTEGER NOT NULL
 );

Q17 doesn't have sorting

Q17 is Q16 but without sorting. So Q17 results always unpredictable. Should it be updated to use ORDER BY somehow?

Q17 Now is:

SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase LIMIT 10;

Add result for Apache Doris

hi:
I want to make a pr to add Apache Doris result, but I'm not sure about the Reproducibility.
It says 20 minutes. if I load data into Doris and wait for 5 minutes, then run query, is that OK?
Doris still performs compaction in the backend when the load data is done, which affects the query performance.

feat: add Github Actions to auto generate index.html

Background

currently, after updating individual PR, we also need to manually run generate-results.sh to update index.html.

Problem

  1. It is inconvenient
  2. It is confusing why PR on one system will "unexpectedly" update another system's result (e.g. this Datafusion PR updates Clickhouse result. I think because Clickhouse forgot to update index.html before)

Proposal

add a GitHub action on the main branch to auto-generate index.html and push it back to the main branch
(be careful about the dead loop, we may prevent it by check git log whether index.html is modified)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.