diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c
new file mode 100644
index cf43384..4481de0
*** a/contrib/pg_upgrade/check.c
--- b/contrib/pg_upgrade/check.c
*************** static void check_for_reg_data_type_usag
*** 23,28 ****
--- 23,33 ----
  static void check_for_support_lib(ClusterInfo *cluster);
  static void get_bin_version(ClusterInfo *cluster);
  
+ #ifndef WIN32
+ #define	ECHO_QUOTE	"'"
+ #else
+ #define	ECHO_QUOTE	""
+ #endif
  
  void
  output_check_banner(bool *live_check)
*************** issue_warnings(char *sequence_script_fil
*** 193,213 ****
  
  
  void
! output_completion_banner(char *deletion_script_file_name)
  {
  	/* Did we copy the free space files? */
  	if (GET_MAJOR_VERSION(old_cluster.major_version) >= 804)
  		pg_log(PG_REPORT,
! 			   "Optimizer statistics are not transferred by pg_upgrade so\n"
! 			   "consider running:\n"
! 			   "    vacuumdb --all --analyze-only\n"
! 			   "on the newly-upgraded cluster.\n\n");
  	else
  		pg_log(PG_REPORT,
  			   "Optimizer statistics and free space information are not transferred\n"
! 			   "by pg_upgrade so consider running:\n"
! 			   "    vacuumdb --all --analyze\n"
! 			   "on the newly-upgraded cluster.\n\n");
  
  	pg_log(PG_REPORT,
  		   "Running this script will delete the old cluster's data files:\n"
--- 198,217 ----
  
  
  void
! output_completion_banner(char *analyze_script_file_name,
! 						 char *deletion_script_file_name)
  {
  	/* Did we copy the free space files? */
  	if (GET_MAJOR_VERSION(old_cluster.major_version) >= 804)
  		pg_log(PG_REPORT,
! 			   "Optimizer statistics are not transferred by pg_upgrade so,\n"
! 			   "once you start the new server, consider running:\n"
! 			   "    %s\n\n", analyze_script_file_name);
  	else
  		pg_log(PG_REPORT,
  			   "Optimizer statistics and free space information are not transferred\n"
! 			   "by pg_upgrade so, once you start the new server, consider running:\n"
! 			   "    %s\n\n", analyze_script_file_name);
  
  	pg_log(PG_REPORT,
  		   "Running this script will delete the old cluster's data files:\n"
*************** check_new_cluster_is_empty(void)
*** 379,384 ****
--- 383,477 ----
  }
  
  
+ /*
+  * create_script_for_cluster_analyze()
+  *
+  *	This incrementally generates better optimizer statistics
+  */
+ void
+ create_script_for_cluster_analyze(char **analyze_script_file_name)
+ {
+ 	FILE	   *script = NULL;
+ 
+ 	*analyze_script_file_name = pg_malloc(MAXPGPATH);
+ 
+ 	prep_status("Creating script to analyze new cluster");
+ 
+ 	snprintf(*analyze_script_file_name, MAXPGPATH, "analyze_new_cluster.%s",
+ 			 SCRIPT_EXT);
+ 
+ 	if ((script = fopen_priv(*analyze_script_file_name, "w")) == NULL)
+ 		pg_log(PG_FATAL, "Could not open file \"%s\": %s\n",
+ 			   *analyze_script_file_name, getErrorText(errno));
+ 
+ #ifndef WIN32
+ 	/* add shebang header */
+ 	fprintf(script, "#!/bin/sh\n\n");
+ 
+ 	fprintf(script, "PGOPTIONS='-c default_statistics_target=1'\n");
+ 	/* only need to export once */
+ 	fprintf(script, "export PGOPTIONS\n");
+ #else
+ 	fprintf(script, "SET PGOPTIONS=-c default_statistics_target=1\n");
+ #endif
+ 
+ 	fprintf(script, "echo %sGenerating minimal optimizer statistics (1 target)%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "echo %s--------------------------------------------------%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "vacuumdb --all --analyze-only\n");
+ 	fprintf(script, "echo\n");
+ 	fprintf(script, "echo %sThe server is now available with minimal optimizer statistics.%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "echo %sQuery performance will be optimal once this script completes.%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "echo\n\n");
+ 
+ #ifndef WIN32
+ 	fprintf(script, "PGOPTIONS='-c default_statistics_target=10'\n");
+ #else
+ 	fprintf(script, "SET PGOPTIONS=-c default_statistics_target=10\n");
+ #endif
+ 
+ 	fprintf(script, "echo %sGenerating medium optimizer statistics (10 targets)%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "echo %s---------------------------------------------------%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "vacuumdb --all --analyze-only\n");
+ 	fprintf(script, "echo\n\n");
+ 
+ #ifndef WIN32
+ 	fprintf(script, "unset PGOPTIONS\n");
+ #else
+ 	fprintf(script, "SET PGOPTIONS\n");
+ #endif
+ 
+ 	fprintf(script, "echo %sGenerating default (full) optimizer statistics (100 targets?)%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	fprintf(script, "echo %s-------------------------------------------------------------%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 	/* Did we copy the free space files? */
+ 	if (GET_MAJOR_VERSION(old_cluster.major_version) >= 804)
+ 		fprintf(script, "vacuumdb --all --analyze-only\n");
+ 	else
+ 		fprintf(script, "vacuumdb --all --analyze\n");
+ 
+ 	fprintf(script, "echo\n\n");
+ 	fprintf(script, "echo %sDone%s\n",
+ 					ECHO_QUOTE, ECHO_QUOTE);
+ 
+ 	fclose(script);
+ 
+ #ifndef WIN32
+ 	if (chmod(*analyze_script_file_name, S_IRWXU) != 0)
+ 		pg_log(PG_FATAL, "Could not add execute permission to file \"%s\": %s\n",
+ 			   *analyze_script_file_name, getErrorText(errno));
+ #endif
+ 
+ 	check_ok();
+ }
+ 
+ 
  /*
   * create_script_for_old_cluster_deletion()
   *
diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
new file mode 100644
index b0720c3..fa48ef1
*** a/contrib/pg_upgrade/pg_upgrade.c
--- b/contrib/pg_upgrade/pg_upgrade.c
*************** int
*** 67,72 ****
--- 67,73 ----
  main(int argc, char **argv)
  {
  	char	   *sequence_script_file_name = NULL;
+ 	char	   *analyze_script_file_name = NULL;
  	char	   *deletion_script_file_name = NULL;
  	bool		live_check = false;
  
*************** main(int argc, char **argv)
*** 142,147 ****
--- 143,149 ----
  			  new_cluster.pgdata, UTILITY_LOG_FILE);
  	check_ok();
  
+ 	create_script_for_cluster_analyze(&analyze_script_file_name);
  	create_script_for_old_cluster_deletion(&deletion_script_file_name);
  
  	issue_warnings(sequence_script_file_name);
*************** main(int argc, char **argv)
*** 149,156 ****
  	pg_log(PG_REPORT, "\nUpgrade Complete\n");
  	pg_log(PG_REPORT, "----------------\n");
  
! 	output_completion_banner(deletion_script_file_name);
  
  	pg_free(deletion_script_file_name);
  	pg_free(sequence_script_file_name);
  
--- 151,160 ----
  	pg_log(PG_REPORT, "\nUpgrade Complete\n");
  	pg_log(PG_REPORT, "----------------\n");
  
! 	output_completion_banner(analyze_script_file_name,
! 							 deletion_script_file_name);
  
+ 	pg_free(analyze_script_file_name);
  	pg_free(deletion_script_file_name);
  	pg_free(sequence_script_file_name);
  
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
new file mode 100644
index 46f9169..da37249
*** a/contrib/pg_upgrade/pg_upgrade.h
--- b/contrib/pg_upgrade/pg_upgrade.h
*************** void check_old_cluster(bool live_check,
*** 283,292 ****
  void		check_new_cluster(void);
  void		report_clusters_compatible(void);
  void		issue_warnings(char *sequence_script_file_name);
! void		output_completion_banner(char *deletion_script_file_name);
  void		check_cluster_versions(void);
  void		check_cluster_compatibility(bool live_check);
  void		create_script_for_old_cluster_deletion(char **deletion_script_file_name);
  
  
  /* controldata.c */
--- 283,294 ----
  void		check_new_cluster(void);
  void		report_clusters_compatible(void);
  void		issue_warnings(char *sequence_script_file_name);
! void		output_completion_banner(char *analyze_script_file_name,
! 									 char *deletion_script_file_name);
  void		check_cluster_versions(void);
  void		check_cluster_compatibility(bool live_check);
  void		create_script_for_old_cluster_deletion(char **deletion_script_file_name);
+ void		create_script_for_cluster_analyze(char **analyze_script_file_name);
  
  
  /* controldata.c */
