Re: [PROPOSAL] Effective storage of duplicates in B-tree index.
Peter Geoghegan <pg@heroku.com>
On Thu, Sep 3, 2015 at 8:35 AM, Anastasia Lubennikova <a.lubennikova@postgrespro.ru> wrote: >> * Since everything is aligned within B-Tree, it's probably worth >> considering the alignment boundaries when doing prefix compression, if >> you want to go that way. We can probably imagine a world where >> alignment is not required for B-Tree, which would work on x86 >> machines, but I can't see it happening soon. It isn't worth >> compressing unless it compresses enough to cross an "alignment >> boundary", where we're not actually obliged to store as much data on >> disk. This point may be obvious, not sure. > > That is another reason, why I doubt prefix compression, whereas effective > duplicate storage hasn't this problem. Okay. That sounds reasonable. I think duplicate handling is a good project. A good learning tool for Postgres B-Trees -- or at least one of the better ones -- is my amcheck tool. See: https://github.com/petergeoghegan/postgres/tree/amcheck This is a tool for verifying B-Tree invariants hold, which is loosely based on pageinspect. It checks that certain conditions hold for B-Trees. A simple example is that all items on each page be in the correct, logical order. Some invariants checked are far more complicated, though, and span multiple pages or multiple levels. See the source code for exact details. This tool works well when running the regression tests (see stress.sql -- I used it with pgbench), with no problems reported last I checked. It often only needs light locks on relations, and single shared locks on buffers. (Buffers are copied to local memory for the tool to operate on, much like contrib/pageinspect). While I have yet to formally submit amcheck to a CF (I once asked for input on the goals for the project on -hackers), the comments are fairly comprehensive, and it wouldn't be too hard to adopt this to guide your work on duplicate handling. Maybe it'll happen for 9.6. Feedback appreciated. The tool calls _bt_compare() for many things currently, but doesn't care about many lower level details, which is (very roughly speaking) the level that duplicate handling will work at. You aren't actually proposing to change anything about the fundamental structure that B-Tree indexes have, so the tool could be quite useful and low-effort for debugging your code during development. Debugging this stuff is sometimes like keyhole surgery. If you could just see at/get to the structure that you care about, it would be 10 times easier. Hopefully this tool makes it easier to identify problems. -- Peter Geoghegan
Commits
-
Teach pageinspect about nbtree deduplication.
- 93ee38eade1b 13.0 landed
-
Doc: Fix deduplicate_items index term.
- e537aed61db7 13.0 landed
-
Revise BTP_HAS_GARBAGE nbtree VACUUM comments.
- 4b25f5d0ba01 13.0 cited
-
Remove unneeded "pin scan" nbtree VACUUM code.
- 9f83468b3536 13.0 landed
-
Cleanup code in reloptions.h regarding reloption handling
- 50d22de9325f 13.0 cited
-
Catch invalid typlens in a couple of places
- 8557a6f10ca6 13.0 cited
-
Compute XID horizon for page level index vacuum on primary.
- 558a9165e081 12.0 cited
-
Make heap TID a tiebreaker nbtree index column.
- dd299df8189b 12.0 cited
-
Avoid pin scan for replay of XLOG_BTREE_VACUUM in all cases
- 3e4b7d87988f 9.6.0 cited
-
Revert buggy optimization of index scans
- c7111d11b188 9.6.0 cited
-
Restructure index access method API to hide most of it at the C level.
- 65c5fcd353a8 9.6.0 cited
-
Reduce pinning and buffer content locking for btree scans.
- 2ed5b87f96d4 9.5.0 cited
-
Avoid scanning nulls at the beginning of a btree index scan.
- 1a77f8b63d15 9.2.0 cited