Dependendo do seu conhecimento em postgres e / ou sql, você tem várias opções:
analise a consulta através do comando EXPLAIN para descobrir se você está atingindo um gargalo específico. Aviso: às vezes, a saída de EXPLAIN pode ser difícil de entender
se você espera que a maior parte ou uma parte significativa das geometrias da tabela1 NÃO cruze o multipolígono, tente aplicar uma condição preliminar a um polígono mais simples (ou seja, quebrando o multigráfico em pedaços menores) e execute a interseção multipolígena mais pesada apenas em esses resultados. Veja abaixo um exemplo.
se e somente se CPU é o gargalo (ou seja, o servidor é cruzamentos de computação preso) I devidamente sugiro que você obter um maior, mais rápido CPU, mais poderoso ou alugar um one-time de alta CPU Instância off EC2 da Amazon e destruí-lo quando você estiver feito
Exemplo de consulta para o item 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 melhorar o desempenho, você também pode materializar temporariamente a subseleção st1 como uma tabela para poder indexá-la.
@Nicklas tem razão em apontar nos comentários que o exemplo da sugestão 2 não deve ajudar. Ele está certo, mas acho que estou (parcialmente) certo também.
De fato, parece que uma pergunta muito semelhante foi feita (e respondida) apenas em novembro passado no postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
e acontece que a sugestão é realmente quebrar o polígono para que o índice possa filtrar com mais eficiência as interseções falsas que seriam acionadas por uma simples verificação de limite.