I see! Thank you very much! ~Ben
On Fri, Jun 15, 2012 at 3:51 PM, Kevin Grittner <kevin.gritt...@wicourts.gov > wrote: > Benedict Holland <benedict.m.holl...@gmail.com> wrote: > > > I can even accept the use case that the select should block with > > an Alter Table operation if data is retrieved from the table, but > > a select count(*) only returns the number of rows and should be > > table space independent. > > Just as an example of why the data must be scanned for transactional > behavior. Open three connections to the same database. On the > first, run this: > > create table t (id int not null); > insert into t select generate_series(1, 1000000); > vacuum analyze t; > begin; > delete from t where id between 1 and 50000; > > Then, on the second, run this: > > begin; > insert into t select generate_series(1000001, 1000600); > > Now, run this on each of the three connections: > > select count(*) from t; > > You should not get the same count on each one. Depending on your > transactional context, you will get 950000, 1000600, or 1000000. > Over and over as long as the modifying transactions are open. If > you want a fast approximation: > > select reltuples from pg_class where oid = 't'::regclass; > reltuples > ----------- > 1e+06 > (1 row) > > -Kevin >