Index: doc/src/sgml/runtime.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v retrieving revision 1.182 diff -c -c -r1.182 runtime.sgml *** doc/src/sgml/runtime.sgml 27 May 2003 17:49:45 -0000 1.182 --- doc/src/sgml/runtime.sgml 11 Jun 2003 17:51:45 -0000 *************** *** 1052,1057 **** --- 1052,1074 ---- + LOG_MIN_DURATION_STATEMENT (integer) + + + Sets a minimum statement execution time (in milliseconds) + above which a statement will be logged. All SQL statements + that run longer than the time specified will be logged together + with the duration, in seconds. The default is 0 + (turning this feature off). For example, if you set it + to 250 then all SQL statements that run longer + than 250ms will be logged along with the duration. Enabling this + option can be useful in tracking down unoptimized queries in + your applications. + + + + + LOG_MIN_ERROR_STATEMENT (string) Index: src/backend/tcop/postgres.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/tcop/postgres.c,v retrieving revision 1.346 diff -c -c -r1.346 postgres.c *** src/backend/tcop/postgres.c 27 May 2003 17:49:46 -0000 1.346 --- src/backend/tcop/postgres.c 11 Jun 2003 17:51:48 -0000 *************** *** 663,668 **** --- 663,669 ---- struct timeval start_t, stop_t; bool save_log_duration = log_duration; + int save_log_min_duration_statement = log_min_duration_statement; bool save_log_statement_stats = log_statement_stats; /* *************** *** 673,683 **** pgstat_report_activity(query_string); /* ! * We use save_log_duration so "SET log_duration = true" doesn't ! * report incorrect time because gettimeofday() wasn't called. * Similarly, log_statement_stats has to be captured once. */ ! if (save_log_duration) gettimeofday(&start_t, NULL); if (save_log_statement_stats) --- 674,685 ---- pgstat_report_activity(query_string); /* ! * We use save_log_* so "SET log_duration = true" and ! * "SET log_min_duration_statement = true" don't report incorrect ! * time because gettimeofday() wasn't called. * Similarly, log_statement_stats has to be captured once. */ ! if (save_log_duration || save_log_min_duration_statement > 0) gettimeofday(&start_t, NULL); if (save_log_statement_stats) *************** *** 915,933 **** QueryContext = NULL; /* ! * Finish up monitoring. */ ! if (save_log_duration) { gettimeofday(&stop_t, NULL); if (stop_t.tv_usec < start_t.tv_usec) { stop_t.tv_sec--; stop_t.tv_usec += 1000000; } ! elog(LOG, "duration: %ld.%06ld sec", ! (long) (stop_t.tv_sec - start_t.tv_sec), ! (long) (stop_t.tv_usec - start_t.tv_usec)); } if (save_log_statement_stats) --- 917,954 ---- QueryContext = NULL; /* ! * Combine processing here as we need to calculate the query ! * duration in both instances. */ ! if (save_log_duration || save_log_min_duration_statement > 0) { + long usecs; gettimeofday(&stop_t, NULL); if (stop_t.tv_usec < start_t.tv_usec) { stop_t.tv_sec--; stop_t.tv_usec += 1000000; } ! usecs = (long) (stop_t.tv_sec - start_t.tv_sec) * 1000000 + (long) (stop_t.tv_usec - start_t.tv_usec); ! ! /* ! * Output a duration_query to the log if the query has exceeded the ! * min duration. ! */ ! if (usecs >= save_log_min_duration_statement * 1000) ! elog(LOG, "duration_statement: %ld.%06ld %s", ! (long) (stop_t.tv_sec - start_t.tv_sec), ! (long) (stop_t.tv_usec - start_t.tv_usec), ! query_string); ! ! /* ! * If the user is requesting logging of all durations, then log ! * that as well. ! */ ! if (save_log_duration) ! elog(LOG, "duration: %ld.%06ld sec", ! (long) (stop_t.tv_sec - start_t.tv_sec), ! (long) (stop_t.tv_usec - start_t.tv_usec)); } if (save_log_statement_stats) Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v retrieving revision 1.128 diff -c -c -r1.128 guc.c *** src/backend/utils/misc/guc.c 11 Jun 2003 05:04:51 -0000 1.128 --- src/backend/utils/misc/guc.c 11 Jun 2003 17:51:52 -0000 *************** *** 55,60 **** --- 55,62 ---- #include "utils/pg_locale.h" #include "pgstat.h" + int log_min_duration_statement = 0; + #ifndef PG_KRB_SRVTAB #define PG_KRB_SRVTAB "" *************** *** 733,738 **** --- 735,745 ---- { {"extra_float_digits", PGC_USERSET}, &extra_float_digits, 0, -15, 2, NULL, NULL + }, + + { + {"log_min_duration_statement", PGC_USERSET}, &log_min_duration_statement, + 0, 0, INT_MAX / 1000, NULL, NULL }, { Index: src/backend/utils/misc/postgresql.conf.sample =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v retrieving revision 1.79 diff -c -c -r1.79 postgresql.conf.sample *** src/backend/utils/misc/postgresql.conf.sample 11 Jun 2003 05:04:51 -0000 1.79 --- src/backend/utils/misc/postgresql.conf.sample 11 Jun 2003 17:51:52 -0000 *************** *** 140,145 **** --- 140,149 ---- # debug5, debug4, debug3, debug2, debug1, # info, notice, warning, error, panic(off) + #log_min_duration_statement = 0 # Log all statements whose + # execution time exceeds the value, in + # milliseconds. Zero disables. + #debug_print_parse = false #debug_print_rewritten = false #debug_print_plan = false Index: src/bin/psql/tab-complete.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/psql/tab-complete.c,v retrieving revision 1.77 diff -c -c -r1.77 tab-complete.c *** src/bin/psql/tab-complete.c 14 May 2003 03:26:02 -0000 1.77 --- src/bin/psql/tab-complete.c 11 Jun 2003 17:51:53 -0000 *************** *** 538,543 **** --- 538,544 ---- "lc_time", "log_duration", "log_executor_stats", + "log_min_duration_statement", "log_min_error_statement", "log_min_messages", "log_parser_stats", Index: src/include/utils/guc.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/utils/guc.h,v retrieving revision 1.31 diff -c -c -r1.31 guc.h *** src/include/utils/guc.h 6 May 2003 20:26:28 -0000 1.31 --- src/include/utils/guc.h 11 Jun 2003 17:51:54 -0000 *************** *** 142,145 **** --- 142,147 ---- void read_nondefault_variables(void); #endif + extern int log_min_duration_statement; + #endif /* GUC_H */