Re: Bug in nbtree optimization to skip > operator comparisons (or < comparisons in backwards scans)
Alexander Korotkov <aekorotkov@gmail.com>
From: Alexander Korotkov <aekorotkov@gmail.com>
To: Peter Geoghegan <pg@bowt.ie>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, Heikki Linnakangas <hlinnaka@iki.fi>,
Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: 2023-12-08T18:46:01Z
Lists: pgsql-hackers
Attachments
- fix_btree_skip_scan_keys_optimization-v1.patch (application/octet-stream) patch v1
On Fri, Dec 8, 2023 at 8:30 PM Alexander Korotkov <aekorotkov@gmail.com> wrote: > On Wed, Dec 6, 2023 at 6:05 AM Alexander Korotkov <aekorotkov@gmail.com> wrote: > > On Wed, Dec 6, 2023 at 3:46 AM Peter Geoghegan <pg@bowt.ie> wrote: > > > On Tue, Dec 5, 2023 at 4:41 PM Peter Geoghegan <pg@bowt.ie> wrote: > > > > "In general, when inequality keys are present, the initial-positioning > > > > code only promises to position before the first possible match, not > > > > exactly at the first match, for a forward scan; or after the last > > > > match for a backward scan." > > > > > > > > My test case mostly just demonstrates how to reproduce the scenario > > > > described by this sentence. > > > > > > I just realized that my test case wasn't quite minimized correctly. It > > > depended on a custom function that was no longer created. > > > > > > Attached is a revised version that uses btint84cmp instead. > > > > Thank you for raising this issue. Preprocessing of btree scan keys is > > normally removing the redundant scan keys. However, redundant scan > > keys aren't removed when they have arguments of different types. > > Please give me a bit of time to figure out how to workaround this. > > I dig into the problem. I think this assumption is wrong in my commit. > > "When the key is required for opposite direction scan, it must be > already satisfied by_bt_first() ..." > > In your example "foo = 90" is satisfied by_bt_first(), but "foo > > 99::int8" is not. I think this could be resolved by introducing a > separate flag exactly distinguishing scan keys used for _bt_first(). > I'm going to post the patch doing this. The draft patch is attached. It requires polishing and proper commenting. But I hope the basic idea is clear. Do you think this is the way forward? ------ Regards, Alexander Korotkov
Commits
-
Fix an oversight in refactoring in 06b10f80ba4.
- b670b93a66fc 17.0 landed
-
Make RangeTblEntry dump order consistent
- b4080fa3dcf6 17.0 cited
-
Improvements and fixes for e0b1ee17dc
- 7e6fb5da41d8 17.0 landed
-
Remove BTScanOpaqueData.firstPage
- 06b10f80ba4d 17.0 landed
-
Optimize nbtree backward scan boundary cases.
- c9c0589fda0e 17.0 cited
-
Skip checking of scan keys required for directional scan in B-tree
- e0b1ee17dc3a 17.0 cited