4.6.2 Using Indexes: 4.7 Complex Queries
4.6.2 Using Indexes: 4.7 Complex Queries
1 Manual
36 / 315
GiST indexes have two advantages over R-Tree indexes in PostgreSQL. Firstly, GiST indexes are "null safe", meaning they can
index columns which include null values. Secondly, GiST indexes support the concept of "lossiness" which is important when
dealing with GIS objects larger than the PostgreSQL 8K page size. Lossiness allows PostgreSQL to store only the "important"
part of an object in an index -- in the case of GIS objects, just the bounding box. GIS objects larger than 8K will cause R-Tree
indexes to fail in the process of being built.
Note
As of version 0.6, it should not be necessary to force the planner to use the index with ENABLE_SEQSCAN.
If you find the planner wrong about the cost of sequential vs index scans try reducing the value of random_page_cost in
postgresql.conf or using SET random_page_cost=#. Default value for the parameter is 4, try setting it to 1 or 2. Decrementing
the value makes the planner more inclined of using Index scans.
SELECT the_geom
FROM geom_table
WHERE ST_Distance(the_geom, ST_GeomFromText(POINT(100000 200000), -1)) < 100
This query is selecting all the geometries in geom_table which are within 100 units of the point (100000, 200000). It will be
slow because it is calculating the distance between each point in the table and our specified point, ie. one ST_Distance()
calculation for each row in the table. We can avoid this by using the && operator to reduce the number of distance calculations
required:
SELECT the_geom
FROM geom_table
WHERE the_geom && BOX3D(90900 190900, 100100 200100)::box3d
AND
ST_Distance(the_geom, ST_GeomFromText(POINT(100000 200000), -1)) < 100
This query selects the same geometries, but it does it in a more efficient way. Assuming there is a GiST index on the_geom,
the query planner will recognize that it can use the index to reduce the number of rows before calculating the result of the distance() function. Notice that the BOX3D geometry which is used in the && operation is a 200 unit square box centered
on the original point - this is our "query box". The && operator uses the index to quickly reduce the result set down to only
those geometries which have bounding boxes that overlap the "query box". Assuming that our query box is much smaller than
the extents of the entire geometry table, this will drastically reduce the number of distance calculations that need to be done.
Change in Behavior
As of PostGIS 1.3.0, most of the Geometry Relationship Functions, with the notable exceptions of ST_Disjoint and
ST_Relate, include implicit bounding box overlap operators.