mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Don't MAXALIGN in the checks to decide whether a tuple is over TOAST's
threshold for tuple length. On 4-byte-MAXALIGN machines, the toast code creates tuples that have t_len exactly TOAST_TUPLE_THRESHOLD ... but this number is not itself maxaligned, so if heap_insert maxaligns t_len before comparing to TOAST_TUPLE_THRESHOLD, it'll uselessly recurse back to tuptoaster.c, wasting cycles. (It turns out that this does not happen on 8-byte-MAXALIGN machines, because for them the outer MAXALIGN in the TOAST_MAX_CHUNK_SIZE macro reduces TOAST_MAX_CHUNK_SIZE so that toast tuples will be less than TOAST_TUPLE_THRESHOLD in size. That MAXALIGN is really incorrect, but we can't remove it now, see below.) There isn't any particular value in maxaligning before comparing to the thresholds, so just don't do that, which saves a small number of cycles in itself. These numbers should be rejiggered to minimize wasted space on toast-relation pages, but we can't do that in the back branches because changing TOAST_MAX_CHUNK_SIZE would force an initdb (by changing the contents of toast tables). We can move the toast decision thresholds a bit, though, which is what this patch effectively does. Thanks to Pavan Deolasee for discovering the unintended recursion. Back-patch into 8.2, but not further, pending more testing. (HEAD is about to get a further patch modifying the thresholds, so it won't help much for testing this form of the patch.)
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.225 2007/01/25 02:17:25 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.226 2007/02/04 20:00:37 tgl Exp $
|
||||
*
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
@ -1418,8 +1418,7 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid,
|
||||
* Note: below this point, heaptup is the data we actually intend to store
|
||||
* into the relation; tup is the caller's original untoasted data.
|
||||
*/
|
||||
if (HeapTupleHasExternal(tup) ||
|
||||
(MAXALIGN(tup->t_len) > TOAST_TUPLE_THRESHOLD))
|
||||
if (HeapTupleHasExternal(tup) || tup->t_len > TOAST_TUPLE_THRESHOLD)
|
||||
heaptup = toast_insert_or_update(relation, tup, NULL, use_wal);
|
||||
else
|
||||
heaptup = tup;
|
||||
@ -2073,14 +2072,14 @@ l2:
|
||||
* We need to invoke the toaster if there are already any out-of-line
|
||||
* toasted values present, or if the new tuple is over-threshold.
|
||||
*/
|
||||
newtupsize = MAXALIGN(newtup->t_len);
|
||||
|
||||
need_toast = (HeapTupleHasExternal(&oldtup) ||
|
||||
HeapTupleHasExternal(newtup) ||
|
||||
newtupsize > TOAST_TUPLE_THRESHOLD);
|
||||
newtup->t_len > TOAST_TUPLE_THRESHOLD);
|
||||
|
||||
pagefree = PageGetFreeSpace((Page) dp);
|
||||
|
||||
newtupsize = MAXALIGN(newtup->t_len);
|
||||
|
||||
if (need_toast || newtupsize > pagefree)
|
||||
{
|
||||
oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
|
||||
@ -2100,7 +2099,7 @@ l2:
|
||||
*
|
||||
* Note: below this point, heaptup is the data we actually intend to
|
||||
* store into the relation; newtup is the caller's original untoasted
|
||||
* data. (We always use WAL for toast table updates.)
|
||||
* data.
|
||||
*/
|
||||
if (need_toast)
|
||||
{
|
||||
|
Reference in New Issue
Block a user