| 1 |
<!-- |
|---|
| 2 |
$Header: /var/lib/cvs/pgsql-fr/sgml/gist.sgml,v 1.4.2.1 2005/03/14 06:02:59 guillaume Exp $ |
|---|
| 3 |
--> |
|---|
| 4 |
|
|---|
| 5 |
<chapter Id="GiST"> |
|---|
| 6 |
<title>Index GiST</title> |
|---|
| 7 |
|
|---|
| 8 |
<sect1 id="intro"> |
|---|
| 9 |
<title>Introduction</title> |
|---|
| 10 |
|
|---|
| 11 |
<para> |
|---|
| 12 |
<acronym>GiST</acronym> est un acronyme pour <foreignphrase>Generalized |
|---|
| 13 |
Search Tree</foreignphrase>, c'est-à-dire arbre de recherche généralisé. |
|---|
| 14 |
C'est une méthode d'accès à une structure de type arbre de manière balancée, |
|---|
| 15 |
qui agit comme un modèle de base dans lequel il est possible d'implémenter |
|---|
| 16 |
des schémas d'indexage arbitraire. B+-trees, R-trees et de nombreux autres |
|---|
| 17 |
schémas d'indexage peuvent être implémentés avec <acronym>GiST</acronym>. |
|---|
| 18 |
</para> |
|---|
| 19 |
|
|---|
| 20 |
<para> |
|---|
| 21 |
Un avantage de <acronym>GiST</acronym> est qu'il autorise le développement |
|---|
| 22 |
de types de données personnalisés avec les méthodes d'accès appropriées, par |
|---|
| 23 |
un expert dans le domaine des types de données, plutôt que par un expert des |
|---|
| 24 |
bases de données. |
|---|
| 25 |
</para> |
|---|
| 26 |
|
|---|
| 27 |
<para> |
|---|
| 28 |
Les quelques informations disponibles ici ont été récupérées du <ulink |
|---|
| 29 |
url="http://gist.cs.berkeley.edu/">site web du projet d'indexage GiST de |
|---|
| 30 |
l'université de Californie</ulink> et de la thèse de Marcel Kornacker, |
|---|
| 31 |
<ulink url="http://citeseer.nj.nec.com/448594.html">Méthodes d'accès pour |
|---|
| 32 |
les systèmes de bases de données de la prochaine génération</ulink>. |
|---|
| 33 |
L'implémentation <acronym>GiST</acronym> de |
|---|
| 34 |
<productname>PostgreSQL</productname> est principalement maintenu |
|---|
| 35 |
par Teodor Sigaev et Oleg Bartunov. Leur site web, <ulink |
|---|
| 36 |
url="http://www.sai.msu.su/~megera/postgres/gist/"></>, dispose de plus |
|---|
| 37 |
d'informations. |
|---|
| 38 |
</para> |
|---|
| 39 |
|
|---|
| 40 |
</sect1> |
|---|
| 41 |
|
|---|
| 42 |
<sect1 id="extensibility"> |
|---|
| 43 |
<title>Extensibilité</title> |
|---|
| 44 |
|
|---|
| 45 |
<para> |
|---|
| 46 |
Traditionnellement, implémenter une nouvelle méthode d'accès à un index |
|---|
| 47 |
signifie un gros travail complexe. Il était nécessaire de comprendre les |
|---|
| 48 |
fonctionnements internes de la base de données, tels que le gestionnaire de |
|---|
| 49 |
verrous ou le WAL. L'interface <acronym>GiST</acronym> a un haut niveau |
|---|
| 50 |
d'abstraction, demandant à l'implémenteur de la méthode d'accès de |
|---|
| 51 |
n'implémenter que la sémantique du type de données en cours d'accès. La |
|---|
| 52 |
couche <acronym>GiST</acronym> elle-même prend garde aux accès concurrents, |
|---|
| 53 |
aux traces et à la recherche dans la structure en arbre. |
|---|
| 54 |
</para> |
|---|
| 55 |
|
|---|
| 56 |
<para> |
|---|
| 57 |
L'extensibilité ne devrait pas être confondue avec l'extensibilité des |
|---|
| 58 |
autres arbres de recherche standards en termes de données qu'ils gèrent. Par |
|---|
| 59 |
exemple, <productname>PostgreSQL</productname> supporte les B+-trees |
|---|
| 60 |
et R-trees extensibles. Ceci signifie que vous pouvez utiliser |
|---|
| 61 |
<productname>PostgreSQL</productname> pour construire un B+-tree ou un R-tree |
|---|
| 62 |
sur tout type de données que vous souhaitez. Mais, les B+-trees supportent |
|---|
| 63 |
seulement les prédicats sur une séquence (<literal><</literal>, |
|---|
| 64 |
<literal>=</literal>, <literal>></literal>) et les R-trees supportent |
|---|
| 65 |
seulement les requêtes sur les séquences n-D (contient, est contenu, |
|---|
| 66 |
équivaut). |
|---|
| 67 |
</para> |
|---|
| 68 |
|
|---|
| 69 |
<para> |
|---|
| 70 |
Donc, si vous indexez, disons, une collection d'images avec un B+-tree |
|---|
| 71 |
<productname>PostgreSQL</productname>, vous pouvez seulement lancer des |
|---|
| 72 |
requêtes telles que <quote>est-ce que imagex est égale à imagey</quote>, |
|---|
| 73 |
<quote>est-ce que imagex est plus petite que imagey</quote> et <quote>est-ce |
|---|
| 74 |
que imagex est plus grande que imagey</quote> ? Suivant votre façon de |
|---|
| 75 |
définir le <quote>égal à</quote>, le <quote>inférieur à</quote> ou le |
|---|
| 76 |
<quote>supérieur à</quote> dans ce contexte, cela peut être utile. |
|---|
| 77 |
Néanmoins, en utilisant un index basé sur <acronym>GiST</acronym>, vous |
|---|
| 78 |
pouvez créer des moyens de poser des questions spécifiques au domaine, |
|---|
| 79 |
peut-être <quote>trouver toutes les images de chevaux</quote> ou |
|---|
| 80 |
<quote>trouver toutes les images sur-exposées</quote>. |
|---|
| 81 |
</para> |
|---|
| 82 |
|
|---|
| 83 |
<para> |
|---|
| 84 |
Tout ce qui est nécessaire pour obtenir une méthode d'accès |
|---|
| 85 |
<acronym>GiST</acronym> fonctionnelle est d'implémenter sept méthodes |
|---|
| 86 |
définies par l'utilisateur, qui définissent le comportement des clés dans |
|---|
| 87 |
l'arbre. Bien sûr, ces méthodes doivent être particulièrement élaborées |
|---|
| 88 |
pour supporter des requêtes avancées mais pour toutes les requêtes standards |
|---|
| 89 |
(B+-trees, R-trees, etc.) elles sont relativement simples. En bref, |
|---|
| 90 |
<acronym>GiST</acronym> combine l'extensibilité avec la généralité, la |
|---|
| 91 |
ré-utilisation de code et une interface propre. |
|---|
| 92 |
</para> |
|---|
| 93 |
|
|---|
| 94 |
</sect1> |
|---|
| 95 |
|
|---|
| 96 |
<sect1 id="implementation"> |
|---|
| 97 |
<title>Implémentation</title> |
|---|
| 98 |
|
|---|
| 99 |
<para> |
|---|
| 100 |
Il existe sept méthodes qu'une classe d'opérateur d'index doit fournir pour |
|---|
| 101 |
<acronym>GiST</acronym> : |
|---|
| 102 |
</para> |
|---|
| 103 |
|
|---|
| 104 |
<variablelist> |
|---|
| 105 |
<varlistentry> |
|---|
| 106 |
<term>consistent</term> |
|---|
| 107 |
<listitem> |
|---|
| 108 |
<para> |
|---|
| 109 |
Suivant un prédicat <literal>p</literal> sur une page de l'arbre et une |
|---|
| 110 |
requête utilisateur, <literal>q</literal>, cette méthode doit renvoyer |
|---|
| 111 |
false s'il est certain qu'à la fois <literal>p</literal> et |
|---|
| 112 |
<literal>q</literal> ne peuvent pas être vrais pour un élément de |
|---|
| 113 |
données spécifié. |
|---|
| 114 |
</para> |
|---|
| 115 |
</listitem> |
|---|
| 116 |
</varlistentry> |
|---|
| 117 |
|
|---|
| 118 |
<varlistentry> |
|---|
| 119 |
<term>union</term> |
|---|
| 120 |
<listitem> |
|---|
| 121 |
<para> |
|---|
| 122 |
Cette méthode consolide les informations de l'arbre. Suivant une liste |
|---|
| 123 |
d'entrées, cette fonction génère un nouveau prédicat qui est vrai pour |
|---|
| 124 |
toutes les entrées. |
|---|
| 125 |
</para> |
|---|
| 126 |
</listitem> |
|---|
| 127 |
</varlistentry> |
|---|
| 128 |
|
|---|
| 129 |
<varlistentry> |
|---|
| 130 |
<term>compress</term> |
|---|
| 131 |
<listitem> |
|---|
| 132 |
<para> |
|---|
| 133 |
Convertit l'élément de données en un format convenable pour l'emplacement |
|---|
| 134 |
physique dans une page d'index. |
|---|
| 135 |
</para> |
|---|
| 136 |
</listitem> |
|---|
| 137 |
</varlistentry> |
|---|
| 138 |
|
|---|
| 139 |
<varlistentry> |
|---|
| 140 |
<term>decompress</term> |
|---|
| 141 |
<listitem> |
|---|
| 142 |
<para> |
|---|
| 143 |
L'inverse de la fonction <function>compress</function>. Convertit la |
|---|
| 144 |
représentation de l'élément donné en un format manipulable par la base |
|---|
| 145 |
de données. |
|---|
| 146 |
</para> |
|---|
| 147 |
</listitem> |
|---|
| 148 |
</varlistentry> |
|---|
| 149 |
|
|---|
| 150 |
<varlistentry> |
|---|
| 151 |
<term>penalty</term> |
|---|
| 152 |
<listitem> |
|---|
| 153 |
<para> |
|---|
| 154 |
Renvoie une valeur indiquant le <quote>coût</quote> d'une insertion |
|---|
| 155 |
d'une nouvelle entrée dans une branche particulière de l'arbre. Les |
|---|
| 156 |
éléments seront insérés en bas du chemin de la plus petite pénalité |
|---|
| 157 |
(<function>penalty</function>) de l'arbre. |
|---|
| 158 |
</para> |
|---|
| 159 |
</listitem> |
|---|
| 160 |
</varlistentry> |
|---|
| 161 |
|
|---|
| 162 |
<varlistentry> |
|---|
| 163 |
<term>picksplit</term> |
|---|
| 164 |
<listitem> |
|---|
| 165 |
<para> |
|---|
| 166 |
Quand une séparation de page est nécessaire, cette fonction décide des |
|---|
| 167 |
entrées qui resteront sur l'ancienne page et de celles qui seront |
|---|
| 168 |
déplacées sur la nouvelle. |
|---|
| 169 |
</para> |
|---|
| 170 |
</listitem> |
|---|
| 171 |
</varlistentry> |
|---|
| 172 |
|
|---|
| 173 |
<varlistentry> |
|---|
| 174 |
<term>same</term> |
|---|
| 175 |
<listitem> |
|---|
| 176 |
<para> |
|---|
| 177 |
Renvoie true si deux entrées sont identiques, false autrement. |
|---|
| 178 |
</para> |
|---|
| 179 |
</listitem> |
|---|
| 180 |
</varlistentry> |
|---|
| 181 |
|
|---|
| 182 |
</variablelist> |
|---|
| 183 |
|
|---|
| 184 |
</sect1> |
|---|
| 185 |
|
|---|
| 186 |
<sect1 id="limitations"> |
|---|
| 187 |
<title>Limitations</title> |
|---|
| 188 |
|
|---|
| 189 |
<para> |
|---|
| 190 |
L'implémentation actuelle de <acronym>GiST</acronym> dans |
|---|
| 191 |
<productname>PostgreSQL</productname> a quelques grosses limitations : |
|---|
| 192 |
l'accès de <acronym>GiST</acronym> n'est pas concurrent ; l'interface de |
|---|
| 193 |
<acronym>GiST</acronym> ne permet pas le développement de certains types de |
|---|
| 194 |
données, tels que les arbres numériques (voir les papiers d'Aoki) ; et |
|---|
| 195 |
il n'existe pas encore de support pour les WAL de mises à jour dans les |
|---|
| 196 |
index <acronym>GiST</acronym>. |
|---|
| 197 |
</para> |
|---|
| 198 |
|
|---|
| 199 |
<para> |
|---|
| 200 |
Les solutions aux problèmes de concurrence apparaissent dans la thèse de |
|---|
| 201 |
Marcel Kornacker ; néanmoins, ces idées n'ont pas encore été mises en |
|---|
| 202 |
pratiques dans l'implémentation de <productname>PostgreSQL</productname>. |
|---|
| 203 |
</para> |
|---|
| 204 |
|
|---|
| 205 |
<para> |
|---|
| 206 |
Le manque de WAL est un simple soucis de programmation mais comme cela n'a pas |
|---|
| 207 |
encore été fait, un arrêt brutal pourrait rendre un index |
|---|
| 208 |
<acronym>GiST</acronym> inconsistant, forçant le lancement d'un REINDEX. |
|---|
| 209 |
</para> |
|---|
| 210 |
|
|---|
| 211 |
</sect1> |
|---|
| 212 |
|
|---|
| 213 |
<sect1 id="examples"> |
|---|
| 214 |
<title>Exemples</title> |
|---|
| 215 |
|
|---|
| 216 |
<para> |
|---|
| 217 |
Pour voir les exemples d'implémentations de méthodes d'indexage utilisant |
|---|
| 218 |
<acronym>GiST</acronym>, examinez les modules contrib suivants : |
|---|
| 219 |
</para> |
|---|
| 220 |
|
|---|
| 221 |
<variablelist> |
|---|
| 222 |
<varlistentry> |
|---|
| 223 |
<term>btree_gist</term> |
|---|
| 224 |
<listitem> |
|---|
| 225 |
<para>B-Tree</para> |
|---|
| 226 |
</listitem> |
|---|
| 227 |
</varlistentry> |
|---|
| 228 |
|
|---|
| 229 |
<varlistentry> |
|---|
| 230 |
<term>cube</term> |
|---|
| 231 |
<listitem> |
|---|
| 232 |
<para>Indexage de cube multi-dimensionnel</para> |
|---|
| 233 |
</listitem> |
|---|
| 234 |
</varlistentry> |
|---|
| 235 |
|
|---|
| 236 |
<varlistentry> |
|---|
| 237 |
<term>intarray</term> |
|---|
| 238 |
<listitem> |
|---|
| 239 |
<para>RD-Tree pour un tableau à une dimension de valeurs int4</para> |
|---|
| 240 |
</listitem> |
|---|
| 241 |
</varlistentry> |
|---|
| 242 |
|
|---|
| 243 |
<varlistentry> |
|---|
| 244 |
<term>ltree</term> |
|---|
| 245 |
<listitem> |
|---|
| 246 |
<para>Indexage des structures de type arbre</para> |
|---|
| 247 |
</listitem> |
|---|
| 248 |
</varlistentry> |
|---|
| 249 |
|
|---|
| 250 |
<varlistentry> |
|---|
| 251 |
<term>rtree_gist</term> |
|---|
| 252 |
<listitem> |
|---|
| 253 |
<para>R-Tree</para> |
|---|
| 254 |
</listitem> |
|---|
| 255 |
</varlistentry> |
|---|
| 256 |
|
|---|
| 257 |
<varlistentry> |
|---|
| 258 |
<term>seg</term> |
|---|
| 259 |
<listitem> |
|---|
| 260 |
<para>Stockage et accès indexé pour les <quote>nombres |
|---|
| 261 |
flottants</quote></para> |
|---|
| 262 |
</listitem> |
|---|
| 263 |
</varlistentry> |
|---|
| 264 |
|
|---|
| 265 |
<varlistentry> |
|---|
| 266 |
<term>tsearch and tsearch2</term> |
|---|
| 267 |
<listitem> |
|---|
| 268 |
<para>Indexage de texte complet</para> |
|---|
| 269 |
</listitem> |
|---|
| 270 |
</varlistentry> |
|---|
| 271 |
</variablelist> |
|---|
| 272 |
|
|---|
| 273 |
</sect1> |
|---|
| 274 |
|
|---|
| 275 |
</chapter> |
|---|