Spatialiteは本当に遅いのですか?


9

SpatiaLiteには数千のポリゴンがあります。「タッチ」クエリを実行しようとしています。

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

うわー、遅いですか!

ただし、map1の1つの区画に対してのみ実行するように要求すると、それは非常に高速に実行されます。

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

最初のクエリの実行速度は遅くなると思いますが、驚くほど遅いです。SQLServer、マニホールドGIS、PostGISで非常に高速に実行されます。Spatialiteは本当に非効率的ですか?


9
スペーシャライトの速度に関するいくつかのテストについては、こちらを参照してください。インデックスを使用する場合、大規模なデータセットでのST_Intersects操作の速度が200倍になることを示唆しています。
シンバマング2012年

リンクFezterをありがとう。この例の唯一の問題は、バウンディングボックスを含めるために追加のSQLコードを作成する必要があったことです(そして、エンベロープを強制的にフィードしなければなりませんでした)。次のバージョンのspatialiteが、すでにそこにある空間インデックスを単に利用することは素晴らしいことです。
AJL

gis.stackexchange.comへようこそ!このサイトの形式は、投稿された回答が元の質問に対する回答であることを意味します。回答またはコメントに応答するときは、コメントにすることが最善です。
Sean

回答:


16

いいえ、SpatiaLiteはそれほど遅くはありません。空間インデックスを使用する必要があるだけです。SQLiteの設計上の制限により、クエリで空間インデックスを使用することは、PostGISの場合ほど不可視ではありません。

以下は、SpatiaLiteクックブック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句は、クエリ1が発行するすべてのクエリに追加できると思います。いつの日か、spatialiteが暗黙的に空間インデックスをサポートすると思いますか?

私の理解では、この問題はSQLiteのアーキテクチャに固有のものである。ただし、さらに質問があればSpatiaLite Googleグループに投稿できます。 groups.google.com/forum/?fromgroups#!forum/spatialite-users
DavidF

Spatialiteの最新バージョンは仮想空間インデックスを実装しており、上記の構文は機能しないことに注意してください。WHERE句は、WHERE map2.ROWID in(SELECT ROWID from SpatialIndex WHERE f_table_name = 'map1' AND search_frame = map1.geometry)
rudivonstaden

4

Eric Westraの著書「Python Geospatial Development」の188ページは、CONTAINS操作の場合、少なくともSpatialiteが、おそらく驚くべきことに、MySQLやPostGISよりも高速に実行できることを示しています(関係する空間インデックス手順に従っている場合)。


「驚くほど」ではありません。単純なクエリは、MySQL InnoDBエンジンよりもSQLiteの方が約2・3倍速く実行されるためです。
のMichałレオン

3

私はしばらく前にこれについてブログを書いた。http://www.frogmouth.net/blog/?p=23を参照してください

Michaはまた、このトピックに関して興味深いブログを書いています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.