diff --git a/cdr/cdr_pgsql.c b/cdr/cdr_pgsql.c
index 310411cd36e6e3d7775269deea2ac71f15254d8b..194120564651f3230e8f981835181ff3b9bbfc18 100644
--- a/cdr/cdr_pgsql.c
+++ b/cdr/cdr_pgsql.c
@@ -75,6 +75,7 @@ static char *encoding;
 static char *tz;
 
 static int connected = 0;
+/* Optimization to reduce number of memory allocations */
 static int maxsize = 512, maxsize2 = 512;
 static time_t connect_time = 0;
 static int totalrecords = 0;
@@ -453,6 +454,15 @@ static int pgsql_log(struct ast_cdr *cdr)
 			records++;
 		}
 		PQclear(result);
+
+		/* Next time, just allocate buffers that are that big to start with. */
+		if (ast_str_strlen(sql) > maxsize) {
+			maxsize = ast_str_strlen(sql);
+		}
+		if (ast_str_strlen(sql2) > maxsize2) {
+			maxsize2 = ast_str_strlen(sql2);
+		}
+
 		ast_free(sql);
 		ast_free(sql2);
 	}
diff --git a/cel/cel_pgsql.c b/cel/cel_pgsql.c
index 2d7f0dfb04ceb5528468321fcdd453a44843ab00..c5c4fa92bd1a197cb0adb04d48685028706420c3 100644
--- a/cel/cel_pgsql.c
+++ b/cel/cel_pgsql.c
@@ -71,6 +71,7 @@ static char *pgdbport;
 static char *table;
 
 static int connected = 0;
+/* Optimization to reduce number of memory allocations */
 static int maxsize = 512, maxsize2 = 512;
 static int usegmtime = 0;
 
@@ -372,6 +373,14 @@ static void pgsql_log(struct ast_event *event)
 		}
 		PQclear(result);
 
+		/* Next time, just allocate buffers that are that big to start with. */
+		if (ast_str_strlen(sql) > maxsize) {
+			maxsize = ast_str_strlen(sql);
+		}
+		if (ast_str_strlen(sql2) > maxsize2) {
+			maxsize2 = ast_str_strlen(sql2);
+		}
+
 ast_log_cleanup:
 		ast_free(sql);
 		ast_free(sql2);