Dependiendo de su experiencia en postgres y / o sql, tiene varias opciones:
analice la consulta a través del comando EXPLICAR para averiguar si está llegando a un cuello de botella en particular. Advertencia: a veces la salida de EXPLAIN puede ser difícil de entender
si espera que la mayoría o una parte significativa de las geometrías en la tabla 1 NO se crucen con el multipolígono, puede intentar aplicar una condición preliminar contra un polígono más simple (es decir, al romper el multiploygon en piezas más pequeñas) y luego ejecutar la intersección multipolígono más pesada solo en esos resultados Vea a continuación un ejemplo.
si y sólo si la CPU es el cuello de botella (es decir, el servidor es intersecciones de computación atascados) Me debidamente sugiero que conseguir una más grande, más rápido, CPU más potente o alquilar una sola vez de alta CPU Instancia fuera EC2 de Amazon y lo destruyen cuando estás hecho
Ejemplo de consulta para el ítem 2:
SELECT DISTINCT ON (st1.userid) st1.userid ,ST_AsText(st1.position), st1.timestamp
FROM (
select userid, position, timestamp from table1
WHERE ST_Intersects ( YOUR_MULTIPOL_BOUNDS_HERE,position)
) as st1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),st1.position)
ORDER BY st1.userid, st1.timestamp desc
Para mejorar el rendimiento, también podría materializar temporalmente la subselección st1 como una tabla para poder indexarla.
@Nicklas tiene razón al señalar en los comentarios que el ejemplo de la sugerencia 2 no debería ayudar. Tiene razón, pero creo que yo también estoy (en parte) en lo cierto.
De hecho, parece que se hizo una pregunta muy similar (y se respondió) en noviembre pasado sobre el ML postgis:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
y resulta que la sugerencia es dividir realmente el polígono para que el índice pueda filtrar de manera más efectiva las intersecciones falsas que de otra manera serían activadas por una simple verificación de límites.