Re: Reduce build times of pg_trgm GIN indexes

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>, Heikki Linnakangas <hlinnaka@iki.fi>
Cc: David Geier <geidav.pg@gmail.com>, Matthias van de Meent <boekewurm+postgres@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2026-04-13T09:41:02Z
Lists: pgsql-hackers
On 09.04.26 13:28, Bertrand Drouvot wrote:
> Hi,
> 
> On Tue, Apr 07, 2026 at 02:27:40PM +0300, Heikki Linnakangas wrote:
>> On 03/03/2026 19:31, David Geier wrote:
>>>> Attached are the patches rebased on latest master.
>>>>
>>>> I've removed the ASCII fast-path patch 0006 as it turned out to be more
>>>> complicated to make work than expected.
>>>>
>>>> I kept the radix sort patch because it gives a decent speedup but I
>>>> would like to focus for now on getting patches 0001 - 0004 merged.
>>>> They're all simple and, the way I see it, uncontroversial.
>>>>
>>>> I remeasured the savings of 0001 - 0004, which comes on top of the
>>>> already committed patch that inlined the comparison function, which gave
>>>> another ~5%:
>>>>
>>>> Data set            | Patched (ms) | Master (ms)  | Speedup
>>>> --------------------|--------------|--------------|----------
>>>> movies(plot)        |   8,058      |  10,311      | 1.27x
>>>> lineitem(l_comment) | 223,233      | 256,986      | 1.19x
>>>>
>>>> I've also registered the change at the commit fest, see
>>>> https://commitfest.postgresql.org/patch/6418/.
>>>
>>> Attached is v5 that removes an incorrect assertion from the radix sort code.
>>>
>>> v5-0001-Optimize-sort-and-deduplication-in-ginExtractEntr.patch
>>> v5-0002-Optimize-generate_trgm-with-sort_template.h.patch
>>> v5-0003-Make-btint4cmp-branchless.patch
>>> v5-0004-Faster-qunique-comparator-in-generate_trgm.patch
>>> v5-0005-Optimize-generate_trgm-with-radix-sort.patch
>>
>> Pushed 0001 as commit 6f5ad00ab7.
> 
> This commit makes use of StaticAssertStmt() that has been deprecated in
> d50c86e74375. The attached, fixes it.

I think the position of the static assertion is correct, because it 
refers to the palloc0_array() that follows.  Maybe the comment could be 
a bit clearer, like "using palloc0_array requires GIN_CAT_NORM_KEY==0"?




Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Change PointerGetDatum() back to a macro

  2. Replace deprecated StaticAssertStmt() with StaticAssertDecl()

  3. Optimize sorting and deduplicating trigrams

  4. Optimize sort and deduplication in ginExtractEntries()

  5. Inline ginCompareAttEntries for speed