*** a/doc/src/sgml/maintenance.sgml
--- b/doc/src/sgml/maintenance.sgml
***************
*** 792,801 **** analyze threshold = analyze base threshold + analyze scale factor * number of tu
     </para>
  
     <para>
!     When multiple workers are running, the cost limit is
      <quote>balanced</quote> among all the running workers, so that the
!     total impact on the system is the same, regardless of the number
!     of workers actually running.
     </para>
    </sect2>
   </sect1>
--- 792,804 ----
     </para>
  
     <para>
!     When multiple workers are running, the cost delay parameters are
      <quote>balanced</quote> among all the running workers, so that the
!     total I/O impact on the system is the same regardless of the number
!     of workers actually running.  However, any workers processing tables whose
!     <literal>autovacuum_vacuum_cost_delay</> or
!     <literal>autovacuum_vacuum_cost_limit</> have been set are not considered
!     in the balancing algorithm.
     </para>
    </sect2>
   </sect1>
*** a/src/backend/postmaster/autovacuum.c
--- b/src/backend/postmaster/autovacuum.c
***************
*** 193,198 **** typedef struct autovac_table
--- 193,199 ----
  	int			at_multixact_freeze_table_age;
  	int			at_vacuum_cost_delay;
  	int			at_vacuum_cost_limit;
+ 	bool		at_dobalance;
  	bool		at_wraparound;
  	char	   *at_relname;
  	char	   *at_nspname;
***************
*** 223,228 **** typedef struct WorkerInfoData
--- 224,230 ----
  	Oid			wi_tableoid;
  	PGPROC	   *wi_proc;
  	TimestampTz wi_launchtime;
+ 	bool		wi_dobalance;
  	int			wi_cost_delay;
  	int			wi_cost_limit;
  	int			wi_cost_limit_base;
***************
*** 1716,1721 **** FreeWorkerInfo(int code, Datum arg)
--- 1718,1724 ----
  		MyWorkerInfo->wi_tableoid = InvalidOid;
  		MyWorkerInfo->wi_proc = NULL;
  		MyWorkerInfo->wi_launchtime = 0;
+ 		MyWorkerInfo->wi_dobalance = false;
  		MyWorkerInfo->wi_cost_delay = 0;
  		MyWorkerInfo->wi_cost_limit = 0;
  		MyWorkerInfo->wi_cost_limit_base = 0;
***************
*** 1776,1788 **** autovac_balance_cost(void)
  	if (vac_cost_limit <= 0 || vac_cost_delay <= 0)
  		return;
  
! 	/* caculate the total base cost limit of active workers */
  	cost_total = 0.0;
  	dlist_foreach(iter, &AutoVacuumShmem->av_runningWorkers)
  	{
  		WorkerInfo	worker = dlist_container(WorkerInfoData, wi_links, iter.cur);
  
  		if (worker->wi_proc != NULL &&
  			worker->wi_cost_limit_base > 0 && worker->wi_cost_delay > 0)
  			cost_total +=
  				(double) worker->wi_cost_limit_base / worker->wi_cost_delay;
--- 1779,1792 ----
  	if (vac_cost_limit <= 0 || vac_cost_delay <= 0)
  		return;
  
! 	/* calculate the total base cost limit of participating active workers */
  	cost_total = 0.0;
  	dlist_foreach(iter, &AutoVacuumShmem->av_runningWorkers)
  	{
  		WorkerInfo	worker = dlist_container(WorkerInfoData, wi_links, iter.cur);
  
  		if (worker->wi_proc != NULL &&
+ 			worker->wi_dobalance &&
  			worker->wi_cost_limit_base > 0 && worker->wi_cost_delay > 0)
  			cost_total +=
  				(double) worker->wi_cost_limit_base / worker->wi_cost_delay;
***************
*** 1801,1806 **** autovac_balance_cost(void)
--- 1805,1811 ----
  		WorkerInfo	worker = dlist_container(WorkerInfoData, wi_links, iter.cur);
  
  		if (worker->wi_proc != NULL &&
+ 			worker->wi_dobalance &&
  			worker->wi_cost_limit_base > 0 && worker->wi_cost_delay > 0)
  		{
  			int			limit = (int)
***************
*** 2285,2290 **** do_autovacuum(void)
--- 2290,2296 ----
  
  		/* advertise my cost delay parameters for the balancing algorithm */
  		MyWorkerInfo->wi_cost_delay = tab->at_vacuum_cost_delay;
+ 		MyWorkerInfo->wi_dobalance = tab->at_dobalance;
  		MyWorkerInfo->wi_cost_limit = tab->at_vacuum_cost_limit;
  		MyWorkerInfo->wi_cost_limit_base = tab->at_vacuum_cost_limit;
  
***************
*** 2579,2584 **** table_recheck_autovac(Oid relid, HTAB *table_toast_map,
--- 2585,2598 ----
  		tab->at_relname = NULL;
  		tab->at_nspname = NULL;
  		tab->at_datname = NULL;
+ 
+ 		/*
+ 		 * If any of the cost delay parameters has been set individually for
+ 		 * this table, disable the balancing algorithm.
+ 		 */
+ 		tab->at_dobalance =
+ 			!(avopts && (avopts->vacuum_cost_limit > 0 ||
+ 						 avopts->vacuum_cost_delay > 0));
  	}
  
  	heap_freetuple(classTup);
