Re: Exposing the stats snapshot timestamp to SQL - Mailing list pgsql-hackers

From Tomas Vondra
Subject Re: Exposing the stats snapshot timestamp to SQL
Date
Msg-id 54E69736.6060509@2ndquadrant.com
Whole thread Raw
In response to Re: Exposing the stats snapshot timestamp to SQL  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Exposing the stats snapshot timestamp to SQL  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
On 20.2.2015 02:58, Tom Lane wrote:
> Tomas Vondra <tomas.vondra@2ndquadrant.com> writes:
>> I see the patch only works with the top-level snapshot timestamp,
>> stored in globalStats, but since 9.3 (when the stats were split
>> into per-db files) we track per-database timestamps too.
> 
>> Shouldn't we make those timestamps accessible too? It's not
>> necessary for detecting unresponsive statistics collector (if it's
>> stuck it's not writing anything, so the global timestamp will be
>> old too), but it seems more appropriate for querying database-level
>> stats to query database-level timestamp too.
> 
> I'm inclined to say not; I think that's exposing an implementation 
> detail that we might regret exposing, later. (IOW, it's not hard to 
> think of rearrangements that might mean there wasn't a per-database 
> stamp anymore.)

Fair point, but isn't the global timestamp an implementation detail too?
Although we're less likely to remove the global timestamp, no doubt
about that ...

>> But maybe that's not necessary, because to query database stats you
>> have to be connected to that particular database and that should
>> write fresh stats, so the timestamps should not be very different.
> 
> Yeah.  The only use-case that's been suggested is detecting an 
> unresponsive stats collector, and the main timestamp should be plenty
> for that.

Well, the patch also does this:


*** 28,34 **** SELECT pg_sleep_for('2 seconds'); 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_tablesAS b  WHERE t.relname='tenk2' AND b.relname='tenk2';
 
--- 28,35 ---- 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,
!        pg_stat_snapshot_timestamp() as snap_ts   FROM pg_catalog.pg_stat_user_tables AS t,
pg_catalog.pg_statio_user_tablesAS b  WHERE t.relname='tenk2' AND b.relname='tenk2';
 
***************

i.e. it adds the timestamp into queries selecting from database-level
catalogs. But OTOH we're usually using now() here, so the global
snapshot is an improvement here, and if the collector is stuck it's not
going to update of the timestamps.

So I'm OK with this patch.

-- 
Tomas Vondra                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Exposing the stats snapshot timestamp to SQL
Next
From: David Steele
Date:
Subject: Re: pg_upgrade and rsync