Index spatiaux générés par DB2 Spatial Extender
Le module IBM DB2 Spatial Extender offre un index spatial à trois niveaux de grille permettant aux applications d'interroger les données géographiques bidimensionnelles contenues dans une colonne spatiale et d'identifier rapidement l'ensemble des géométries situées dans une étendue donnée.
L'index spatial bidimensionnel diffère de l'index d'arborescence B hiérarchique traditionnel fourni par DB2. Ce dernier peut ne pas être appliqué à une colonne spatiale, la caractéristique bidimensionnelle de la colonne spatiale nécessitant la structure d'un index spatial. De même, il est impossible d'appliquer un index spatial à une colonne non spatiale et un index spatial ne peut être appliqué à aucune colonne composite.
Par conséquent, la syntaxe CREATE INDEX de l'index spatial comprend la clause supplémentaire USING, qui indique à DB2 d'utiliser l'index spatial Spatial Extender plutôt qu'un index d'arborescence B. La syntaxe complète est la suivante :
CREATE INDEX <index_name> ON <table> (<spatial column>) USING db2gse.spatial_index (<grid level 1>, [grid level 2], [grid level 3])
L'ajout de la clause USING distingue l'index spatial de l'index d'arborescence B. Le nom de structure db2gse doit compléter le nom de l'extension spatial_index, car cette instruction ne suit pas le chemin de fonction courant.
A cause de la simplicité des données indexées par une arborescence B, le concepteur de base de données indique simplement à DB2 de créer l'index sur une ou plusieurs colonnes de tableau. Toutefois, la complexité des données spatiales exige de la part du concepteur de comprendre leur distribution de taille relative. Le concepteur doit déterminer la taille optimale et le nombre des niveaux de grille de l'index spatial.
Les niveaux de grille ([niveau de grille 1], [niveau de grille 2], [niveau de grille 3]) sont saisis par taille de cellule croissante. Le deuxième niveau doit donc avoir une taille de cellule supérieure au premier et le troisième une taille de cellule supérieure au second. Le premier niveau de grille est obligatoire, mais vous pouvez désactiver le deuxième et le troisième niveau en spécifiant une valeur nulle (0).
Procédure de génération d'un index spatial par Spatial Extender
Le module DB2 Spatial Extender construit un index spatial selon la procédure suivante :
- Spatial Extender superpose l'enveloppe de chaque géométrie à la grille, en commençant par le premier niveau.
- Si moins de quatre intersections existent avec le premier niveau de grille, Spatial Extender saisit l'identifiant de la géométrie et les identifiants des cellules de grille intersectées dans l'index spatial et renouvelle l'opération avec la géométrie suivante.
- Si Spatial Extender détecte plus de quatre intersections, il superpose la géométrie au deuxième niveau de grille. Si vous n'avez pas activé le deuxième niveau de grille, Spatial Extender saisit l'identifiant de la géométrie et les identifiants des cellules de grille dans l'index spatial et renouvelle l'opération avec la géométrie suivante.
- Si moins de quatre intersections existent avec le deuxième niveau de grille, Spatial Extender saisit l'identifiant de la géométrie et les identifiants des cellules de grille intersectées dans l'index spatial et renouvelle l'opération avec la géométrie suivante.
- Si Spatial Extender détecte plus de quatre intersections, il superpose la géométrie avec le troisième niveau de grille. Si vous n'avez pas activé le troisième niveau de grille, Spatial Extender saisit l'identifiant de la géométrie et les identifiants des cellules de grille dans l'index spatial et renouvelle l'opération avec la géométrie suivante.
- Spatial Extender saisit l'identifiant de la géométrie et les identifiants des cellules de grille intersectées du troisième niveau dans l'index spatial et renouvelle l'opération avec la géométrie suivante.
En réalité, Spatial Extender ne crée aucune structure de grille surfacique. Spatial Extender définit chaque niveau de grille à l'aide de paramètres en définissant l'origine par les décalages x,y du système de référence spatiale de la colonne qui s'étend dans l'espace de coordonnées positives. A l'aide d'une grille paramétrique, Spatial Extender génère les intersections de façon mathématique.
Utilisation de l'index spatial par Spatial Extender
Spatial Extender se sert de l'index spatial pour améliorer les performances des requêtes spatiales. La requête de zone — la requête la plus simple et certainement la plus utilisée — renvoie les géométries d'une colonne spatiale qui recoupent une zone définie par l'utilisateur. Si l'index spatial n'existe pas, Spatial Extender doit comparer chaque géométrie d'une colonne spatiale avec la zone.
A l'aide de l'index spatial, Spatial Extender identifie les entrées de la grille d'index qui recoupent la zone. Puisque l'index spatial est trié sur une grille, Spatial Extender obtient rapidement une liste de géométries candidates. Ce processus est nommé premier passage.
Un deuxième passage parcourt la liste de géométries candidates et disqualifie les géométries dont l'enveloppe ne recoupe pas la zone.
Un troisième passage compare les coordonnées réelles des géométries candidates avec la zone pour déterminer si la géométrie recoupe la zone ou non. Ce dernier processus de comparaison complexe est exécuté sur un sous-ensemble de lignes de table, considérablement réduit par les deux premiers passages.
Toutes les requêtes spatiales exécutent ces trois passages à l'exception de la fonction EnvelopesIntersect, qui n'exécute que les deux premiers passages. La fonction EnvelopesIntersect a été conçue pour les opérations d'affichage qui utilisent des routines de découpage du pilote d'affichage et n'exigent pas la granularité du troisième passage.
Tailles optimales de cellule de grille
La sélection de la taille de cellule de grille est compliquée par le fait que les enveloppes des géométries de forme irrégulière ne s'inscrivent pas proprement dans une cellule de grille. A cause de cette irrégularité, certaines enveloppes de géométries recoupent plusieurs grilles, pendant que d'autres s'inscrivent dans une seule cellule de grille. Inversement, les cellules de grille peuvent recouper plusieurs enveloppes de géométries, selon la distribution spatiale des données.
Un index spatial offre de bonnes performances si vous activez le nombre de niveaux qui convient et si les tailles de cellule de grille sont adaptées aux données. Pour simplifier cette discussion, considérez tout d'abord une colonne spatiale contenant des géométries de taille uniforme. Dans ce cas, il est superflu de créer un index spatial multiniveaux puisqu'un seul niveau de grille suffit. Créez un index spatial avec un seul niveau de grille dont la taille de cellule de grille est 1,5 fois la taille moyenne des enveloppes de géométries.
Puisque les données ponctuelles ont une enveloppe réduite, la taille de grille peut également être réduite.
En règle générale, la taille de grille doit être d'environ un dixième de la taille typique d'une fenêtre de requête. Pour les données ponctuelles, un seul niveau de grille est nécessaire.
Lors des essais de votre application, vous pouvez constater de meilleures performances avec une plus grande taille de cellule de grille puisque chaque cellule de grille référence plus de géométries, permettant au premier passage d'éliminer plus rapidement les géométries non éligibles. Toutefois, si vous continuez à augmenter la taille de cellule de grille, les performances diminuent avec l'augmentation du nombre de géométries filtrées par le deuxième passage.
DB2 Spatial Extender propose l'utilitaire Index Advisor qui permet la création d'un index de grille simulé et le réglage de cet index pour servir de modèle à un vrai index. Cet utilitaire indique également s'il convient de conserver ou de remplacer un index de grille existant.
Voici un exemple d'utilisation de l'utilitaire Index Advisor pour obtenir des informations détaillées sur un index de grille existant. Dans cet exemple, le nom complet de l'index de grille est mydb.myindex :
gseidx connect to mydb user test using test get geometry statistics for index mydb.myindex detail
Les fonctions shp2sde et cov2sde utilisent un algorithme similaire pour le calcul de l'index spatial par défaut pour la taille de grille de niveau 1 lorsque l'option facultative –g n'est pas spécifiée. Les valeurs par défaut pour les tailles de grille de niveau 2 et 3 sont toujours définies sur ZERO, avec shp2sde basé sur l'étendue du fichier de formes et cov2sde basé sur l'étendue de la couverture ArcInfo. Pour plus d'informations sur l'utilisation des commandes shp2sde et cov2sde, reportez-vous au manuel ArcSDE Administration Command Reference fourni avec ArcSDE.
Sélection du nombre de niveaux
Les colonnes spatiales contiennent rarement des géométries de taille similaire. Toutefois, les géométries de la plupart des colonnes spatiales peuvent être regroupées en intervalles de tailles. Prenons par exemple une colonne spatiale de parcelles de comté contenant un nombre important de petites parcelles, regroupées dans les surfaces urbaines, entourées par quelques grandes parcelles rurales. Ces situations sont courantes et nécessitent l'utilisation d'un index spatial multiniveaux. Pour choisir les tailles de cellule de grille de chaque niveau, déterminez les intervalles des tailles d'enveloppe des géométries. Créez un index spatial avec des niveaux ayant des tailles de cellule de grille légèrement supérieures à chaque intervalle. Testez l'index en exécutant des requêtes sur la colonne spatiale à l'aide de votre application. Essayez d'ajuster légèrement les tailles de grille à la hausse ou à la baisse pour déterminer si une amélioration sensible de performance peut être constatée.
Pour plus d'informations sur cette rubrique, reportez-vous au chapitre 11, "Utilisation d'index et de vues pour l'accès aux données spatiales", du Guide de l'utilisateur DB2 Spatial Extender d'IBM.