[Bizgres-general] Bitmap Indexes : Block packing calculation error

Mark Kirkwood markir at paradise.net.nz
Thu Jan 26 02:47:18 GMT 2006


I think I finally understand why we are seeing the bitmap indexes occupy 
more on-disk space than you would expect.

In bitmap.h the max number of bitmap words to fit in a block of size 
BLCKSZ is calculated:

#define BM_MAX_NUM_OF_HRL_WORDS_PER_PAGE \
     ((BLCKSZ - \
     MAXALIGN(sizeof(PageHeaderData)) - \
     MAXALIGN(sizeof(BMBitmapOpaqueData)))/BM_HRL_WORD_SIZE)

Now this is incorrect, as BM_HRL_WORD_SIZE is in *bits*, so we really 
need to do:

#define BM_MAX_NUM_OF_HRL_WORDS_PER_PAGE \
     ((BLCKSZ - \
     MAXALIGN(sizeof(PageHeaderData)) - \
     MAXALIGN(sizeof(BMBitmapOpaqueData)))/(BM_HRL_WORD_SIZE/BITS_PER_BYTE))


This necessitates a change in the calculation of the header and word 
split to ensure that the total byte usages of these dont exceed
     BLCKSZ - \
     MAXALIGN(sizeof(PageHeaderData)) - \
     MAXALIGN(sizeof(BMBitmapOpaqueData))

I made a patch that I *think* has this all correct :-)

The results look promising (the last 3 indexes are the bitmap ones):

original:
      relname     | relpages
-----------------+----------
  bitmaptest      |    93458
  bitmaptest_id   |    21899
  bitmaptest_val0 |    18283
  bitmaptest_val1 |    18282
  bitmaptest_val2 |    51173

patched:
      relname     | relpages
-----------------+----------
  bitmaptest      |    93458
  bitmaptest_id   |    21899
  bitmaptest_val0 |     2105
  bitmaptest_val1 |     2106
  bitmaptest_val2 |     5918

retrieval performance is also much better, e.g: 3 queries

SELECT count(*)
FROM bitmaptest
WHERE val0 = 1
AND   val1 = 4
AND   val2 = 79
;
--
SELECT count(*)
FROM bitmaptest
WHERE val0 = 7
AND   val1 = 5
;
--
SELECT count(*)
FROM bitmaptest
WHERE val0 = 5
;

original:

9 s
20 s
17 s

patched:

5 s
14 s
14 s


cheers

Mark
-------------- next part --------------
--- bizgres/src/include/access/bitmap.h	Mon Dec 12 20:54:58 2005
+++ bizgresp/src/include/access/bitmap.h	Thu Jan 26 15:02:08 2006
@@ -130,9 +130,9 @@
 #define BM_MAX_NUM_OF_HRL_WORDS_PER_PAGE \
 	((BLCKSZ - \
 	MAXALIGN(sizeof(PageHeaderData)) - \
-	MAXALIGN(sizeof(BMBitmapOpaqueData)))/BM_HRL_WORD_SIZE)
+	MAXALIGN(sizeof(BMBitmapOpaqueData)))/(BM_HRL_WORD_SIZE/BITS_PER_BYTE))
 #define BM_MAX_NUM_OF_HEADER_WORDS \
-	(BM_MAX_NUM_OF_HRL_WORDS_PER_PAGE/BM_HRL_WORD_SIZE)
+	(BM_MAX_NUM_OF_HRL_WORDS_PER_PAGE/(BM_HRL_WORD_SIZE + 1))
 #define BM_NUM_OF_HRL_WORDS_PER_PAGE \
 	(BM_MAX_NUM_OF_HEADER_WORDS*BM_HRL_WORD_SIZE)
 


More information about the Bizgres-general mailing list