Re: BRIN indexes vs. SK_SEARCHARRAY (and preprocessing scan keys)
Tomas Vondra <tomas.vondra@enterprisedb.com>
From: Tomas Vondra <tomas.vondra@enterprisedb.com>
To: Heikki Linnakangas <hlinnaka@iki.fi>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-07-02T16:09:12Z
Lists: pgsql-hackers
Attachments
- 0001-Introduce-BRIN_PROCNUM_PREPROCESS-procedure-20230702.patch (text/x-patch) patch 0001
- 0002-Support-SK_SEARCHARRAY-in-BRIN-minmax-20230702.patch (text/x-patch) patch 0002
- 0003-Support-SK_SEARCHARRAY-in-BRIN-minmax-multi-20230702.patch (text/x-patch) patch 0003
- 0004-Support-SK_SEARCHARRAY-in-BRIN-inclusion-20230702.patch (text/x-patch) patch 0004
- 0005-Support-SK_SEARCHARRAY-in-BRIN-bloom-20230702.patch (text/x-patch) patch 0005
Here's an updated version of the patch series. I've polished and pushed the first three patches with cleanup, tests to improve test coverage and so on. I chose not to backpatch those - I planned to do that to make future backpatches simpler, but the changes ended up less disruptive than expected. The remaining patches are just about adding SK_SEARCHARRAY to BRIN. 0001 - adds the optional preprocess procedure, calls it from brinrescan 0002 to 0005 - adds the support to the existing BRIN opclasses The main open question I have is what exactly does it mean that the procedure is optional. In particular, should it be supported to have a BRIN opclass without the "preprocess" procedure but using the other built-in support procedures? For example, imagine you have a custom BRIN opclass in an extension (for a custom data type or something). This does not need to implement any procedures, it can just call the existing built-in ones. Of course, this won't get the "preprocess" procedure automatically. Should we support such opclasses or should we force the extension to be updated by adding a preprocess procedure? I'd say "optional" means we should support (otherwise it'd not really optional). The reason why this matters is that "amsearcharray" is AM-level flag, but the support procedure is defined by the opclass. So the consistent function needs to handle SK_SEARCHARRAY keys both with and without preprocessing. That's mostly what I did for all existing BRIN opclasses (it's a bit confusing that opclass may refer to both the "generic" minmax or the opclass defined for a particular data type). All the opclasses now handle three cases: 1) scalar keys (just like before, with amsearcharray=fase) 2) array keys with preprocessing (sorted array, array of hashes, ...) 3) array keys without preprocessing (for compatibility with old opclasses missing the optional preprocess procedure) The current code is a bit ugly, because it duplicates a bunch of code, because the option (3) mostly does (1) in a loop. I'm confident this can be reduced by refactoring and reusing some of the "shared" code. The question is if my interpretation of what "optional" procedure means is reasonable. Thoughts? The other thing is how to test this "compatibility" code. I assume we want to have the procedure for all built-in opclasses, so that won't exercise it. I did test it by temporarily removing the procedure from a couple pg_amproc.dat entries. I guess creating a custom opclass in the regression test is the right solution. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Improve BRIN minmax-multi opclass test coverage
- 0457109344b4 17.0 landed
-
Introduce bloom_filter_size for BRIN bloom opclass
- 2b8b2852bbc5 17.0 landed
-
Minor cleanups in the BRIN code
- 28d03feac386 17.0 landed
-
Support GiST index support functions that want to cache data across calls.
- d22a09dc70f9 9.2.0 cited