Tùy thuộc vào postgres và / hoặc sql chuyên môn của bạn, bạn có một số tùy chọn:
phân tích truy vấn thông qua lệnh EXPLAIN để tìm hiểu xem bạn có đang gặp một nút cổ chai cụ thể không. Cảnh báo: đôi khi đầu ra của EXPLAIN có thể khó hiểu
nếu bạn mong đợi rằng hầu hết hoặc một phần đáng kể của hình học trong bảng1 KHÔNG giao nhau với đa giác, bạn có thể thử áp dụng điều kiện sơ bộ đối với đa giác đơn giản hơn (nghĩa là bằng cách phá đa giác trong các phần nhỏ hơn) và sau đó chỉ chạy giao cắt đa giác nặng hơn những kết quả đó. Xem ví dụ bên dưới.
nếu và chỉ nếu CPU là nút cổ chai (ví dụ máy chủ là nút giao thông máy tính bị mắc kẹt) Tôi thẫn thờ đề nghị bạn nhận được một lớn hơn, nhanh hơn, CPU mạnh hơn hoặc thuê một lần cao CPU Instance tắt EC2 của Amazon và tiêu diệt nó khi bạn đang làm xong
Ví dụ truy vấn cho mục 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
Để cải thiện hiệu suất, bạn cũng có thể tạm thời cụ thể hóa subselect st1 dưới dạng bảng để bạn có thể lập chỉ mục cho nó.
@Nicklas là đúng để chỉ ra trong các ý kiến mà ví dụ cho gợi ý 2 không nên giúp đỡ. Anh ấy đúng, nhưng tôi nghĩ tôi (một phần) cũng đúng.
Trong thực tế, có vẻ như một câu hỏi tương tự đã được hỏi (và trả lời) chỉ vào tháng 11 năm ngoái trên postgis ML:
http://postgis.refraction.net/pipermail/postgis-users/2011-November/031344.html
và hóa ra gợi ý là thực sự phá vỡ đa giác để chỉ mục có thể lọc một cách hiệu quả nhất các giao điểm sai sẽ được kích hoạt bằng cách kiểm tra ranh giới đơn giản.