mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	This patch adds two new counters to pg_stat_statements:
- generic_plan_calls
- custom_plan_calls
These counters track how many times a prepared statement was executed
using a generic or custom plan, respectively, providing a global
equivalent at query level, for top and non-top levels, of
pg_prepared_statements whose data is restricted to a single session.
This commit builds upon e125e36002.  The module is bumped to version
1.13.  PGSS_FILE_HEADER is bumped as well, something that the latest
patches touching the on-disk format of the PGSS file did not actually
bother with since 2022..
Author: Sami Imseih <samimseih@gmail.com>
Reviewed-by: Ilia Evdokimov <ilya.evdokimov@tantorlabs.com>
Reviewed-by: Andrei Lepikhov <lepihov@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: Nikolay Samokhvalov <nik@postgres.ai>
Discussion: https://postgr.es/m/CAA5RZ0uFw8Y9GCFvafhC=OA8NnMqVZyzXPfv_EePOt+iv1T-qQ@mail.gmail.com
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PL/PgSQL
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PL/PgSQL
		
	
	
	
	
	
--
 | 
						|
-- Tests with plan cache
 | 
						|
--
 | 
						|
 | 
						|
-- Setup
 | 
						|
CREATE OR REPLACE FUNCTION select_one_func(int) RETURNS VOID AS $$
 | 
						|
DECLARE
 | 
						|
  ret INT;
 | 
						|
BEGIN
 | 
						|
  SELECT $1 INTO ret;
 | 
						|
END;
 | 
						|
$$ LANGUAGE plpgsql;
 | 
						|
CREATE OR REPLACE PROCEDURE select_one_proc(int) AS $$
 | 
						|
DECLARE
 | 
						|
  ret INT;
 | 
						|
BEGIN
 | 
						|
  SELECT $1 INTO ret;
 | 
						|
END;
 | 
						|
$$ LANGUAGE plpgsql;
 | 
						|
 | 
						|
-- Prepared statements
 | 
						|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
 | 
						|
PREPARE p1 AS SELECT $1 AS a;
 | 
						|
SET plan_cache_mode TO force_generic_plan;
 | 
						|
EXECUTE p1(1);
 | 
						|
SET plan_cache_mode TO force_custom_plan;
 | 
						|
EXECUTE p1(1);
 | 
						|
SELECT calls, generic_plan_calls, custom_plan_calls, query FROM pg_stat_statements
 | 
						|
  ORDER BY query COLLATE "C";
 | 
						|
DEALLOCATE p1;
 | 
						|
 | 
						|
-- Extended query protocol
 | 
						|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
 | 
						|
SELECT $1 AS a \parse p1
 | 
						|
SET plan_cache_mode TO force_generic_plan;
 | 
						|
\bind_named p1 1
 | 
						|
;
 | 
						|
SET plan_cache_mode TO force_custom_plan;
 | 
						|
\bind_named p1 1
 | 
						|
;
 | 
						|
SELECT calls, generic_plan_calls, custom_plan_calls, query FROM pg_stat_statements
 | 
						|
  ORDER BY query COLLATE "C";
 | 
						|
\close_prepared p1
 | 
						|
 | 
						|
-- EXPLAIN [ANALYZE] EXECUTE
 | 
						|
SET pg_stat_statements.track = 'all';
 | 
						|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
 | 
						|
PREPARE p1 AS SELECT $1;
 | 
						|
SET plan_cache_mode TO force_generic_plan;
 | 
						|
EXPLAIN (COSTS OFF) EXECUTE p1(1);
 | 
						|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) EXECUTE p1(1);
 | 
						|
SET plan_cache_mode TO force_custom_plan;
 | 
						|
EXPLAIN (COSTS OFF) EXECUTE p1(1);
 | 
						|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) EXECUTE p1(1);
 | 
						|
SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements
 | 
						|
  ORDER BY query COLLATE "C";
 | 
						|
RESET pg_stat_statements.track;
 | 
						|
DEALLOCATE p1;
 | 
						|
 | 
						|
-- Functions/procedures
 | 
						|
SET pg_stat_statements.track = 'all';
 | 
						|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
 | 
						|
SET plan_cache_mode TO force_generic_plan;
 | 
						|
SELECT select_one_func(1);
 | 
						|
CALL select_one_proc(1);
 | 
						|
SET plan_cache_mode TO force_custom_plan;
 | 
						|
SELECT select_one_func(1);
 | 
						|
CALL select_one_proc(1);
 | 
						|
SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements
 | 
						|
  ORDER BY query COLLATE "C";
 | 
						|
 | 
						|
--
 | 
						|
-- EXPLAIN [ANALYZE] EXECUTE + functions/procedures
 | 
						|
--
 | 
						|
SET pg_stat_statements.track = 'all';
 | 
						|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
 | 
						|
SET plan_cache_mode TO force_generic_plan;
 | 
						|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func(1);
 | 
						|
EXPLAIN (COSTS OFF) SELECT select_one_func(1);
 | 
						|
CALL select_one_proc(1);
 | 
						|
SET plan_cache_mode TO force_custom_plan;
 | 
						|
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func(1);
 | 
						|
EXPLAIN (COSTS OFF) SELECT select_one_func(1);
 | 
						|
CALL select_one_proc(1);
 | 
						|
SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements
 | 
						|
  ORDER BY query COLLATE "C", toplevel;
 | 
						|
 | 
						|
RESET pg_stat_statements.track;
 | 
						|
 | 
						|
--
 | 
						|
-- Cleanup
 | 
						|
--
 | 
						|
DROP FUNCTION select_one_func(int);
 | 
						|
DROP PROCEDURE select_one_proc(int);
 |