[QGIS-Developer] Regular vs spatialite sqlite database
a.furieri at lqt.it
a.furieri at lqt.it
Mon Jul 24 03:50:12 PDT 2017
On Mon, 24 Jul 2017 11:32:17 +0200, enrico chiaradia wrote:
> My second implementation uses Spatialite DB but I found it
> surprisingly slower than shapefile ...
>
> In my last implementation, I used a mixed approach, creating both
> shapefiles to store geometries and regular sqlite db to store simple
> tables. That is fast and space saving but it generates too much
> files.
>
Hi Enrico,
SpatiaLite simply is an extension to SQLite, so both them will
have exactly the same identical speed when handling regular
(non Spatial) Tables.
Things are slightly different when handling Spatial Tables:
1. INSERT/UPDATE: SpatiaLite thoroughly checks any Geometry
before physically modifying the database; only geometries
safely matching the declared Type, SRID and Dimensions are
then accepted.
This leads to robustly consistent and well affordable
databases, but obviously requires some (small) extra
time.
2. if the Spatial Table is supported by one (or more)
Spatial Index any INSERT, UPDATE or DELETE will
always take care of properly synchronizing the Spatial
Index (a costly operation) so this will surely add some
further delay.
3. read operations (SELECT): SpatiaLite is usually faster
then Shapefiles, most notably when several layers are
involved. Accessing a monolithic SpatiaLite DB
containing tenths (or hundredths) layers is expected
to be a far more efficient process than accessing many
sparse Shapefiles.
4. and if your layers (Spatial Table) are adequately
supported by some Spatial Index you'll easily
discover that SpatiaLite can be surprisingly fast.
conclusion: it's a trade-off (as always).
we usually bargain some reasonable slowness when
writing so to get maximum speed when reading.
usually write operations happen rather infrequently
whilst read operations are very frequents, so the
final outcome is expected to be widely positive.
Final remark: you say us nothing about the fine
implementation details of your own Phyton code.
Both SQLite and SpatiaLite have an inherently
transactional nature: this practically means that
if you don't properly handle transactions (by
declaring BEGIN and COMMIT statements where
appropriate) all write operations (INSERT,
UPDATE and/or DELETE) can easily become slow
(_VERY_ slow, may well be deadly slow).
I'm not sure if this could be your specific
case, but carefully checking if the code
correctly handles transactions always is
a good programming practice.
bye Sandro
More information about the QGIS-Developer
mailing list