Recette
#10: |
|
Février 2011 |
Un Index Spatial est plus ou moins identique à un
Index normal: i.e. le rôle de tout index est de permettre un
accès très rapide à une sélection d'éléments parmi un grand
nombre de données. |
Il existe plusieurs algorithmes d'INDEX SPATIAL.
Dans
SQLite, l'index spatial est basé sur l'algorithme R*Tree.
En simplifiant, un R*Tree défini une structure de type
arborée, basée sur des rectangles (le R
de R*Tree signifie Rectangle).
Toute géométrie peut être représentée comme un rectangle,
peut importe sa forme originale: on peut utiliser le MBR
(Minimum Bounding Rectangle) ie le rectangle minimum englobant
la géométrie.
Peut être le terme BBOX
(Bounding Box) vous est-il plus familier: ce sont des
synonymes.
Il est facile de comprendre comment R*Tree
fonctionne:
La requête spatiale définit un cadre de recherche arbitraire (qui s'avère être un rectangle également)
le R*Tree est rapidement scanné afin d'identifier l'index de tous les rectangles intersectant ce cadre
au final, toute géométrie qui se trouve dans ce cadre de recherche va être identifié.
Appliquons cela au problème de l'aiguille dans la botte de foin: utiliser un R*Tree est une excellente solution permettant de retrouver l'aiguille en un temps record, même si il y a énormément de paille !
Erreurs fréquentes “j'ai une table avec plusieurs milliers de points
disséminés à travers le monde:
|
SQLite's et R*Tree SQLite implémente une excellente version de R*Tree: cependant,
certains détails pourraient paraître assez exotiques pour les
utilisateurs d'autres SGBD spatiaux (comme POSTGIS ou autre).
Chaque table R*Tree ressemble à celle-ci:
La logique interne de R*Tree est implémenté par la table virtuel, de façon totalement transparente pour l'utilisateur. |
SpatiaLite et R*Tree Tout Indice Spatial SpatiaLite repose entièrement sur le
couple SQLite/ R*Tree.
Dans SpatiaLite, les index spatiaux adoptent toujours la même convention de nommage:
Cependant, utiliser les index spatiaux afin d'optimiser les
requêtes est un peu plus difficile que dans d'autres SGBD
Spatiaux, car il n'y a pas d’intégration serrée entre la table
indexée et le R*Tree correspondant: du point de vue de SQLite, ce
sont deux tables distinctes. |
SELECT CreateSpatialIndex('local_councils', 'geometry'); SELECT CreateSpatialIndex('populated_places', 'geometry'); |
C'est tout ce dont vous avez besoin pour créer un index spatial sur la colonne geometry d'une table.
SELECT DiscardSpatialIndex('local_councils', 'geometry'); |
Ceci va désactiver l'index spatial:
note: cela ne va pas supprimer physiquement l'index spatial, mais sa synchronisation avec la table.
les TRIGGER seront supprimés et les tables metadata modifiées afin de désactiver l'index spatial.
SpatiaLite supporte un second type d'index spatial, basé sur
le MBR-caching. (mise en cache du MBR) |
|
Author: Alessandro Furieri a.furieri@lqt.it |
This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. |
|
|
|
Permission is granted to copy, distribute and/or modify this
document under the terms of the |