Correct grammar in picksplit debug messages
[PostgreSQL.git] / src / test / regress / sql / stats.sql
blob4a72a949f29873a4c8c7becffcff8dd9438069c1
1 --
2 -- Test Statistics Collector
3 --
4 -- Must be run after tenk2 has been created (by create_table),
5 -- populated (by create_misc) and indexed (by create_index).
6 --
8 -- conditio sine qua non
9 SHOW track_counts;  -- must be on
11 -- wait to let any prior tests finish dumping out stats;
12 -- else our messages might get lost due to contention
13 SELECT pg_sleep(2.0);
15 -- save counters
16 CREATE TEMP TABLE prevstats AS
17 SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
18        (b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
19        (b.idx_blks_read + b.idx_blks_hit) AS idx_blks
20   FROM pg_catalog.pg_stat_user_tables AS t,
21        pg_catalog.pg_statio_user_tables AS b
22  WHERE t.relname='tenk2' AND b.relname='tenk2';
24 -- function to wait for counters to advance
25 create function wait_for_stats() returns void as $$
26 declare
27   start_time timestamptz := clock_timestamp();
28   updated bool;
29 begin
30   -- we don't want to wait forever; loop will exit after 30 seconds
31   for i in 1 .. 300 loop
33     -- check to see if indexscan has been sensed
34     SELECT (st.idx_scan >= pr.idx_scan + 1) INTO updated
35       FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr
36      WHERE st.relname='tenk2' AND cl.relname='tenk2';
38     exit when updated;
40     -- wait a little
41     perform pg_sleep(0.1);
43     -- reset stats snapshot so we can test again
44     perform pg_stat_clear_snapshot();
46   end loop;
48   -- report time waited in postmaster log (where it won't change test output)
49   raise log 'wait_for_stats delayed % seconds',
50     extract(epoch from clock_timestamp() - start_time);
51 end
52 $$ language plpgsql;
54 -- do a seqscan
55 SELECT count(*) FROM tenk2;
56 -- do an indexscan
57 SELECT count(*) FROM tenk2 WHERE unique1 = 1;
59 -- force the rate-limiting logic in pgstat_report_tabstat() to time out
60 -- and send a message
61 SELECT pg_sleep(1.0);
63 -- wait for stats collector to update
64 SELECT wait_for_stats();
66 -- check effects
67 SELECT st.seq_scan >= pr.seq_scan + 1,
68        st.seq_tup_read >= pr.seq_tup_read + cl.reltuples,
69        st.idx_scan >= pr.idx_scan + 1,
70        st.idx_tup_fetch >= pr.idx_tup_fetch + 1
71   FROM pg_stat_user_tables AS st, pg_class AS cl, prevstats AS pr
72  WHERE st.relname='tenk2' AND cl.relname='tenk2';
73 SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
74        st.idx_blks_read + st.idx_blks_hit >= pr.idx_blks + 1
75   FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
76  WHERE st.relname='tenk2' AND cl.relname='tenk2';
78 -- End of Stats Test