{"article":{"slug":"the-benchmarking-crisis","title":"The Benchmarking Crisis","subtitle":null,"summary":"Thomas Neumann argues that Goodhart's law is breaking database benchmarks such as ClickBench, where systems increasingly optimise for the known queries, and proposes keeping benchmark queries secret or generating fresh workloads each round, as SQLStorm does, so results stay meaningful.","content_type":"opinion","language":"en","canonical_url":"https://databasearchitects.blogspot.com/2026/10/the-benchmarking-crisis.html","author":{"name":"Thomas Neumann","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Database Architects","url":"https://databasearchitects.blogspot.com/","listing_slug":null,"listing":null},"topics":[{"name":"Databases","slug":"databases","url":"https://listedarticles.com/topics/databases"},{"name":"Benchmarks","slug":"benchmarks","url":"https://listedarticles.com/topics/benchmarks"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":753,"reading_minutes":3,"published_at":"2026-10-27T00:00:00.000Z","added_at":"2026-10-28T11:11:19.700Z","updated_at":"2026-10-28T11:11:19.700Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/the-benchmarking-crisis","markdown_url":"https://listedarticles.com/articles/the-benchmarking-crisis.md","example":false,"citation":"Thomas Neumann, Database Architects. \"The Benchmarking Crisis.\" 27 Oct 2026. https://databasearchitects.blogspot.com/2026/10/the-benchmarking-crisis.html (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://databasearchitects.blogspot.com/2026/10/the-benchmarking-crisis.html"},"body_markdown":"*Thomas Neumann · Database Architects · October 27, 2026*\n\n[Goodhart’s\nlaw](https://en.wikipedia.org/wiki/Goodhart%27s_law), that any measurable target stops being useful when people start\noptimizing for it, very much holds in database benchmarking. That is not\nnew, of course. Famously, [TPC-D](https://www.tpc.org/tpcd/default5.asp) got retired when\npeople optimized so much for it that the query runtimes converged\ntowards zero due to excessive caching. [TPC-H](https://www.tpc.org/tpch/default5.asp) fixed that by\ndeclaring itself to be an ad-hoc benchmark, and explicitly forbidding\nthings like exploiting knowledge about the workload or caching results\n(and a number of other optimizations).\n\nWe now see the same problem with the [ClickBench](https://benchmark.clickhouse.com/) benchmark,\nheavily accelerated by today’s use of AI code generation. If you tell an\nAI to make the queries faster, it will make the queries faster,\nregardless of whether this is a generally plausible approach or not. For\nexample, the pgrust implementation performs group-by aggregations on\nstring columns purely on the hash value, ignoring the long string\ncontent. That is a great performance boost, of course, and works for\nthis benchmark, but can produce wrong results. Is it faster? Yes. Is it\na plausible optimization? Probably not. And it does many other things:\nFor example, ClickBench repeats certain predicates across queries, and\nthus pgrust caches the predicate, completely eliminating the query cost\nthe second time. Or for query Q17, which returns tuples grouped by\nuserid, it makes use of the fact that a) tuples are roughly clustered by\nuserid, and b) the query specifies a limit clause without order by. Thus\nany userid will do, and it never reads most of the data. A human would\nnot do these tiny micro-optimizations, because they are unlikely to be\nrelevant in general use cases, but an AI can of course look at each\nquery in detail and tune for it.\n\nPart of the problem is, of course, ClickBench itself. The benchmark\nis not well specified in what is permitted and what is not, there is no\nupdate stream, the queries are very simple, share predicates, are\nunderspecified, etc. But the fundamental problem is independent of that\nconcrete benchmark: The moment we start aggressively optimizing for a\nspecific benchmark, the benchmark stops being very useful. Historically,\nthat pressure was reduced a bit by the requirement that systems be\ngenerally useful. That is, they did not just want to perform well in\nbenchmarks but also to be useful for their customers. That is, of\ncourse, not a concern for vibe-coded execution engines.\n\nIt is not clear what to do about it. Our [SQLStorm](https://github.com/SQL-Storm/SQLStorm) proposal tried\nto address this by having tens of thousands of queries, which makes\noverfitting harder. No human would fine-tune their system to such a huge\nworkload. But with AI tools we could even investigate ten thousand\nqueries in detail if needed, so that is not a real defense.\n\nI think that to be meaningful, a benchmark has to a) like TPC-H, be\nad-hoc, and forbid exploiting prior knowledge and any form of\nintermediate result caching. If we don’t do that, execution times\nconverge towards zero. And b) the benchmark has to include some form of\nupdate stream, as otherwise overly aggressive read-only or read-mostly\nsystems will always outperform systems that offer full transactional\nsupport. And c) the benchmark has to be truly ad-hoc, in the sense that\nthe systems tested have to be older than the benchmark. One way to fight\nGoodhart’s law would be to (automatically) come up with a new benchmark\nfrom time to time, and then measure the systems that existed before the\nbenchmark. The caching/pre-computation problem still remains, of course,\nbut at least that would prevent the over-aggressive adjustment to just\none specific benchmark.\n\nInterestingly, the machine learning community has struggled with\nexactly the same problem for years, and we should probably borrow some\nof their ideas. Kaggle competitions, for example, rank submissions on a\nhidden test set that participants never see, which makes overfitting on\nthe public data pointless. Similarly, benchmarks like [LiveBench](https://livebench.ai/) regularly release new\nquestions to make sure that models cannot have seen them during\ntraining. For database benchmarking that could mean keeping the actual\nbenchmark queries secret and only publishing a representative sample for\ndevelopment, or, even better, generating a fresh workload for every\nevaluation round. SQLStorm already uses generated queries, so producing\na new query set from time to time would be fairly easy. We would\nprobably want a more generic approach (higher variety in schemas, update\nstreams, transactions, etc.), but that seems to be a direction that\nwould help keep benchmarks meaningful.\n\n---\n\n*Originally published at [Database Architects](https://databasearchitects.blogspot.com/2026/10/the-benchmarking-crisis.html).*\n","body_html":"<p><em>Thomas Neumann · Database Architects · October 27, 2026</em></p>\n<p><a href=\"https://en.wikipedia.org/wiki/Goodhart%27s_law\" rel=\"nofollow ugc noopener\">Goodhart’s\nlaw</a>, that any measurable target stops being useful when people start\noptimizing for it, very much holds in database benchmarking. That is not\nnew, of course. Famously, <a href=\"https://www.tpc.org/tpcd/default5.asp\" rel=\"nofollow ugc noopener\">TPC-D</a> got retired when\npeople optimized so much for it that the query runtimes converged\ntowards zero due to excessive caching. <a href=\"https://www.tpc.org/tpch/default5.asp\" rel=\"nofollow ugc noopener\">TPC-H</a> fixed that by\ndeclaring itself to be an ad-hoc benchmark, and explicitly forbidding\nthings like exploiting knowledge about the workload or caching results\n(and a number of other optimizations).</p>\n<p>We now see the same problem with the <a href=\"https://benchmark.clickhouse.com/\" rel=\"nofollow ugc noopener\">ClickBench</a> benchmark,\nheavily accelerated by today’s use of AI code generation. If you tell an\nAI to make the queries faster, it will make the queries faster,\nregardless of whether this is a generally plausible approach or not. For\nexample, the pgrust implementation performs group-by aggregations on\nstring columns purely on the hash value, ignoring the long string\ncontent. That is a great performance boost, of course, and works for\nthis benchmark, but can produce wrong results. Is it faster? Yes. Is it\na plausible optimization? Probably not. And it does many other things:\nFor example, ClickBench repeats certain predicates across queries, and\nthus pgrust caches the predicate, completely eliminating the query cost\nthe second time. Or for query Q17, which returns tuples grouped by\nuserid, it makes use of the fact that a) tuples are roughly clustered by\nuserid, and b) the query specifies a limit clause without order by. Thus\nany userid will do, and it never reads most of the data. A human would\nnot do these tiny micro-optimizations, because they are unlikely to be\nrelevant in general use cases, but an AI can of course look at each\nquery in detail and tune for it.</p>\n<p>Part of the problem is, of course, ClickBench itself. The benchmark\nis not well specified in what is permitted and what is not, there is no\nupdate stream, the queries are very simple, share predicates, are\nunderspecified, etc. But the fundamental problem is independent of that\nconcrete benchmark: The moment we start aggressively optimizing for a\nspecific benchmark, the benchmark stops being very useful. Historically,\nthat pressure was reduced a bit by the requirement that systems be\ngenerally useful. That is, they did not just want to perform well in\nbenchmarks but also to be useful for their customers. That is, of\ncourse, not a concern for vibe-coded execution engines.</p>\n<p>It is not clear what to do about it. Our <a href=\"https://github.com/SQL-Storm/SQLStorm\" rel=\"nofollow ugc noopener\">SQLStorm</a> proposal tried\nto address this by having tens of thousands of queries, which makes\noverfitting harder. No human would fine-tune their system to such a huge\nworkload. But with AI tools we could even investigate ten thousand\nqueries in detail if needed, so that is not a real defense.</p>\n<p>I think that to be meaningful, a benchmark has to a) like TPC-H, be\nad-hoc, and forbid exploiting prior knowledge and any form of\nintermediate result caching. If we don’t do that, execution times\nconverge towards zero. And b) the benchmark has to include some form of\nupdate stream, as otherwise overly aggressive read-only or read-mostly\nsystems will always outperform systems that offer full transactional\nsupport. And c) the benchmark has to be truly ad-hoc, in the sense that\nthe systems tested have to be older than the benchmark. One way to fight\nGoodhart’s law would be to (automatically) come up with a new benchmark\nfrom time to time, and then measure the systems that existed before the\nbenchmark. The caching/pre-computation problem still remains, of course,\nbut at least that would prevent the over-aggressive adjustment to just\none specific benchmark.</p>\n<p>Interestingly, the machine learning community has struggled with\nexactly the same problem for years, and we should probably borrow some\nof their ideas. Kaggle competitions, for example, rank submissions on a\nhidden test set that participants never see, which makes overfitting on\nthe public data pointless. Similarly, benchmarks like <a href=\"https://livebench.ai/\" rel=\"nofollow ugc noopener\">LiveBench</a> regularly release new\nquestions to make sure that models cannot have seen them during\ntraining. For database benchmarking that could mean keeping the actual\nbenchmark queries secret and only publishing a representative sample for\ndevelopment, or, even better, generating a fresh workload for every\nevaluation round. SQLStorm already uses generated queries, so producing\na new query set from time to time would be fairly easy. We would\nprobably want a more generic approach (higher variety in schemas, update\nstreams, transactions, etc.), but that seems to be a direction that\nwould help keep benchmarks meaningful.</p>\n<hr />\n<p><em>Originally published at <a href=\"https://databasearchitects.blogspot.com/2026/10/the-benchmarking-crisis.html\" rel=\"nofollow ugc noopener\">Database Architects</a>.</em></p>","headings":[]}}