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."),
