On Wed, 2002-04-03 at 04:02, Tom Lane wrote:
>
> Hmm. Where exactly did you get those numbers from? I see 4118.54 sec
> as the total CPU accounted for in the profile.
>
odd ...the call graph has 4047.53 and the flat graph has 4118.54
>
> Hmm. Assuming that the profile data is trustworthy and the queries are
> indeed the same (did you compare EXPLAIN output?), it seems that
> Solaris' problem is a spectacularly bad qsort() implementation.
>
A bit surfing finds heaps of unhappy Solaris qsort users... apparently
it cannot sort lists with many repeated items... so our GROUP BY will be
causing it grief here
>
> It might be entertaining to snarf a qsort off the net (from glibc,
> perhaps) and link it into Postgres to see if you get better results.
>
> regards, tom lane
>
Indeed it is - obtained qsort.c from Freebsd CVS and rebuilt Postgresql :
The query now takes 6 seconds instead of 1 hour ! Thanks for an
excellent suggestion.
For those in need to a quick fix :
I did a cheap and dirty mod to src/backend/utils/sort/Makefile
changed OBJS = logtape.o -> OBJS = qsort.o logtape.o
and copied qsort.c into this directory
(had to comment out a couple of lines to compile under Solaris :
/*#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/stdlib/qsort.c,v 1.11 2002/03/22
21:53:10 obrien Exp $");
*/
)
What do you think about providing something like this for the Solaris
port ? (since its clearly quicker...)
regards
Mark