Spatialite는 정말 느린가요?


9

SpatiaLite에는 2 천개의 다각형이 있습니다. "터치"쿼리를 수행하려고합니다.

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
공간적 속도에 대한 몇 가지 테스트에 대해서는 여기 를 참조 하십시오. 인덱스를 사용하는 경우 큰 데이터 세트에서 ST_Intersects 작업의 속도가 200 배 증가합니다.
Simbamangu

링크 Fezter 주셔서 감사합니다. 이 예제의 유일한 문제점은 경계 상자를 포함하기 위해 추가 SQL 코드를 작성해야한다는 것입니다. 공간 버전의 다음 버전이 이미 존재하는 공간 인덱스를 단순히 사용한다면 좋을 것입니다.
ajl

gis.stackexchange.com에 오신 것을 환영합니다! 이 사이트의 형식은 게시 된 답변이 원래 질문에 대한 답변이어야 함을 나타냅니다. 답변이나 의견에 답변 할 때는 의견을 제시하는 것이 가장 좋습니다.
Sean

답변:


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 그룹에 게시 할 수 있습니다. groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF

최신 버전의 Spatialite는 Virtual Spatial Index를 구현하며 위 구문은 더 이상 작동하지 않습니다. WHERE 절은 (SpatialIndex WHERE의 SELECT ROWID에서 f_table_name = 'map1'AND search_frame = map1.geometry)의 map2.ROWID로 다시 작성됩니다.
rudivonstaden

4

Eric Westra의 'Python Geospatial Development'페이지 188에서 CONTAINS 작업의 경우 관련 공간 인덱싱 절차를 따르는 경우 Spatialite가 MySQL 및 PostGIS보다 더 빠르게 실행될 수 있음을 알 수 있습니다.


단순한 쿼리가 MySQL InnoDB 엔진보다 SQLite에서 약 2 · 3 배 더 빠르기 때문에 "놀랍게도"아닙니다.
Michał Leon

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.