From 355ad170f2d3fa41a3a80e857b1641c5804d8728 Mon Sep 17 00:00:00 2001
From: Qiu Wenhui <qiuwenhuifx@gmail.com>
Date: Mon, 4 Nov 2024 08:16:10 +0000
Subject: [PATCH] optimize the value of vacthresh and anlthresh

---
 src/backend/postmaster/autovacuum.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index dc3cf87..99259de 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -3038,10 +3038,15 @@ relation_needs_vacanalyze(Oid relid,
 		/* If the table hasn't yet been vacuumed, take reltuples as zero */
 		if (reltuples < 0)
 			reltuples = 0;
-
-		vacthresh = (float4) vac_base_thresh + vac_scale_factor * reltuples;
+                /* Use arithmetic square root to solve auto vacuum trigger problem of large table */
+		if (likely(reltuples > 500)) {
+                 	vacthresh = (float4) fmin(vac_base_thresh + (vac_scale_factor * reltuples) , sqrt(1000.0 * reltuples));
+        		anlthresh = (float4) fmin(anl_base_thresh + (anl_scale_factor * reltuples) , sqrt(1000.0 * reltuples)); 
+                } else {
+			vacthresh = (float4) vac_base_thresh + vac_scale_factor * reltuples;
+			anlthresh = (float4) anl_base_thresh + anl_scale_factor * reltuples;
+                }
 		vacinsthresh = (float4) vac_ins_base_thresh + vac_ins_scale_factor * reltuples;
-		anlthresh = (float4) anl_base_thresh + anl_scale_factor * reltuples;
 
 		/*
 		 * Note that we don't need to take special consideration for stat
-- 
1.8.3.1

