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?


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: 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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.