ขึ้นอยู่กับ postgres และ / หรือความเชี่ยวชาญของ sql คุณมีหลายตัวเลือก:
วิเคราะห์แบบสอบถามผ่านคำสั่งอธิบายเพื่อตรวจสอบว่าคุณกำลังกดปุ่มคอขวดเฉพาะ คำเตือน: บางครั้งผลลัพธ์ของ EXPLAIN อาจเข้าใจยาก
หากคุณคาดหวังว่าส่วนใหญ่หรือส่วนที่สำคัญของรูปทรงเรขาคณิตในตารางที่ 1 ไม่ได้ตัดหลายรูปหลายเหลี่ยมคุณสามารถลองใช้เงื่อนไขเบื้องต้นกับรูปหลายเหลี่ยมที่ง่ายกว่า (เช่นโดยการแบ่งรูปหลายเหลี่ยมในชิ้นเล็ก ๆ ) จากนั้นเรียกใช้ ผลลัพธ์เหล่านั้น ดูตัวอย่างด้านล่าง
และถ้าหาก CPU เป็นคอขวด (เช่นเซิร์ฟเวอร์เป็นทางแยกคอมพิวเตอร์ติด) ฉันไม่เป็นเรื่องแนะนำให้คุณได้รับที่ใหญ่กว่า, เร็วกว่า, 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 ไม่ควรช่วย เขาพูดถูก แต่ฉันคิดว่าฉันเองก็เป็นส่วนหนึ่งเช่นกัน
ในความเป็นจริงดูเหมือนว่าคำถามที่คล้ายกันถูกถาม (และตอบ) เมื่อเดือนพฤศจิกายนที่ผ่านมาบน postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
และเปลี่ยนคำแนะนำคือการแบ่งรูปหลายเหลี่ยมเพื่อให้ดัชนีสามารถกรองการแยกที่ผิดพลาดได้อย่างมีประสิทธิภาพมากที่สุดซึ่งจะถูกเรียกใช้โดยการตรวจสอบขอบเขตอย่างง่าย