Re: [PATCH] Add support for SAOP in the optimizer for partial index paths
David Rowley <dgrowleyml@gmail.com>
From: David Rowley <dgrowleyml@gmail.com>
To: Jim Vanns <james.vanns@gmail.com>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2026-01-12T00:54:00Z
Lists: pgsql-hackers
On Sun, 11 Jan 2026 at 06:03, Jim Vanns <james.vanns@gmail.com> wrote: > Before I continue with the other suggestions of consolidating the test > and benchmarking, I've made the code change you suggested and used a > bitmap for recording positions in the list of candidate indexes. Can > you check and make sure I'm on the right track? Just a quick look; 1. There doesn't seem to be any consideration that there may be many partial indexes which are suitable for the SAOP element: drop table if exists t; create table t (a int); insert into t select x/1000 from generate_series(1,1000000)x; create index t_eq_1 on t (a) where a = 1; create index t_eq_2 on t (a) where a = 2; create index t_eq_3 on t (a) where a = 3; create index t_le_2 on t (a) where a <= 2; explain select * from t where a in(1,2,3); -- Uses t_le_2 twice rather than the other two more suitable indexes. drop index t_le_2; explain select * from t where a in(1,2,3); -- What I'd expect the above query to produce. See: compare_path_costs_fuzzily() 2. Is there any point in trying the index again when this condition is true: if (!clauseset.nonempty). Since you'll be looking for the same column for the next element, shouldn't you do bms_del_member() on that index? Then put an "if (bms_is_empty(suitable_indexes)) break;" before the while loop so that you don't needlessly process the entire SAOP array when you run out of suitable indexes. 3. Styistically, instead of using int index_pos, you can use foreach_current_index(idx_lc). 4. I think the following code puts too much faith into there only being 1 path produced. From a quick skim of the current code in build_index_paths(), because you're requesting ST_BITMAPSCAN, we don't seem to ever produce more than 1 path, but if that changed, then your code would make the list contain too many paths. per_saop_paths = list_concat(per_saop_paths, indexpaths); 5. Minor detail, but there's a bit of inconsistency in how you're checking for empty Lists. The preferred way is: list != NIL. 6. Are you sure you want to use predOK == true indexes? Do you have a case where this new code can produce a better plan than if the predOK index was used directly by the existing Path generation code? If so, please provide examples. David
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix tuple deforming with virtual generated columns
- 89eafad297a9 19 (unreleased) cited
-
psql: Show comments in \dRp+, \dRs+, and \dX+ psql meta-commands.
- aecc558666ad 19 (unreleased) cited
-
instrumentation: Keep time fields as instrtime, convert in callers
- e5a5e0a90750 19 (unreleased) cited
-
Fix setting next multixid's offset at offset wraparound
- 4d936c3fff1a 19 (unreleased) cited