Re: Enumeration of tables is very slow in largish database - Mailing list pgsql-general

From Kirill Müller
Subject Re: Enumeration of tables is very slow in largish database
Date
Msg-id 4F0E1AFE.1060403@ivt.baug.ethz.ch
Whole thread Raw
In response to Re: Enumeration of tables is very slow in largish database  (Scott Marlowe <scott.marlowe@gmail.com>)
Responses Re: Enumeration of tables is very slow in largish database  ("David Johnston" <polobo@yahoo.com>)
Re: Enumeration of tables is very slow in largish database  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
On 01/11/2012 07:00 PM, Scott Marlowe wrote:
> This is a problem I've run into before, but I can't find the previous
> post on it.  When you run a \d command, if you run top on your server
> do you see a single CPU spinning hard on that one command?  If so then
> it's a pg server side problem, which is what I had on one server with
> ~40k objects in it.
>
> Off the top of my head I remember something like this helping:
>
> alter function pg_table_is_visible cost 10;
Thanks for the feedback. I found the relevant parts in the qgis source
code and have been able to trace the problem. It's just a sub-optimal
query issued by qgis:

SELECT
pg_class.relname,pg_namespace.nspname,pg_attribute.attname,pg_class.relkind
FROM pg_attribute,pg_class,pg_namespace
WHERE pg_namespace.oid=pg_class.relnamespace AND pg_attribute.attrelid =
pg_class.oid
AND ( EXISTS (SELECT * FROM pg_type WHERE
pg_type.oid=pg_attribute.atttypid AND pg_type.typname IN
('geometry','geography','topogeometry')) OR pg_attribute.atttypid IN
(SELECT oid FROM pg_type a WHERE EXISTS (SELECT * FROM pg_type b WHERE
a.typbasetype=b.oid AND b.typname IN
('geometry','geography','topogeometry'))))
AND has_schema_privilege( pg_namespace.nspname, 'usage' )
AND has_table_privilege( '"' || pg_namespace.nspname || '"."' ||
pg_class.relname || '"', 'select' )
AND NOT EXISTS (SELECT * FROM geometry_columns WHERE
pg_namespace.nspname=f_table_schema AND pg_class.relname=f_table_name)
AND pg_class.relkind IN ('v','r');

When leaving out the last two "AND NOT EXISTS..." parts, the query
finishes in no time. I have attached the output of EXPLAIN ANALYZE -- if
I understand the execution tree correctly, the time is burnt in repeated
sequential scans of the geometry_columns table (line 38).? Rewriting the
"AND NOT EXISTS" part using WITH solves the performance issues here, but
works only from Postgres 8.4. Any idea how to speed up this query for
older versions? (Creating a temporary table or an index should be avoided.)

Kirill

Attachment

pgsql-general by date:

Previous
From: Michael Daines
Date:
Subject: Parameterized Query Pegs the DB
Next
From: Tom Lane
Date:
Subject: Re: indexes no longer used after shutdown during reindexing