Re: [HACKERS] [WIP] Effective storage of duplicates in B-tree index.
Anastasia Lubennikova <a.lubennikova@postgrespro.ru>
Attachments
- v12-0001-Add-deduplication-to-nbtree.patch (text/x-patch) patch v12-0001
09.09.2019 22:54, Peter Geoghegan wrote: > > Attached is v11, which makes the kill_prior_tuple optimization work > with posting list tuples. The only catch is that it can only work when > all "logical tuples" within a posting list are known-dead, since of > course there is only one LP_DEAD bit available for each posting list. > > The hardest part of this kill_prior_tuple work was writing the new > _bt_killitems() code, which I'm still not 100% happy with. Still, it > seems to work well -- new pageinspect LP_DEAD status info was added to > the second patch to verify that we're setting LP_DEAD bits as needed > for posting list tuples. I also had to add a new nbtree-specific, > posting-list-aware version of index_compute_xid_horizon_for_tuples() > -- _bt_compute_xid_horizon_for_tuples(). Finally, it was necessary to > avoid splitting a posting list with the LP_DEAD bit set. I took a > naive approach to avoiding that problem, adding code to > _bt_findinsertloc() to prevent it. Posting list splits are generally > assumed to be rare, so the fact that this is slightly inefficient > should be fine IMV. > > I also refactored deduplication itself in anticipation of making the > WAL logging more efficient, and incremental. So, the structure of the > code within _bt_dedup_one_page() was simplified, without really > changing it very much (I think). I also fixed a bug in > _bt_dedup_one_page(). The check for dead items was broken in previous > versions, because the loop examined the high key tuple in every > iteration. > > Making _bt_dedup_one_page() more efficient and incremental is still > the most important open item for the patch. Hi, thank you for the fixes and improvements. I reviewed them and everything looks good except the idea of not splitting dead posting tuples. According to comments to scan->ignore_killed_tuples in genam.c:107, it may lead to incorrect tuple order on a replica. I don't sure, if it leads to any real problem, though, or it will be resolved by subsequent visibility checks. Anyway, it's worth to add more comments in _bt_killitems() explaining why it's safe. Attached is v12, which contains WAL optimizations for posting split and page deduplication. Changes to prior version: * xl_btree_split record doesn't contain posting tuple anymore, instead it keeps 'in_posting offset' and repeats the logic of _bt_insertonpg() as you proposed upthread. * I introduced new xlog record XLOG_BTREE_DEDUP_PAGE, which contains info about groups of tuples deduplicated into posting tuples. In principle, it is possible to fit it into some existing record, but I preferred to keep things clear. I haven't measured how these changes affect WAL size yet. Do you have any suggestions on how to automate testing of new WAL records? Is there any suitable place in regression tests? * I also noticed that _bt_dedup_one_page() can be optimized to return early when none tuples were deduplicated. I wonder if we can introduce inner statistic to tune deduplication? That is returning to the idea of BT_COMPRESS_THRESHOLD, which can help to avoid extra work for pages that have very few duplicates or pages that are already full of posting lists. To be honest, I don't believe that incremental deduplication can really improve something, because no matter how many items were compressed we still rewrite all items from the original page to the new one, so, why not do our best. What do we save by this incremental approach? -- Anastasia Lubennikova Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
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