9
9
*
10
10
*
11
11
* IDENTIFICATION
12
- * $PostgreSQL: pgsql/src/backend/utils/hash/dynahash.c,v 1.62 2005/06/18 20:51:30 tgl Exp $
12
+ * $PostgreSQL: pgsql/src/backend/utils/hash/dynahash.c,v 1.63 2005/06/26 23:32:33 tgl Exp $
13
13
*
14
14
*-------------------------------------------------------------------------
15
15
*/
@@ -311,6 +311,7 @@ init_htab(HTAB *hashp, long nelem)
311
311
{
312
312
HASHHDR * hctl = hashp -> hctl ;
313
313
HASHSEGMENT * segp ;
314
+ long lnbuckets ;
314
315
int nbuckets ;
315
316
int nsegs ;
316
317
@@ -319,9 +320,9 @@ init_htab(HTAB *hashp, long nelem)
319
320
* number of buckets. Allocate space for the next greater power of
320
321
* two number of buckets
321
322
*/
322
- nelem = (nelem - 1 ) / hctl -> ffactor + 1 ;
323
+ lnbuckets = (nelem - 1 ) / hctl -> ffactor + 1 ;
323
324
324
- nbuckets = 1 << my_log2 (nelem );
325
+ nbuckets = 1 << my_log2 (lnbuckets );
325
326
326
327
hctl -> max_bucket = hctl -> low_mask = nbuckets - 1 ;
327
328
hctl -> high_mask = (nbuckets << 1 ) - 1 ;
@@ -363,6 +364,10 @@ init_htab(HTAB *hashp, long nelem)
363
364
return false;
364
365
}
365
366
367
+ /* Choose number of entries to allocate at a time */
368
+ hctl -> nelem_alloc = (int ) Min (nelem , HASHELEMENT_ALLOC_MAX );
369
+ hctl -> nelem_alloc = Max (hctl -> nelem_alloc , 1 );
370
+
366
371
#if HASH_DEBUG
367
372
fprintf (stderr , "init_htab:\n%s%p\n%s%ld\n%s%ld\n%s%d\n%s%ld\n%s%u\n%s%x\n%s%x\n%s%ld\n%s%ld\n" ,
368
373
"TABLE POINTER " , hashp ,
@@ -394,7 +399,8 @@ hash_estimate_size(long num_entries, Size entrysize)
394
399
nSegments ,
395
400
nDirEntries ,
396
401
nElementAllocs ,
397
- elementSize ;
402
+ elementSize ,
403
+ elementAllocCnt ;
398
404
399
405
/* estimate number of buckets wanted */
400
406
nBuckets = 1L << my_log2 ((num_entries - 1 ) / DEF_FFACTOR + 1 );
@@ -411,10 +417,12 @@ hash_estimate_size(long num_entries, Size entrysize)
411
417
size += MAXALIGN (nDirEntries * sizeof (HASHSEGMENT ));
412
418
/* segments */
413
419
size += nSegments * MAXALIGN (DEF_SEGSIZE * sizeof (HASHBUCKET ));
414
- /* elements --- allocated in groups of HASHELEMENT_ALLOC_INCR */
420
+ /* elements --- allocated in groups of up to HASHELEMENT_ALLOC_MAX */
415
421
elementSize = MAXALIGN (sizeof (HASHELEMENT )) + MAXALIGN (entrysize );
416
- nElementAllocs = (num_entries - 1 ) / HASHELEMENT_ALLOC_INCR + 1 ;
417
- size += nElementAllocs * HASHELEMENT_ALLOC_INCR * elementSize ;
422
+ elementAllocCnt = Min (num_entries , HASHELEMENT_ALLOC_MAX );
423
+ elementAllocCnt = Max (elementAllocCnt , 1 );
424
+ nElementAllocs = (num_entries - 1 ) / elementAllocCnt + 1 ;
425
+ size += nElementAllocs * elementAllocCnt * elementSize ;
418
426
419
427
return size ;
420
428
}
@@ -633,7 +641,7 @@ hash_search(HTAB *hashp,
633
641
if (currBucket == NULL )
634
642
{
635
643
/* no free elements. allocate another chunk of buckets */
636
- if (!element_alloc (hashp , HASHELEMENT_ALLOC_INCR ))
644
+ if (!element_alloc (hashp , hctl -> nelem_alloc ))
637
645
{
638
646
/* out of memory */
639
647
if (action == HASH_ENTER_NULL )
0 commit comments