Залежно від ваших постгрес та / або експертизи sql, у вас є кілька варіантів:
проаналізуйте запит за допомогою команди EXPLAIN, щоб з’ясувати, чи потрапляєте ви у певне вузьке місце. Попередження: іноді вихід EXPLAIN може бути важким для розуміння
якщо ви очікуєте, що більшість або значна частина геометрій у таблиці1 НЕ перетинаються з мультиполігоном, ви можете спробувати застосувати попередню умову до більш простого багатокутника (тобто, розбивши мультиплайгон на більш дрібні шматки), а потім запустити більш важкий перетин багатополігону лише на ці результати. Дивіться приклад нижче.
якщо і тільки якщо CPU є вузьким місцем (тобто сервер застряг у перехрестях обчислень), я настійно пропоную вам отримати більший, швидший, потужніший процесор або орендувати одноразовий екземпляр високого CPU від Amazon EC2 та знищити його, коли ви зроблено
Приклад запиту для елемента 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
Для підвищення продуктивності ви також можете тимчасово матеріалізувати підвідбір st1 у вигляді таблиці, щоб ви могли його індексувати.
@Nicklas правильно вказав у коментарях, що приклад пропозиції 2 не повинен допомогти. Він правий, але я думаю, що я (частково) також правий.
Насправді, схоже, дуже подібне запитання було задано (і відповіли) лише в листопаді минулого року на пошті ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
і виявляється, пропозиція полягає в тому, щоб насправді розбити багатокутник, щоб індекс міг найефективніше відфільтрувати помилкові перехрестя, які в іншому випадку будуть спровоковані простою граничною перевіркою.