[postgis-users] ordering spatial data in tables

Picavet Vincent Vincent.Picavet at mediapost.fr
Wed Jan 7 01:50:05 PST 2009


Hi,

> > My question is, is there any benefit to be gained by 
> ordering the data 
> > by some sort of spatial representation, ie centroid when retrieving 
> > the data? Or does the creation of the GiST index obviate 
> the need for such a thing.
> 
> The spatial index is vital for select performance. 
Agree.

> Personally, if the data is read only data sourced externally, 
> I would import and store the data in some sort of spatial order. 
[...]
> So, import the data (into a temporary table) and then 
> consider sorting the data using some sort of spatial key. A 
> centroid should be OK but consider using a larger bucket such 
> as a gridded area.
> 
> create table gis_roads as select * from tmp_gis_roads order 
> by centroid(the_geom);

Another and more <classic> solution (despite slower on big tables) to
keep spatially close rows together on disk is to use postgresql CLUSTER
statement.
http://www.postgresql.org/docs/8.3/static/sql-cluster.html

CLUSTER reorders data on disk using a specified index, therefore
increasing access speed when reading rows in the index order.

Example :
CREATE INDEX idx_mytable_the_geom ON mytable USING GIST(the_geom);
CLUSTER mytable USING idx_mytable_the_geom;

Efficiency of this method can clearly be seen for example when using
postgis with mapserver to generate a map, since close geometry are drawn
together, and therefore read together in the database.

Note that if you significally update or insert / delete data from your
table, you'll have to re-cluster it.

All other informations are detailled in postgresql documentation cited
above.

Hope this helps.
Vincent



More information about the postgis-users mailing list