Hi Laurenz:
Thank you for your kind reply. Please let me dig it a little more: I think that when a session is accessing a postgersql table. It will be influenced by the followings: Really old data (needed to be vacuumed, eg: old image at one day ago). Recent data (committed and uncommitted), because they are all in the data block. Isn’t it strange that I have to access my data among somebody’s un-decided data? How if there is a busy system having a table accessed by so many sessions at same time? They will all be slowed down because of uncommitted but flushed out data, I think. I hope in future the architecture of PostgreSQL can put the committed data & uncommitted data apart, Or even put them in separate physical disks.That will Help to improve performance I think. Jian Gao 2012/11/9 Albe Laurenz <laurenz.a...@wien.gv.at> > 高健 wrote: > > I have one question about the visibility of explain plan. > > > > Firstly , I was inserting into data to a table. I use : [ insert > into ptest select * from > > test02; ] > > > > And test02 table has 10,000,000 records. And ptest is a parent table, > which has two distribution > > child table --- ctest01 and ctest02. > > > > When I execute the above sql statement, it takes some time to execute > because of data volume. > > > > Before the above sql statement finish, I open another session with > psql, and execute: [ select > > count(*) from ptest; ] > > Because the insert into statement in other session has not finished, I > got the result of zero. > > > > Before first session finish, If I check the explain of select, I got: > > postgres=# explain select count(*) from ptest; > > QUERY PLAN > > > ----------------------------------------------------------------------------------- > > Aggregate (cost=55406.40..55406.41 rows=1 width=0) > > -> Append (cost=0.00..49601.92 rows=2321793 width=0) > > -> Seq Scan on ptest (cost=0.00..0.00 rows=1 width=0) > > -> Seq Scan on ctest01 ptest (cost=0.00..24776.52 > rows=1159752 width=0) > > -> Seq Scan on ctest02 ptest (cost=0.00..24825.40 > rows=1162040 width=0) > > (5 rows)postgres=# > > > > I think that is because postgresql is holding commited and uncommited > data together > > physically(vacuum is needed because of it?). > > > > Is there some method that allow simple select such as select count(*) > do not activate the explain > > plan ? > > (I think the more table is bigger, the more sample data is needed) > > "SELECT count(*) FROM ptest" may be simple, but it is expensive > because it has to visit every tuple in the table. > The first time you run it after the insert it might also trigger > considerable write activity (hint bits), but that on the side. > > If you need only an estimate, try > SELECT sum(reltuples) FROM pg_class WHERE relname IN ('ptest', 'ctest01', > 'ctest02'); > > Yours, > Laurenz Albe >