Spatialite é realmente lento?

9

Eu tenho alguns milhares de polígonos no SpatiaLite. Estou tentando fazer uma consulta "toques":

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

e uau, é LENTO!

No entanto, se eu pedir para fazer apenas uma parcela no map1, ele será executado muito rápido.

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

Espero que a primeira consulta seja mais lenta, mas é incrivelmente lenta. Ele roda muito rápido no SQLServer, Manifold GIS e PostGIS. Spatialite é realmente realmente ineficiente?

ajl
fonte
9
Veja aqui alguns testes sobre a velocidade da espacialidade - sugere um aumento de 200 vezes na velocidade de uma operação ST_Intersects em um grande conjunto de dados SE você usar índices!
Simbamangu 2/10/12
obrigado pelo link Fezter. O único problema com esse exemplo foi que ele precisou escrever código SQL extra para incluir uma caixa delimitadora (e teve que forçar a alimentação do envelope). Seria bom se a próxima versão do spatialite simplesmente fizesse uso dos índices espaciais que já estão lá.
AJL
Bem-vindo ao gis.stackexchange.com! O formato deste site implica que as respostas postadas devem ser respostas à pergunta original. Ao responder a uma resposta ou comentário, é melhor fazer um comentário.
21412 Sean

Respostas:

16

Não, o SpatiaLite não é tão lento, você só precisa usar um índice espacial. Devido a limitações no design do SQLite, o uso de um índice espacial em uma consulta não é tão invisível quanto no PostGIS.

Aqui está um exemplo modificado do SpatiaLite Cookbook http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html

Depois de criar um índice espacial em seus conjuntos de dados de polígonos

    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
fonte
DavidF: obrigado pela sua resposta. Isso definitivamente vai acelerar as coisas. É uma pena que as operações espaciais não usem implicitamente o índice espacial. No entanto, suponho que a última cláusula AND possa ser implementada em qualquer consulta que seja realizada. Você acha que um dia espacial irá apoiar implicitamente os índices espaciais?
Meu entendimento é que o problema é inerente à arquitetura do SQLite. Você pode definitivamente postar no SpatiaLite Google Group com mais perguntas. groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF
Observe que as versões mais recentes do Spatialite implementam um Índice espacial virtual e a sintaxe acima não funciona mais. A cláusula WHERE seria reescrita como WHERE map2.ROWID em (SELECT ROWID de SpatialIndex WHERE f_table_name = 'map1' AND search_frame = map1.geometry)
rudivonstaden
4

No livro de Eric Westra 'Python Geospatial Development', a página 188 mostra que, para a operação CONTAINS, pelo menos o Spatialite pode, talvez surpreendentemente, rodar mais rápido que o MySQL e o PostGIS - se o procedimento de indexação espacial envolvido for seguido.

John Steedman
fonte
Não é "surpreendente", pois as consultas simples são executadas cerca de 2 ·· 3 × mais rápido no SQLite do que no mecanismo MySQL InnoDB.
Michał Leon
3

Eu escrevi um blog sobre isso há um tempo. Consulte http://www.frogmouth.net/blog/?p=23

Micha também escreveu um blog interessante sobre esse assunto .

BradHards
fonte