On Wed, 2005-03-09 at 23:53 +0100, Thomas Mueller wrote:
> Geo Carncross wrote:
> > On Wed, 2005-03-09 at 23:06 +0100, Thomas Mueller wrote:
> >> Geo Carncross wrote:
> >>> On Wed, 2005-03-09 at 19:10 +0100, Thomas Mueller wrote:
> >>> 
> >>>> No index will ever solve the problem for PostgreSQL. COUNT()
> >>>> can't use any index, because indices know nothing about
> >>>> transactions. That is why every record that is counted using
> >>>> the index has to be checked to see if it's involved in a
> >>>> transaction (otherwise count() could return too high or low
> >>>> numbers!) - then it's cheaper to do a full table scan and that
> >>>> is what PostgreSQL does.
> >>> 
> >>> Is EXPLAIN really wrong here? I see PG generating the same query
> >>> plan for COUNT(*) as it appears to for every aggregate- and in
> >>> each case it says:
> >>> 
> >>> Aggregate  (cost=123.57..123.57 rows=1 width=4) ->  Index Scan
> >>> using ...
> >> 
> >> No I was wrong here I'm sorry. What I said is true for COUNT()
> >> without restricting WHERE.
> > 
> > Well, I would expect aggregates to walk the entire table
> 
> Really? I wouldn't expect that a COUNT() has to walk the table. I
> would expect it to walk the leaves of the b-tree of my index and that's it.

That said, I would hope COUNT(*) could be treated specially, but as we
all know, hoping doesn't make it happen.

-- 
Internet Connection High Quality Web Hosting
http://www.internetconnection.net/

Reply via email to