Spatialite ช้ามากจริง ๆ ไหม?


9

ฉันมีรูปหลายเหลี่ยมสองพันใน SpatiaLite ฉันพยายามจะทำแบบสอบถาม "สัมผัส":

select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")

และว้าวมันช้าไหม!

อย่างไรก็ตามถ้าฉันขอให้ทำเพียงพัสดุเดียวใน map1 มันจะทำงานได้เร็วมาก

select map1.* from map1,map2
where touches(map1."Geometry",map2."Geometry")
and map1."ROWID" = 753

ฉันคาดว่าการสืบค้นแรกจะทำงานช้าลง แต่มันช้าอย่างน่าอัศจรรย์ มันทำงานได้อย่างรวดเร็วใน SQLServer, Manifold GIS และ PostGIS Spatialite ไม่มีประสิทธิภาพจริงๆหรือ


9
ดูที่นี่สำหรับการทดสอบความเร็วของอวกาศ - แนะนำการเพิ่มความเร็ว 200 เท่าสำหรับการดำเนินการ ST_Intersect ในชุดข้อมูลขนาดใหญ่ถ้าคุณใช้ดัชนี!
Simbamangu

ขอบคุณสำหรับลิงค์ Fezter ปัญหาเดียวของตัวอย่างนั้นคือเขาต้องเขียนโค้ด SQL เพิ่มเติมเพื่อรวมกล่องที่มีขอบเขต (และเขาต้องบังคับให้ป้อนซองจดหมาย) มันจะดีถ้า spatialite รุ่นต่อไปจะใช้ประโยชน์จากดัชนีอวกาศที่มีอยู่แล้ว
ajl

ยินดีต้อนรับสู่ gis.stackexchange.com! รูปแบบสำหรับไซต์นี้แสดงว่าคำตอบที่โพสต์ควรเป็นคำตอบสำหรับคำถามเดิม เมื่อตอบกลับคำตอบหรือแสดงความคิดเห็นเป็นการดีที่สุดที่จะแสดงความคิดเห็น
ฌอน

คำตอบ:


16

ไม่ SpatiaLite นั้นไม่ช้าคุณเพียงแค่ต้องใช้ดัชนีอวกาศ เนื่องจากข้อ จำกัด ในการออกแบบ SQLite การใช้ดัชนีเชิงพื้นที่ในแบบสอบถามไม่ได้มองไม่เห็นเหมือนใน PostGIS

นี่คือตัวอย่างที่แก้ไขจาก SpatiaLite Cookbook http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html

หลังจากสร้างดัชนีเชิงพื้นที่บนชุดข้อมูลรูปหลายเหลี่ยมของคุณ

    SELECT map1.*
      FROM map1, map2
     WHERE ST_Touches(map1.geometry, map2.geometry)
       AND map2.ROWID IN (
           SELECT pkid
             FROM idx_map1_geometry
            WHERE pkid MATCH RTreeIntersects(
                  MbrMinX(map1.geometry),
                  MbrMinY(map1.geometry),
                  MbrMaxX(map1.geometry),
                  MbrMaxY(map1.geometry)));

DavidF: ขอบคุณสำหรับคำตอบของคุณ ที่จะเร่งสิ่งต่าง ๆ อย่างแน่นอน มันแย่เกินไปที่การปฏิบัติการอวกาศไม่ได้ใช้ดัชนีอวกาศโดยปริยาย อย่างไรก็ตามฉันคิดว่าคำสั่งย่อย AND สุดท้ายอาจถูกแก้ไขเพื่อเคียวรีหนึ่งปัญหา คุณคิดว่าอวกาศจะมีวันหนึ่งที่สนับสนุนดัชนีเชิงพื้นที่โดยปริยายหรือไม่?

ความเข้าใจของฉันคือปัญหานี้มีอยู่ในสถาปัตยกรรมของ SQLite คุณสามารถโพสต์ถึง SpatiaLite Google Group ได้อย่างแน่นอนโดยมีคำถามเพิ่มเติม groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF

โปรดทราบว่า Spatialite เวอร์ชันล่าสุดใช้ดัชนีพื้นที่เสมือนจริงและไวยากรณ์ข้างต้นไม่สามารถใช้งานได้อีกต่อไป ส่วนคำสั่ง WHERE จะถูกเขียนใหม่เป็น WHERE map2.ROWID ใน (เลือก ROWID จาก SpatialIndex WHERE f_table_name = 'map1' และ search_frame = map1.geometry)
rudivonstaden

4

ในหนังสือของ Eric Westra หน้า Python Geospatial Development หน้า 188 แสดงให้เห็นว่าสำหรับการดำเนินการ CONTAINS อย่างน้อย Spatialite สามารถวิ่งได้เร็วกว่า MySQL และ PostGIS หากมีการปฏิบัติตามขั้นตอนการทำดัชนีเชิงพื้นที่ที่เกี่ยวข้อง


ไม่ใช่ "น่าประหลาดใจ" เนื่องจากแบบสอบถามแบบง่ายทำงานได้ประมาณ 2 ·· 3 ×เร็วใน SQLite มากกว่าที่ทำในเครื่องมือ MySQL InnoDB
Michał Leon

3

ฉันเขียนบล็อกเกี่ยวกับเรื่องนี้สักครู่ ดูhttp://www.frogmouth.net/blog/?p=23

มิคายังเขียนบล็อกที่น่าสนใจในหัวข้อนี้ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.