If I define the following table...
CREATE TABLE tbl_vast_importance(
id bigserial PRIMARY KEY,
geom geometry(MultiPolygon,4326)
);
CREATE INDEX ON tbl_vast_importance USING GIST (geom);
CREATE INDEX ON tbl_vast_importance USING GIST (st_pointonsurface(geom));
...and run the following query
SELECT
id,
geom
FROM
tbl_vast_importance a
JOIN tbl_vast_importance b ON (st_intersects(st_pointonsurface(a.geom),b.geom))
WHERE
a.id != b.id
...the spatial index is not used; yet using st_intersects() on the geometry directly results in the geometry index being used properly. How do I force Postgres to use the proper index for st_pointonsurface()? It would be wasteful to create an explicit centroid column for this purpose.
Explain Results:
Nested Loop (cost=0.00..1034058179737.31 rows=609220605748 width=784)
Join Filter: ((a.id <> b.id) AND st_intersects(st_pointonsurface(a.geom), b.geom))
-> Seq Scan on tbl_vast_importance a (cost=0.00..78073.11 rows=1351911 width=392)
-> Materialize (cost=0.00..153484.67 rows=1351911 width=392)
-> Seq Scan on tbl_vast_importance b (cost=0.00..78073.11 rows=1351911 width=392)
Planning time: 0.188 ms
postgis_full_version = "POSTGIS="2.2.0dev r12887" GEOS="3.5.0dev-CAPI-1.9.0 r3995" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.11.0, released 2014/04/16" LIBXML="2.9.1" LIBJSON="0.11.99" TOPOLOGY RASTER"