diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c new file mode 100644 index c5732c3..1270471 *** a/src/backend/access/gin/ginfast.c --- b/src/backend/access/gin/ginfast.c *************** *** 27,32 **** --- 27,33 ---- /* GUC parameter */ int gin_pending_list_limit = 0; + int JJ_GIN=0; #define GIN_PAGE_FREESIZE \ ( BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(GinPageOpaqueData)) ) *************** shiftList(Relation index, Buffer metabuf *** 521,530 **** --- 522,533 ---- int64 nDeletedHeapTuples = 0; ginxlogDeleteListPages data; Buffer buffers[GIN_NDELETE_AT_ONCE]; + BlockNumber freespace[GIN_NDELETE_AT_ONCE]; data.ndeleted = 0; while (data.ndeleted < GIN_NDELETE_AT_ONCE && blknoToDelete != newHead) { + freespace[data.ndeleted] = blknoToDelete; buffers[data.ndeleted] = ReadBuffer(index, blknoToDelete); LockBuffer(buffers[data.ndeleted], GIN_EXCLUSIVE); page = BufferGetPage(buffers[data.ndeleted]); *************** shiftList(Relation index, Buffer metabuf *** 609,614 **** --- 612,624 ---- UnlockReleaseBuffer(buffers[i]); END_CRIT_SECTION(); + + if(JJ_GIN&1) + for (i = 0; i < data.ndeleted; i++) + RecordFreeIndexPage(index, freespace[i]); + if(JJ_GIN&2) + FreeSpaceMapVacuum(index); + } while (blknoToDelete != newHead); return false; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c new file mode 100644 index 1b7b914..8cdad78 *** a/src/backend/utils/misc/guc.c --- b/src/backend/utils/misc/guc.c *************** *** 107,112 **** --- 107,113 ---- extern bool Log_disconnections; extern int CommitDelay; extern int CommitSiblings; + extern int JJ_GIN; extern char *default_tablespace; extern char *temp_tablespaces; extern bool ignore_checksum_failure; *************** static struct config_int ConfigureNamesI *** 1659,1664 **** --- 1660,1674 ---- NULL, NULL, NULL }, { + {"JJ_GIN", PGC_USERSET, QUERY_TUNING_OTHER, + gettext_noop("recycle GIN pages more aggressively."), + gettext_noop(" ") + }, + &JJ_GIN, + 0, 0, 10000, + NULL, NULL, NULL + }, + { {"from_collapse_limit", PGC_USERSET, QUERY_TUNING_OTHER, gettext_noop("Sets the FROM-list size beyond which subqueries " "are not collapsed."),