Spatialite Gerçekten Yavaş mı?


9

SpatiaLite'de birkaç bin çokgenim var. Bir "dokunuşlar" sorgusu yapmaya çalışıyorum:

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

ve vay, YAVAŞ mı?

Ancak, sadece map1 bir parsel için yapmasını istersem, gerçekten hızlı çalışır.

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

İlk sorgu yavaş çalışmasını bekliyoruz, ama inanılmaz yavaş. SQLServer, Manifold GIS ve PostGIS'de çok hızlı çalışır. Spatialite gerçekten verimsiz mi?


9
Spatialitin hızıyla ilgili bazı testler için buraya bakın - dizinler kullanıyorsanız, büyük bir veri kümesinde ST_Intersects işlemi için 200 kat hız artışı önerir!
Simbamangu

bağlantı için teşekkürler Fezter. Bu örnekle ilgili tek sorun, bir sınırlayıcı kutu eklemek için ekstra SQL kodu yazması gerekti (ve zarfı beslemeye zorlamak zorunda kalması). Spatialitin bir sonraki versiyonunun zaten var olan mekansal indeksleri kullanması güzel olurdu.
ajl

Gis.stackexchange.com'a hoş geldiniz! Bu sitenin biçimi, gönderilen yanıtların orijinal sorunun yanıtları olması gerektiği anlamına gelir. Bir cevaba veya yoruma yanıt verirken en iyisi yorum yapmaktır.
Sean

Yanıtlar:


16

Hayır, SpatiaLite o kadar yavaş değil, sadece uzamsal bir dizin kullanmanız gerekiyor. SQLite tasarımındaki sınırlamalar nedeniyle, bir sorguda uzamsal bir dizin kullanmak PostGIS'deki kadar görünmez değildir.

SpatiaLite Yemek Kitabı'ndan değiştirilmiş bir örnek http://www.gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/neighbours.html

Çokgen veri kümelerinizde uzamsal bir dizin oluşturduktan sonra

    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: Cevabınız için teşekkürler. Bu kesinlikle işleri hızlandıracak. Mekansal operasyonların mekânsal indeksi örtük olarak kullanmaması çok kötü. Ancak, son ve yan tümce herhangi bir sorgu bir sorun tacked varsayalım. Mekansalın bir gün mekânsal indeksleri dolaylı olarak destekleyeceğini düşünüyor musunuz?

Anladığım kadarıyla, sorun SQLite mimarisinin doğasında var. Yine de SpatiaLite Google Grubuna daha fazla soru gönderebilirsiniz. groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF

Spatialite'nin en son sürümlerinin bir Sanal Mekansal İndeks uyguladığını ve yukarıdaki sözdiziminin artık çalışmadığını unutmayın. WHERE deyimi WHERE map2.ROWID olarak yeniden yazılır (SpatialIndex'ten ROWID SEÇİN WHERE f_table_name = 'map1' AND search_frame = map1.geometry)
8

4

Eric Westra'nın 'Python Geospatial Development' sayfasında 188, CONTAINS işlemi için, ilgili uzamsal indeksleme prosedürü takip edilirse, en azından Spatialite'nin belki de şaşırtıcı bir şekilde MySQL ve PostGIS'ten daha hızlı çalışabileceğini göstermektedir.


Basit sorgular SQLite'de MySQL InnoDB motorunda olduğundan yaklaşık 2 ·· 3 × daha hızlı çalıştığından "şaşırtıcı bir şekilde" değil.
Michał Leon

3

Bir süre önce bununla ilgili bir blog yazdım. Bkz. Http://www.frogmouth.net/blog/?p=23

Micha da bu konuda ilginç bir blog yazdı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.