Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w75dY-004wxJ-2s for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 05:58:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w75dX-001Wpq-0O for pgsql-hackers@arkaria.postgresql.org; Mon, 30 Mar 2026 05:58:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w75dW-001Wph-2D for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 05:58:07 +0000 Received: from mail-qt1-x844.google.com ([2607:f8b0:4864:20::844]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w75dV-00000001l0Y-0KO0 for pgsql-hackers@lists.postgresql.org; Mon, 30 Mar 2026 05:58:06 +0000 Received: by mail-qt1-x844.google.com with SMTP id d75a77b69052e-50912a097b0so23474351cf.1 for ; Sun, 29 Mar 2026 22:58:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774850284; cv=none; d=google.com; s=arc-20240605; b=S0mMF4f+S8aCtfQQgRgyNJdFCV4nxmBXboPiOhH4aCsR0kQOuG2ZQbybURrsMqChIk Aw8musexUssPRdxaTl+OAcS5w9NHQwitwghVSBeLDzi9w2354v5Q5qBM0pxS2aHRSVnZ dNsp5hUom4N72hxjwkEGYOj/1P3bVdplQaYgjjvbsMENm6CCieSZDyW6TKoo8NauFYVb TFqcf8qbh1rgWyq5yDlU13r/rHvtEh7+CAc3C1pMG2FEC25t+w1bGZNC2jal5XnS1hgo Nz1Al+Jc4+a+qr0MnNYsEF6Lb9o9AdS+0JnY9h0RRNAKb6g9gtuB4wRGwpPMbADbITIQ BPqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=aFHPPdJ8ihJX6zGlpt3Qt/fftGjtEGDrVQfSbpFHRPk=; fh=RI7mAB9QF74wF8aCup2MYJufWE+8wi9whxLBSyvBNko=; b=cS+8WMfJVYbw1MfhZ5qCtL6uWKB60+FLHzUWkT3BiWuGiXKWri1SUB/d684NeFL8h0 l/5zMs5Ur8KIYODm9h6Y8nMjociGYnAf+XpE/+y2joo23NW9JIgeIE3bV9BY31CHp99J 6oHDRQYm7/hXmteMU2vV9o685ELJHvHTMdPxYKNso9gf0IxzBXn9k7nU9V0TRiB7piHH FLZ4CJVyyVF7LRBMZhAp20z4tfL/KswGNcDV3IOgCp5Aoxved9Umwq6ZgFf8GPEsr1Ls VIumOBXFdJ/e7P3wBSxMT2NHeB4ewPHFNX7DJew4B0T7mQnb4dWNMY4/97aVGYQjgEsP ZeSQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774850284; x=1775455084; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=aFHPPdJ8ihJX6zGlpt3Qt/fftGjtEGDrVQfSbpFHRPk=; b=mvB8l9enRzKu3MzZLZHqkWxuyIddLEh2pXnVXYIpNkGFB6BvJeQastLSHsxouvFcMX KlaOXHi8nEG2SoJA/BFZAlGHwb7BJnMj8K/9kYdZScSmNFhhS/iqwW92llpIsW6CS4+y eDrdyhTKLUDyklEsTRqxPP4a9I0jb9AaGApB9ZnWeHmv3MTvK3v8v3v0Tr5PbpZaS80O mrdcf6evCOMOJhD2dOxpU/vEIveontVrIMbgZ1ZnQpsNqvlcA0cWulMAtTllUFGPx44u L8U1NMrI7lhcoMeueNvlOhky1UWA3/KOISqlQIXPhnKPZjZKt4kL8mZOmIDlMjLNW0Hs xk/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774850284; x=1775455084; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=aFHPPdJ8ihJX6zGlpt3Qt/fftGjtEGDrVQfSbpFHRPk=; b=hBhmVb5hA9AJtnVnM3EBgS3V4g8m9NjNFRs9gtvq8mhAM0iSGCnmsKwvQVQFWqLkGB LpYTEMhnjPIl8tnx9T83gpHEzmXGKnCVTU8r188lP2pBMQX8zf7RTrsR6nF4PKnwqJSi NHUjoPsMU49l7USwYGRs88QB74rsChoS/i+cYHm015gpyji+4lREz7yc+srvfjvr88s3 46NZuXlE/Aq2kB/tDBA+RjFe36uxThHOED2IBiaN4O0IUwIkVCWckrBdUtpBzJ3qi2TB Bxv/TH1cyS7UR+Mq8ywysXL4zwPO2cngqvHhVEHQgFT2hlowBvdrYXWqKOBd5oitb8Lw XuoA== X-Forwarded-Encrypted: i=1; AJvYcCVdGTA15rZH/BVrX8yGedrwXOa9BHXD8J7S1oFegQZM9U49MXQK7GQr32AtzdQXrLjibfCiB1/P/yS8+uFB@lists.postgresql.org X-Gm-Message-State: AOJu0YxL9FJQHXD0uIA7ZuWlXMZdEyEgtUhEltrN/c6RgHDLKghj0v2D GZn6NqgIhTvIuyQ4swhv97zJbng46kT53N7xU1dk2anU7plOyVJ+BftnxAnkPkT3by06lizLyRk b9iQAohzec50kKFg3c0wM/jY4EozCz4+wJ2yAXzmXbQ== X-Gm-Gg: ATEYQzzS2cV8cwf1ZaWEucjDreNOovC5YXeiO08GN8SndfyUidkyefXJU06AeooXJPa oR31u7yk31qV1xBDA7Qheay8S/EyjascMq621PeYPUYbRvFTM8K+2+3VrO3LxXy98pJHFyutkCf LvtCdTEXbey70q4zXOBqtB3Lt4syeGpNm/HWC97YbkGBqUfi9HEm/GZrEeZzlGzKhdhyg0WkBEK t3Pr1nQv9tFjURgOJmShApoGiYMhK2KgEV8m25w3NWE5Rooj12UeD1dblJeC8PbjXQyEl9qLHtF JNd/qAJzdwXYfmcJMyzzq7pYlWVm1e0x0yE9M+E4H8JhsB0dPPKpsM2bW3r4mOd9YeHYuCdvAIe ERJiUNjbu3x5JPFqK7p1xHb2yHgI= X-Received: by 2002:a05:622a:212:b0:50b:2a1e:a441 with SMTP id d75a77b69052e-50ba399a5e7mr149140771cf.66.1774850284136; Sun, 29 Mar 2026 22:58:04 -0700 (PDT) MIME-Version: 1.0 References: <269A8FB9-6D43-43CF-A6FE-52D28CBDB8A9@Outlook.com> <606C775A-4C1A-482B-BE7D-2E7A46AE14B9@gmail.com> <9D3D4647-868B-4562-B382-D201478AD67B@gmail.com> <54659731-2232-4E74-9533-D136D01B153F@gmail.com> In-Reply-To: From: John Naylor Date: Mon, 30 Mar 2026 12:57:52 +0700 X-Gm-Features: AQROBzCDZ4PZTKOPzEHLCP0ZSun-N939gwu-bi6gL89v3vY9ZE8Exg8O_JEwtCQ Message-ID: Subject: Re: tuple radix sort To: cca5507 Cc: zengman , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000b74ddf064e37883e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b74ddf064e37883e Content-Type: text/plain; charset="UTF-8" I wrote: > Next step : Test whether it's worth it for the common prefix detection > to use the normalized datum. This turned out to be a loser, but in the course of trying it a better idea occurred to me. v8's prefix detection was really a special-case optimization where the sort key is all non-negative integers (or all negative, but that's not common). It's wasted work when the input is mixed in sign, and for abbreviated keys. It's not much of a waste, but we can do better. v9 computes the common prefix during every recursion at the same time we populate the SortTuple's current byte. That should be practically free given a modest amount of instruction-level parallelism. As a demo, I slightly modified the "p5" test (an adversarial case for radix sort) from https://www.postgresql.org/message-id/CANWCAZb0STJRAnn8fcVccQmektizNkgqBD_cg%2B0cs1%3Db4WWajQ%40mail.gmail.com ...so that all bytes differ only in the least significant byte or in the sign bit. select setseed(0.935349); with r (rand, i) as (select random(-100, 100), i from generate_series(1,1_000_000,1) i ) insert into tsort select case when r.rand < -95 or r.rand > 95 then r.rand else 0 end from r; vacuum freeze tsort ; cat bench.sql select * from tsort order by i offset 100000000; pgbench -n -t 500 -f bench.sql | grep latency (on pre-warmed buffers with work_mem 64MB) master: latency average = 99.663 ms v8: latency average = 102.040 ms v9: latency average = 84.856 ms Here we can see that common prefix detection is useless in v8. It adds work, but it's not worse than noise in this benchmark, so could be disregarded. In v9 we proceed directly to performing a radix sort pass on the most significant byte, which effectively partitions into signed and unsigned. The next recursion step detects that all bytes are the same and simultaneously calculates how far to skip so that the next recursion is productive. For the case of all non-negative integers: select setseed(0.935349); insert into tsort select random(0, 100) from generate_series(1,1_000_000,1) i; vacuum freeze tsort ; ...in v9 the first pass computes the current byte from the normalized datum and stores it, but this pass is unproductive. There was a risk that this is more expensive than v8's up-front common prefix detection because of memory writes. I only see noise-level differences: master: latency average = 98.725 ms v8: latency average = 75.572 ms v9: latency average = 76.635 ms I intend to commit v9-0001 this week. I've decided not to commit v8-0003 (message changes) from my last message since it doesn't really add any value IMO. That can always be revisited. I'm on the fence about v8-0004 (assert the correct order also for qsort), but it seems good for consistency. I'd like to at least continue asserting this for radix sort since it's new this cycle. To save CI cycles etc, maybe we can eventually hide the check behind a debug symbol. -- John Naylor Amazon Web Services --000000000000b74ddf064e37883e Content-Type: text/x-patch; charset="US-ASCII"; name="v9-0001-Detect-common-prefixes-during-radix-sort.patch" Content-Disposition: attachment; filename="v9-0001-Detect-common-prefixes-during-radix-sort.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mncreb760 RnJvbSA2ZTk0YjBhMjYwYmM4MTI0ODM3NWM3ZDQ1NTY4YTUyZjE3Mjc0YmY5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IE1vbiwgMzAgTWFyIDIwMjYgMTI6MjY6NTggKzA3MDAKU3ViamVjdDogW1BBVENI IHY5XSBEZXRlY3QgY29tbW9uIHByZWZpeGVzIGR1cmluZyByYWRpeCBzb3J0CgpEdXJpbmcgdGhl IGNvdW50aW5nIHN0ZXAsIGtlZXAgdHJhY2sgb2YgdGhlIGJpdHMgdGhhdCBhcmUgdGhlIHNhbWUK Zm9yIHRoZSBlbnRpcmUgaW5wdXQuICBJZiB3ZSBjb3VudGVkIG9ubHkgYSBzaW5nbGUgZGlzdGlu Y3QgYnl0ZSwKdGhlIG5leHQgcmVjdXJzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgYnl0ZSBw b3NpdGlvbiB0aGF0IGhhcwptb3JlIHRoYW4gb25lIGRpc3RpbmN0IGJ5dGUgaW4gdGhlIGlucHV0 LiBUaGlzIGFsbG93cyB1cyB0byBza2lwIG92ZXIKbXVsdGlwbGUgcGFzc2VzIHdoZXJlIHRoZSBi eXRlIGlzIHRoZSBzYW1lIGZvciB0aGUgZW50aXJlIGlucHV0LgoKVGhpcyBwcm92aWRlcyBhIHNp Z25pZmljYW50IHNwZWVkdXAgZm9yIGludGVnZXJzIHRoYXQgaGF2ZSBzb21lIHVwcGVyCmJ5dGVz IHdpdGggYWxsLXplcm9zIG9yIGFsbC1vbmVzLCB3aGljaCBpcyBjb21tb24uCgpSZXZpZXdlZC1i eTogQ2hlbmdwZW5nIFlhbiA8Y2hlbmdwZW5nX3lhbkBvdXRsb29rLmNvbT4KRGlzY3Vzc2lvbjog aHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQU5XQ0FaWXBHTURTU3dBYTE4Zk94SkdYYVB6VmR5UHNXcE9r ZkNYMzJEV2gzUXpuendAbWFpbC5nbWFpbC5jb20KLS0tCiBzcmMvYmFja2VuZC91dGlscy9zb3J0 L3R1cGxlc29ydC5jIHwgNDQgKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUg Y2hhbmdlZCwgNDAgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvc29y dC90dXBsZXNvcnQuYwppbmRleCAxZmM0NDBlYTZjYS4uNzJjMmMyOTk1ZDggMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvc29ydC90dXBsZXNvcnQuYwpAQCAtMTA0LDYgKzEwNCw3IEBACiAjaW5jbHVkZSAiY29tbWFu ZHMvdGFibGVzcGFjZS5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgInBnX3Ry YWNlLmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgogI2luY2x1ZGUgInN0b3JhZ2Uv c2htZW0uaCIKICNpbmNsdWRlICJ1dGlscy9ndWMuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGls cy5oIgpAQCAtMjY1OSwxNyArMjY2MCwyNSBAQCByYWRpeF9zb3J0X3JlY3Vyc2l2ZShTb3J0VHVw bGUgKmJlZ2luLCBzaXplX3Qgbl9lbGVtcywgaW50IGxldmVsLCBUdXBsZXNvcnRzdGF0ZQogCWlu dAkJCW51bV9wYXJ0aXRpb25zID0gMDsKIAlpbnQJCQludW1fcmVtYWluaW5nOwogCVNvcnRTdXBw b3J0IHNzdXAgPSAmc3RhdGUtPmJhc2Uuc29ydEtleXNbMF07CisJRGF0dW0JCXJlZl9kYXR1bTsK KwlEYXR1bQkJY29tbW9uX3VwcGVyX2JpdHMgPSAwOwogCXNpemVfdAkJc3RhcnRfb2Zmc2V0ID0g MDsKIAlTb3J0VHVwbGUgICpwYXJ0aXRpb25fYmVnaW4gPSBiZWdpbjsKKwlpbnQJCQluZXh0X2xl dmVsOwogCiAJLyogY291bnQgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGVhY2ggYnl0ZSAqLwor CXJlZl9kYXR1bSA9IG5vcm1hbGl6ZV9kYXR1bShiZWdpblswXS5kYXR1bTEsIHNzdXApOwogCWZv ciAoU29ydFR1cGxlICpzdCA9IGJlZ2luOyBzdCA8IGJlZ2luICsgbl9lbGVtczsgc3QrKykKIAl7 CisJCURhdHVtCQl0aGlzX2RhdHVtOwogCQl1aW50OAkJdGhpc19wYXJ0aXRpb247CiAKKwkJdGhp c19kYXR1bSA9IG5vcm1hbGl6ZV9kYXR1bShzdC0+ZGF0dW0xLCBzc3VwKTsKKwkJLyogYWNjdW11 bGF0ZSBiaXRzIGRpZmZlcmVudCBmcm9tIHRoZSByZWZlcmVuY2UgZGF0dW0gKi8KKwkJY29tbW9u X3VwcGVyX2JpdHMgfD0gcmVmX2RhdHVtIF4gdGhpc19kYXR1bTsKKwogCQkvKiBleHRyYWN0IHRo ZSBieXRlIGZvciB0aGlzIGxldmVsIGZyb20gdGhlIG5vcm1hbGl6ZWQgZGF0dW0gKi8KLQkJdGhp c19wYXJ0aXRpb24gPSBjdXJyZW50X2J5dGUobm9ybWFsaXplX2RhdHVtKHN0LT5kYXR1bTEsIHNz dXApLAotCQkJCQkJCQkJICBsZXZlbCk7CisJCXRoaXNfcGFydGl0aW9uID0gY3VycmVudF9ieXRl KHRoaXNfZGF0dW0sIGxldmVsKTsKIAogCQkvKiBzYXZlIGl0IGZvciB0aGUgcGVybXV0YXRpb24g c3RlcCAqLwogCQlzdC0+Y3VyYnl0ZSA9IHRoaXNfcGFydGl0aW9uOwpAQCAtMjc0Nyw2ICsyNzU2 LDMzIEBAIHJhZGl4X3NvcnRfcmVjdXJzaXZlKFNvcnRUdXBsZSAqYmVnaW4sIHNpemVfdCBuX2Vs ZW1zLCBpbnQgbGV2ZWwsIFR1cGxlc29ydHN0YXRlCiAJfQogCiAJLyogcmVjdXJzZSAqLworCisJ aWYgKG51bV9wYXJ0aXRpb25zID09IDEpCisJeworCQkvKgorCQkgKiBUaGVyZSBpcyBvbmx5IG9u ZSBkaXN0aW5jdCBieXRlIGF0IHRoZSBjdXJyZW50IGxldmVsLiBJdCBjYW4gaGFwcGVuCisJCSAq IHRoYXQgc29tZSBzdWJzZXF1ZW50IGJ5dGVzIGFyZSBhbHNvIHRoZSBzYW1lIGZvciBhbGwgaW5w dXQgdmFsdWVzLAorCQkgKiBzdWNoIGFzIHRoZSB1cHBlciBieXRlcyBvZiBzbWFsbCBpbnRlZ2Vy cy4gVG8gc2tpcCB1bnByb2R1Y3RpdmUKKwkJICogcGFzc2VzIGZvciB0aGF0IGNhc2UsIHdlIGNv bXB1dGUgdGhlIGxldmVsIHdoZXJlIHRoZSBpbnB1dCBoYXMgbW9yZQorCQkgKiB0aGFuIG9uZSBk aXN0aW5jdCBieXRlLCBzbyB0aGF0IHRoZSBuZXh0IHJlY3Vyc2lvbiBjYW4gc3RhcnQgdGhlcmUu CisJCSAqLworCQlpZiAoY29tbW9uX3VwcGVyX2JpdHMgPT0gMCkKKwkJCW5leHRfbGV2ZWwgPSBz aXplb2YoRGF0dW0pOworCQllbHNlCisJCXsKKwkJCWludAkJCWRpZmZwb3M7CisKKwkJCS8qCisJ CQkgKiBUaGUgdXBwZXIgYml0cyBvZiBjb21tb25fdXBwZXJfYml0cyBhcmUgemVybyB3aGVyZSBh bGwgZGF0dW1zCisJCQkgKiBoYXZlIHRoZSBzYW1lIGJpdHMuCisJCQkgKi8KKwkJCWRpZmZwb3Mg PSBwZ19sZWZ0bW9zdF9vbmVfcG9zNjQoRGF0dW1HZXRVSW50NjQoY29tbW9uX3VwcGVyX2JpdHMp KTsKKwkJCW5leHRfbGV2ZWwgPSBzaXplb2YoRGF0dW0pIC0gMSAtIChkaWZmcG9zIC8gQklUU19Q RVJfQllURSk7CisJCX0KKwl9CisJZWxzZQorCQluZXh0X2xldmVsID0gbGV2ZWwgKyAxOworCiAJ Zm9yICh1aW50OCAqcnAgPSByZW1haW5pbmdfcGFydGl0aW9uczsKIAkJIHJwIDwgcmVtYWluaW5n X3BhcnRpdGlvbnMgKyBudW1fcGFydGl0aW9uczsKIAkJIHJwKyspCkBAIC0yNzU3LDcgKzI3OTMs NyBAQCByYWRpeF9zb3J0X3JlY3Vyc2l2ZShTb3J0VHVwbGUgKmJlZ2luLCBzaXplX3Qgbl9lbGVt cywgaW50IGxldmVsLCBUdXBsZXNvcnRzdGF0ZQogCiAJCWlmIChudW1fZWxlbWVudHMgPiAxKQog CQl7Ci0JCQlpZiAobGV2ZWwgPCBzaXplb2YoRGF0dW0pIC0gMSkKKwkJCWlmIChuZXh0X2xldmVs IDwgc2l6ZW9mKERhdHVtKSkKIAkJCXsKIAkJCQlpZiAobnVtX2VsZW1lbnRzIDwgUVNPUlRfVEhS RVNIT0xEKQogCQkJCXsKQEAgLTI3NzAsNyArMjgwNiw3IEBAIHJhZGl4X3NvcnRfcmVjdXJzaXZl KFNvcnRUdXBsZSAqYmVnaW4sIHNpemVfdCBuX2VsZW1zLCBpbnQgbGV2ZWwsIFR1cGxlc29ydHN0 YXRlCiAJCQkJewogCQkJCQlyYWRpeF9zb3J0X3JlY3Vyc2l2ZShwYXJ0aXRpb25fYmVnaW4sCiAJ CQkJCQkJCQkJIG51bV9lbGVtZW50cywKLQkJCQkJCQkJCQkgbGV2ZWwgKyAxLAorCQkJCQkJCQkJ CSBuZXh0X2xldmVsLAogCQkJCQkJCQkJCSBzdGF0ZSk7CiAJCQkJfQogCQkJfQotLSAKMi41My4w Cgo= --000000000000b74ddf064e37883e--