Spatialite có thực sự chậm?


9

Tôi có một vài ngàn đa giác trong SpatiaLite. Tôi đang cố gắng thực hiện một truy vấn "chạm":

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

và wow, nó CHẬM!

Tuy nhiên, nếu tôi yêu cầu nó chỉ làm điều đó cho một bưu kiện trong map1, thì nó chạy rất nhanh.

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

Tôi hy vọng rằng truy vấn đầu tiên sẽ chạy chậm hơn, nhưng nó chậm đáng kinh ngạc. Nó chạy rất nhanh trong SQLServer, Manifold GIS và PostGIS. Là Spatialite chỉ thực sự không hiệu quả?


9
Xem ở đây để biết một số thử nghiệm về tốc độ của spatialite - nó gợi ý tăng tốc độ gấp 200 lần cho hoạt động ST_Intersects trên một tập dữ liệu lớn NẾU bạn sử dụng chỉ mục!
Simbamangu

cảm ơn vì liên kết Fezter. Vấn đề duy nhất với ví dụ đó là anh ta phải viết thêm mã SQL để bao gồm một hộp giới hạn (và, anh ta đã buộc phải cung cấp cho nó phong bì). Sẽ thật tuyệt nếu phiên bản tiếp theo của spatialite chỉ đơn giản là sử dụng các chỉ mục không gian đã có sẵn.
ajl

Chào mừng bạn đến với gis.stackexchange.com! Định dạng cho trang web này ngụ ý rằng câu trả lời được đăng phải là câu trả lời cho câu hỏi ban đầu. Khi trả lời một câu trả lời hoặc nhận xét, tốt nhất là làm cho nó một nhận xét.
Sean

Câu trả lời:


16

Không, SpatiaLite không quá chậm, bạn chỉ cần sử dụng một chỉ số không gian. Do những hạn chế trong thiết kế SQLite, việc sử dụng chỉ mục không gian trong truy vấn không phải là vô hình như trong PostGIS.

Dưới đây là một ví dụ được sửa đổi từ SpatiaLite Cookbook http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html

Sau khi tạo chỉ mục không gian trên bộ dữ liệu đa giác của bạn

    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: cảm ơn câu trả lời của bạn. Điều đó chắc chắn sẽ tăng tốc mọi thứ. Thật tệ khi các hoạt động không gian không hoàn toàn sử dụng chỉ số không gian. Tuy nhiên, tôi cho rằng mệnh đề AND cuối cùng có thể được giải quyết cho bất kỳ vấn đề truy vấn nào. Bạn có nghĩ rằng một ngày nào đó spatialite sẽ hỗ trợ các chỉ số không gian ngầm?

Tôi hiểu rằng vấn đề là cố hữu trong kiến ​​trúc của SQLite. Bạn chắc chắn có thể đăng lên Nhóm Google SpatiaLite với nhiều câu hỏi hơn. Groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF

Lưu ý rằng các phiên bản mới nhất của Spatialite thực hiện Chỉ mục không gian ảo và cú pháp trên không còn hoạt động. Mệnh đề WHERE sẽ được viết lại thành WHERE map2.ROWID trong (CHỌN ROWID từ Spatial Index WHERE f_table_name = 'map1' AND search_frame = map1.geometry)
rudivonstaden

4

Trong cuốn sách 'Phát triển không gian địa lý Python' của Eric Westra, trang 188 cho thấy rằng đối với hoạt động CONTAIN, ít nhất Spatialite có thể, có thể đáng kinh ngạc, chạy nhanh hơn MySQL và PostGIS - nếu tuân thủ quy trình lập chỉ mục không gian liên quan.


Không "đáng ngạc nhiên", vì các truy vấn đơn giản chạy trong SQLite nhanh hơn khoảng 2 · · 3 × so với các truy vấn trong công cụ MySQL InnoDB.
Michał Leon

3

Tôi đã viết một blog về điều này một thời gian trở lại. Xem http://www.frogmouth.net/blog/?p=23

Micha cũng đã viết một blog thú vị về chủ đề này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.