Thank you for the patch and benchmark results, I have a couple remarks.
Firstly, padding in DeadTuplesSegment

typedef struct DeadTuplesSegment

{

ItemPointerData last_dead_tuple; /* Copy of the last dead tuple (unset

                                         * until the segment is fully

* populated). Keep it first to simplify

                                         * binary searches */

    unsigned short padding;        /* Align dt_tids to 32-bits,

                                 * sizeof(ItemPointerData) is aligned to

* short, so add a padding short, to make the

                                 * size of DeadTuplesSegment a multiple of

* 32-bits and align integer components for

* better performance during lookups into the

                                 * multiarray */

    int            num_dead_tuples;    /* # of entries in the segment */

int max_dead_tuples; /* # of entries allocated in the segment */

    ItemPointer dt_tids;        /* Array of dead tuples */

}    DeadTuplesSegment;

In the comments to ItemPointerData is written that it is 6 bytes long, but can be padded to 8 bytes by some compilers, so if we add padding in a current way, there is no guaranty that it will be done as it is expected. The other way to do it with pg_attribute_alligned. But in my opinion, there is no need to do it manually, because the compiler will do this optimization itself.

On 11.07.2017 19:51, Claudio Freire wrote:
-----

+       /* Search for the segment likely to contain the item pointer */
+       iseg = vac_itemptr_binsrch(
+               (void *) itemptr,
+               (void *)
&(vacrelstats->dead_tuples.dt_segments->last_dead_tuple),
+               vacrelstats->dead_tuples.last_seg + 1,
+               sizeof(DeadTuplesSegment));
+

I think that we can change the above to;

+       /* Search for the segment likely to contain the item pointer */
+       iseg = vac_itemptr_binsrch(
+               (void *) itemptr,
+               (void *) &(seg->last_dead_tuple),
+               vacrelstats->dead_tuples.last_seg + 1,
+               sizeof(DeadTuplesSegment));

We set "seg = vacrelstats->dead_tuples.dt_segments" just before this.
Right
In my mind, if you change vacrelstats->dead_tuples.last_seg + 1 with GetNumDeadTuplesSegments(vacrelstats), it would be more meaningful. Besides, you can change the vac_itemptr_binsrch within the segment with stdlib bsearch, like:

    res = (ItemPointer) bsearch((void *) itemptr,

                                (void *) seg->dt_tids,

                                seg->num_dead_tuples,

                                sizeof(ItemPointerData),

                                vac_cmp_itemptr);

    return (res != NULL);

Those are before the changes in the review. While I don't expect any
change, I'll re-run some of them just in case, and try to investigate
the slowdown. But that will take forever. Each run takes about a week
on my test rig, and I don't have enough hardware to parallelize the
tests. I will run a test on a snapshot of a particularly troublesome
production database we have, that should be interesting.
Very interesting, waiting for the results.


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to