Re: COUNT and Performance ...

From: Arjen van der Meijden <acm(at)tweakers(dot)net>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Re: COUNT and Performance ...
Date: 2003-02-02 12:07:47
Message-ID: b1j1mh$cpr$1@news.tudelft.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

For a more accurate view of the time used, use the \timing switch in psql.
That leaves out the overhead for forking and loading psql, connecting to
the database and such things.

I think, that it would be even nicer if postgresql automatically choose
to replace the count(*)-with-no-where with something similar.

Regards,

Arjen

Hans-Jürgen Schönig wrote:
> This patch adds a note to the documentation describing why the
> performance of min() and max() is slow when applied to the entire table,
> and suggesting the simple workaround most experienced Pg users
> eventually learn about (SELECT xyz ... ORDER BY xyz LIMIT 1).
>
> Any suggestions on improving the wording of this section would be
> welcome.
>
> Cheers,
>
>
> ------
>
> ORDER and LIMIT work pretty fast (no seq scan).
> In special cases there can be another way to avoid seq scans:
>
>
> action=# select tuple_count from pgstattuple('t_text');
> tuple_count
> -------------
> 14203
> (1 row)
>
> action=# BEGIN;
> BEGIN
> action=# insert into t_text (suchid) VALUES ('100000');
> INSERT 578606 1
> action=# select tuple_count from pgstattuple('t_text');
> tuple_count
> -------------
> 14204
> (1 row)
>
> action=# ROLLBACK;
> ROLLBACK
> action=# select tuple_count from pgstattuple('t_text');
> tuple_count
> -------------
> 14203
> (1 row)
>
>
> If people want to count ALL rows of a table. The contrib stuff is pretty
> useful. It seems to be transaction safe.
>
> The performance boost is great (PostgreSQL 7.3, RedHat, 166Mhz):
>
>
> root(at)actionscouts:~# time psql action -c "select tuple_count from
> pgstattuple('t_text');"
> tuple_count
> -------------
> 14203
> (1 row)
>
>
> real 0m0.266s
> user 0m0.030s
> sys 0m0.020s
> root(at)actionscouts:~# time psql action -c "select count(*) from t_text"
> count
> -------
> 14203
> (1 row)
>
>
> real 0m0.701s
> user 0m0.040s
> sys 0m0.010s
>
>
> I think that this could be a good workaround for huge counts (maybe
> millions of records) with no where clause and no joins.
>
> Hans
>
> <http://kernel.cybertec.at>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2003-02-02 12:17:17 Re: Windows Build System - My final thoughts
Previous Message Bruce Momjian 2003-02-02 12:05:34 Re: [mail] Re: Windows Build System