With pg_autovacuum becoming increasingly popular it's important to
have a working stats collector. This test is able to discover the problem that was present in 7.4 Beta 2. Manfred Koizar
This commit is contained in:
parent
c346ca8648
commit
cd47a4d3c4
79
src/test/regress/expected/stats.out
Normal file
79
src/test/regress/expected/stats.out
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
--
|
||||||
|
-- Test Statistics Collector
|
||||||
|
--
|
||||||
|
-- Must be run after tenk2 has been created (by create_table),
|
||||||
|
-- populated (by create_misc) and indexed (by create_index).
|
||||||
|
--
|
||||||
|
-- conditio sine qua non
|
||||||
|
SHOW stats_start_collector; -- must be on
|
||||||
|
stats_start_collector
|
||||||
|
-----------------------
|
||||||
|
on
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- save counters
|
||||||
|
CREATE TEMP TABLE prevstats AS
|
||||||
|
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
||||||
|
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
|
||||||
|
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks
|
||||||
|
FROM pg_catalog.pg_stat_user_tables AS t,
|
||||||
|
pg_catalog.pg_statio_user_tables AS b
|
||||||
|
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
||||||
|
-- enable statistics
|
||||||
|
SET stats_block_level = on;
|
||||||
|
SET stats_row_level = on;
|
||||||
|
-- helper function
|
||||||
|
CREATE FUNCTION sleep(interval) RETURNS integer AS '
|
||||||
|
DECLARE
|
||||||
|
endtime timestamp;
|
||||||
|
BEGIN
|
||||||
|
endtime := timeofday()::timestamp + $1;
|
||||||
|
WHILE timeofday()::timestamp < endtime LOOP
|
||||||
|
END LOOP;
|
||||||
|
RETURN 0;
|
||||||
|
END;
|
||||||
|
' LANGUAGE 'plpgsql';
|
||||||
|
-- do something
|
||||||
|
SELECT count(*) FROM tenk2;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
10000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT count(*) FROM tenk2 WHERE unique1 = 1;
|
||||||
|
count
|
||||||
|
-------
|
||||||
|
1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- let stats collector catch up
|
||||||
|
SELECT sleep('0:0:2'::interval);
|
||||||
|
sleep
|
||||||
|
-------
|
||||||
|
0
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- check effects
|
||||||
|
SELECT st.seq_scan >= pr.seq_scan + 1,
|
||||||
|
st.seq_tup_read >= pr.seq_tup_read + cl.reltuples,
|
||||||
|
st.idx_scan >= pr.idx_scan + 1,
|
||||||
|
st.idx_tup_fetch >= pr.idx_tup_fetch + 1
|
||||||
|
FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
?column? | ?column? | ?column? | ?column?
|
||||||
|
----------+----------+----------+----------
|
||||||
|
t | t | t | t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
||||||
|
st.idx_blks_read + st.idx_blks_hit >= pr.idx_blks + 1
|
||||||
|
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
?column? | ?column?
|
||||||
|
----------+----------
|
||||||
|
t | t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- clean up
|
||||||
|
DROP FUNCTION sleep(interval);
|
||||||
|
-- End of Stats Test
|
@ -74,4 +74,4 @@ test: select_views portals_p2 rules foreign_key cluster
|
|||||||
# The sixth group of parallel test
|
# The sixth group of parallel test
|
||||||
# ----------
|
# ----------
|
||||||
# "plpgsql" cannot run concurrently with "rules"
|
# "plpgsql" cannot run concurrently with "rules"
|
||||||
test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism
|
test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism stats
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.21 2003/08/26 18:32:23 momjian Exp $
|
# $Header: /cvsroot/pgsql/src/test/regress/serial_schedule,v 1.22 2003/09/13 16:44:48 momjian Exp $
|
||||||
# This should probably be in an order similar to parallel_schedule.
|
# This should probably be in an order similar to parallel_schedule.
|
||||||
test: boolean
|
test: boolean
|
||||||
test: char
|
test: char
|
||||||
@ -93,3 +93,4 @@ test: truncate
|
|||||||
test: alter_table
|
test: alter_table
|
||||||
test: sequence
|
test: sequence
|
||||||
test: polymorphism
|
test: polymorphism
|
||||||
|
test: stats
|
||||||
|
58
src/test/regress/sql/stats.sql
Normal file
58
src/test/regress/sql/stats.sql
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
--
|
||||||
|
-- Test Statistics Collector
|
||||||
|
--
|
||||||
|
-- Must be run after tenk2 has been created (by create_table),
|
||||||
|
-- populated (by create_misc) and indexed (by create_index).
|
||||||
|
--
|
||||||
|
|
||||||
|
-- conditio sine qua non
|
||||||
|
SHOW stats_start_collector; -- must be on
|
||||||
|
|
||||||
|
-- save counters
|
||||||
|
CREATE TEMP TABLE prevstats AS
|
||||||
|
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
||||||
|
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
|
||||||
|
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks
|
||||||
|
FROM pg_catalog.pg_stat_user_tables AS t,
|
||||||
|
pg_catalog.pg_statio_user_tables AS b
|
||||||
|
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
||||||
|
|
||||||
|
-- enable statistics
|
||||||
|
SET stats_block_level = on;
|
||||||
|
SET stats_row_level = on;
|
||||||
|
|
||||||
|
-- helper function
|
||||||
|
CREATE FUNCTION sleep(interval) RETURNS integer AS '
|
||||||
|
DECLARE
|
||||||
|
endtime timestamp;
|
||||||
|
BEGIN
|
||||||
|
endtime := timeofday()::timestamp + $1;
|
||||||
|
WHILE timeofday()::timestamp < endtime LOOP
|
||||||
|
END LOOP;
|
||||||
|
RETURN 0;
|
||||||
|
END;
|
||||||
|
' LANGUAGE 'plpgsql';
|
||||||
|
|
||||||
|
-- do something
|
||||||
|
SELECT count(*) FROM tenk2;
|
||||||
|
SELECT count(*) FROM tenk2 WHERE unique1 = 1;
|
||||||
|
|
||||||
|
-- let stats collector catch up
|
||||||
|
SELECT sleep('0:0:2'::interval);
|
||||||
|
|
||||||
|
-- check effects
|
||||||
|
SELECT st.seq_scan >= pr.seq_scan + 1,
|
||||||
|
st.seq_tup_read >= pr.seq_tup_read + cl.reltuples,
|
||||||
|
st.idx_scan >= pr.idx_scan + 1,
|
||||||
|
st.idx_tup_fetch >= pr.idx_tup_fetch + 1
|
||||||
|
FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
||||||
|
st.idx_blks_read + st.idx_blks_hit >= pr.idx_blks + 1
|
||||||
|
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
|
||||||
|
-- clean up
|
||||||
|
DROP FUNCTION sleep(interval);
|
||||||
|
|
||||||
|
-- End of Stats Test
|
Loading…
x
Reference in New Issue
Block a user