[postgis-users] postgis and mapserver - queries
David Blasby
dblasby at refractions.net
Mon Jun 9 10:04:56 PDT 2003
I recently changed mappostgis.c so its a bit wiser about how it
determines the columns in a query. Previously, it did this:
EXPLAIN VERBOSE <query>;
The advantage of this is that it is extreamly quick. Unfortunately, the
EXPLAIN VERBOSE command changes its output with different versions of
postgresql. For example, in 7.1 and 7.2, the EXPLAIN VERBOSE is set as
a NOTICE message. In 7.3 its sent as a query result (and is formated
differently).
The new mappostgis.c determines columns like this (<query> is basically
the query in your DATA statement):
SELECT * FROM (<query>) as foo LIMIT 0;
Basically, it executes the query asking for zero rows. In most cases
this will return a result (where you can determine the column names and
types easily) quickly. Unfortunately, i noticed that it can actually
take a long time to execute. For example, imagine you have a big table
with road data in it:
SELECT * FROM ( SELECT gid, sum(len) FROM roads GROUP BY gid) as foo
LIMIT 0;
This can take many seconds to compute because postgresql will do the
entire GROUP BY (which involves a SORT) before it can start returning
results.
I was thinking that you can use the fact you know the unique column
attribute ("using unique <column>") and the geometry column's name to
speed things up by reducing the query set:
SELECT * FROM (<query>) as foo WHERE <unique column> = -666 AND
<geom_column> && 'BOX3D(0 0, 0 0)' LIMIT 0;
[Here -666 and the BOX3D are just made up to reduce the query results]
But this seems pretty hacky (and will not always work cut down on the
work) - anyone else have ideas?
dave
More information about the postgis-users
mailing list