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.94.2) (envelope-from ) id 1vE1V3-003Lhe-BQ for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Oct 2025 08:25:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vE1V2-00GwMy-6b for pgsql-hackers@arkaria.postgresql.org; Wed, 29 Oct 2025 08:25:43 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vE1V1-00GwMq-SJ for pgsql-hackers@lists.postgresql.org; Wed, 29 Oct 2025 08:25:42 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vE1Uy-004qPH-1V for pgsql-hackers@lists.postgresql.org; Wed, 29 Oct 2025 08:25:42 +0000 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-29488933a91so70017275ad.2 for ; Wed, 29 Oct 2025 01:25:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761726339; x=1762331139; darn=lists.postgresql.org; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=wkp7St4QFAOCHofibiYFow+WTcxKkh4dWuI5IQ/hXMA=; b=RNdZjQzrxQawhaNsskUKmGv/07yPHq0Dmyf0cVQiNHsOhRshp53GW4tj1D4DC5AVgJ yRQLZssjgEqksG0+vBq4xrNJqj7NWZe0dbQUV/7kFrTbf2Adx5Epx/5m4JFyHvweerJv hPU39Z0muCDQBdQ3/K6b/YJS4Joa3DKo0vgPmYct+T9Rx3AYyKt5NLnVectU9skNXmM7 ADjLe7H45JdYfIdfxbILMbYyK73aHrsLGbbJn62u+thti34FOh2CAdg1LFPw/Xt7rZT+ jwzJIfr6S8kYU2BMtv9E5PXiSGOBmGMiiRb846WTaqAeiPH99QUr4f+llQ03HJTHN2f/ X1UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761726339; x=1762331139; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wkp7St4QFAOCHofibiYFow+WTcxKkh4dWuI5IQ/hXMA=; b=bMVyZt2HPlSycFX6QyT2UnZ5DKf76SrfR6X5UII5Pt+0HxD8+FEms3NxtF1GurkEJo zZOEu8P+MYln7DMBcPsw2RWW1UJ0xx7fHPsj0uXPQ9qr3cQdnjvE+WddlekBrP9xyRum yhmgXvA/9S6pvFlaXR7DVs8/snptCqebjYSqbkhJkW9QiDKybGy4yfOWxoy6W4YLR1hL CfuZjCogjZ21XWIWcpyt7CwZYq6fpZ8HBHfaPBR/WxdlWLQtWyLbB5Ucm3H6c4svj8N5 fnQ20lQgfrWpyuVYmBfh5olMthXMl8yIGS480lAWQ4iZpHE2m2Ou2X1zMu3hmGIyd8Y7 tNLA== X-Gm-Message-State: AOJu0YyrXWmIET++g4gS8AoOThYApO3bvJ8GGF/0IhLhVKutAPZZayON wJdEGcDSAPm4yKYsoholkr5ZJC3qkZVvivYA7tog0PcWcgSpApCmNIQB X-Gm-Gg: ASbGncvH6cteaXNkx6W9FeI8un7JHTyDQQL5pUPVoc9xLECo7pKCbWHgX7gRErMw8oQ 77WcYsxc/+fL8kcxpB2xUNlcBjVJ1ex8O/W0SmIokT85LUL8JMlh1fDjEzOpIsehDpiFMLUUXQV Vm/kejwgRoIK6YpR8KVosDD5Zlv9AHEt2p5/tVrMc+4xjVCBwSWi3znF/BMofDzdAzEd0fEE8v+ mcpjtKzOMpvEaaSakovt5tD6HpGSAHCAK47fz8iIb2tpfCTuA8Q3X4tJnCSdPxAN+apt5Qx4G6G UjvL+94dzQRn3k9LjCumepSV+LiHRma+fXN7dBGK9hgDaVCqL5DDppQtqZ7wRLsm9dft5MLI8ND G+CQCBEf5Ve7O3PpbgNmhtiVT8jG4EHFBKT6xIyTrfRTau2mGFrGPQ/z3AhBL4Plg1eqhiX2opM gXG72v50c2ow== X-Google-Smtp-Source: AGHT+IE7rulZYMKDQ1BPb0hrxqm+OYNXIbaHYUwqQi6d8JRi3zMUhW//gOtSJZfLpChPzpANwdh8zw== X-Received: by 2002:a17:903:41c6:b0:28a:8ae7:4034 with SMTP id d9443c01a7336-294dee2281dmr21343095ad.25.1761726338451; Wed, 29 Oct 2025 01:25:38 -0700 (PDT) Received: from smtpclient.apple ([196.247.24.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29498d39048sm142520335ad.66.2025.10.29.01.25.36 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Oct 2025 01:25:37 -0700 (PDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.700.81\)) Subject: Re: tuple radix sort From: Chao Li In-Reply-To: Date: Wed, 29 Oct 2025 16:25:03 +0800 Cc: PostgreSQL Hackers , Peter Geoghegan Content-Transfer-Encoding: quoted-printable Message-Id: References: To: John Naylor X-Mailer: Apple Mail (2.3826.700.81) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk > On Oct 29, 2025, at 14:28, John Naylor = wrote: >=20 > I suspect the challenge > will be multikey sorts when the first key has low cardinality. As you predicted, when the first key has very low cardinality, radix is = a little bit slower. I built a test that proves that: ``` evantest=3D# drop table if exists test_multi; evantest=3D# create unlogged table test_multi (category int, name text); =E2=80=94 first column has only 4 distinct values evantest=3D# insert into test_multi select (random() * 4)::int as = category, md5(random()::text) || md5(random()::text) as name from = generate_series(1, 1000000); evantest=3D# vacuum freeze test_multi; evantest=3D# select count(*) from test_multi; evantest=3D# set work_mem =3D '64MB=E2=80=99; evantest-# \timing on Timing is on. evantest=3D# set wip_radix_sort =3D 'off'; Time: 0.403 ms evantest=3D# \o /dev/null evantest=3D# select * from test_multi order by category, name; Time: 5607.336 ms (00:05.607) evantest=3D# select * from test_multi order by category, name; Time: 5703.555 ms (00:05.704) evantest=3D# select * from test_multi order by category, name; Time: 5692.644 ms (00:05.693) evantest=3D# set wip_radix_sort =3D 'on'; Time: 0.859 ms evantest=3D# select * from test_multi order by category, name; Time: 5822.979 ms (00:05.823) evantest=3D# select * from test_multi order by category, name; Time: 5881.256 ms (00:05.881) evantest=3D# select * from test_multi order by category, name; Time: 5976.351 ms (00:05.976) ``` Roughly 5% slower for this corner case. However, when I recreate the test table with high cardinality first = column, wip_radix_sort seems still slower: ``` evantest=3D# \o evantest=3D# drop table if exists test_multi; DROP TABLE evantest=3D# create unlogged table test_multi (category int, name text); CREATE TABLE evantest=3D# insert into test_multi evantest-# select (random() * 1000000)::int as category, = md5(random()::text) || md5(random()::text) as name from = generate_series(1, 1000000); INSERT 0 1000000 evantest=3D# vacuum freeze test_multi; VACUUM evantest=3D# select count(*) from test_multi; count --------- 1000000 (1 row) evantest=3D# select * from test_multi limit 5; category | name = ----------+---------------------------------------------------------------= --- 607050 | = c555126a5afea9f5ffe3880248c89944d211bc378f8c3b6d125b4360fe8619b7 843579 | = 69b5a1dba76f52ff238566a3f88315a7425116d5d271fb54701b6e49d4afd8ce 106298 | = a96e8674db219e12463ecdbb405b99c631767972e489093045c97976c17c6561 621860 | = 5e6739ea9f533f9cdb0b8db76e3d4ce63be6b2b612c8aff06c4b80451f8f2edc 290110 | = 56944320e5abd3a854fffdd185b969727e8d414448d440725a392cda4c6355c4 (5 rows) evantest=3D# \timing on Timing is on. evantest=3D# \o /dev/null evantest=3D# set wip_radix_sort =3D 'off'; Time: 0.904 ms evantest=3D# select * from test_multi limit 5; Time: 0.983 ms evantest=3D# select * from test_multi order by category, name; Time: 593.578 ms evantest=3D# select * from test_multi order by category, name; Time: 597.329 ms evantest=3D# select * from test_multi order by category, name; Time: 600.050 ms evantest=3D# set wip_radix_sort =3D 'on'; Time: 0.737 ms evantest=3D# select * from test_multi order by category, name; Time: 611.604 ms evantest=3D# select * from test_multi order by category, name; Time: 613.115 ms evantest=3D# select * from test_multi order by category, name; Time: 615.003 ms ``` This seems like a real regression. Then I tried to only sort on the first column, yes, now radix is faster: ``` evantest=3D# set wip_radix_sort =3D 'off=E2=80=99; evantest=3D# select * from test_multi order by category; Time: 445.498 ms evantest=3D# select * from test_multi order by category; Time: 451.834 ms evantest=3D# select * from test_multi order by category; Time: 454.531 ms evantest=3D# set wip_radix_sort =3D 'on'; Time: 0.329 ms evantest=3D# select * from test_multi order by category; Time: 402.829 ms evantest=3D# select * from test_multi order by category; Time: 408.014 ms evantest=3D# select * from test_multi order by category; Time: 415.340 ms evantest=3D# select * from test_multi order by category; Time: 413.969 ms ``` Hope the test helps. (The test was run a MacBook M4. ) Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/