root/traduc/branches/bv747/manuel/indexcost.sgml

Revision 13, 9.2 kB (checked in by gleu, 3 years ago)

Suite de l'import pour le passage CVS à SVN.

Line 
1 <!--
2 $Header: /var/lib/cvs/pgsql-fr/sgml/indexcost.sgml,v 1.5.2.1 2005/03/14 06:02:59 guillaume Exp $
3 -->
4
5  <chapter id="indexcost">
6   <title>Fonctions d'estimation du coût des index</title>
7
8   <note>
9    <title>Auteur</title>
10
11    <para>
12     Écrit par Tom Lane (<email>tgl@sss.pgh.pa.us</email>) le 24 janvier 2000.
13    </para>
14   </note>
15
16    <note>
17     <para>
18      Ceci pourra faire partie d'un futur chapitre plus étoffé sur la
19      façon d'écrire des nouvelles méthodes d'accès aux index.
20     </para>
21    </note>
22
23   <para>
24    Chaque méthode d'accès aux index doit fournir une fonction d'estimation de
25    coût qui est utilisée par l'optimiseur de requêtes. L'OID de procédure de
26    cette fonction est donné dans le champ <literal>amcostestimate</literal>
27    de la ligne correspondant à cette méthode d'accès dans la table
28    <literal>pg_am</literal>.
29
30    <note>
31     <para>
32      Avant <productname>PostgreSQL</productname> 7.0, un mécanisme différent
33      était utilisé pour enregistrer les fonctions d'estimation de coût
34      spécifiques des index.
35     </para>
36    </note>
37   </para>
38
39   <para>
40    La fonction amcostestimate reçoit en paramètres une liste de clauses
41    WHERE pour lesquelles il a été déterminé qu'elles peuvent utiliser
42    cet index. Elle doit retourner le coût estimé d'accès à l'index et la
43    sélectivité de la clause WHERE, c'est-à-dire la fraction de la table
44    principale qui sera retournée par le parcours de l'index.
45    Dans les cas simples, pratiquement tout le travail d'estimation de coût
46    peut être réalisé en appelant des routines standard de l'optimiseur&nbsp;;
47    La fonction amcostestimate ne sert qu'à permettre à la méthode d'accès
48    d'ajouter sa connaissance spécifique du type d'index, au cas où il serait
49    possible d'améliorer l'estimation standard.
50   </para>
51
52   <para>
53    Chaque fonction amcostestimate doit avoir la signature suivante&nbsp;:
54
55    <programlisting>
56 void
57 amcostestimate (Query *root,
58                 RelOptInfo *rel,
59                 IndexOptInfo *index,
60                 List *indexQuals,
61                 Cost *indexStartupCost,
62                 Cost *indexTotalCost,
63                 Selectivity *indexSelectivity,
64                 double *indexCorrelation);
65    </programlisting>
66
67    Les quatre premiers paramètres sont des entrées&nbsp;:
68
69    <variablelist>
70     <varlistentry>
71      <term>root</term>
72      <listitem>
73       <para>
74        La requête traitée.
75       </para>
76      </listitem>
77     </varlistentry>
78
79     <varlistentry>
80      <term>rel</term>
81      <listitem>
82       <para>
83        La relation sur laquelle porte l'index.
84       </para>
85      </listitem>
86     </varlistentry>
87
88     <varlistentry>
89      <term>index</term>
90      <listitem>
91       <para>
92        L'index lui même.
93       </para>
94      </listitem>
95     </varlistentry>
96
97     <varlistentry>
98      <term>indexQuals</term>
99      <listitem>
100       <para>
101        La liste des clauses qualifiées pour l'index (implicitement
102        reliées par des ET logiques)&nbsp;; une liste NIL indique qu'aucune
103        clause n'est qualifiée.
104       </para>
105      </listitem>
106     </varlistentry>
107    </variablelist>
108   </para>
109
110   <para>
111    Les quatre derniers paramètres sont des sorties passées par référence&nbsp;:
112
113    <variablelist>
114     <varlistentry>
115      <term>*indexStartupCost</term>
116      <listitem>
117       <para>
118        Coût du démarrage du traitement de l'index
119       </para>
120      </listitem>
121     </varlistentry>
122
123     <varlistentry>
124      <term>*indexTotalCost</term>
125      <listitem>
126       <para>
127        Coût total de traitement de l'index
128       </para>
129      </listitem>
130     </varlistentry>
131
132     <varlistentry>
133      <term>*indexSelectivity</term>
134      <listitem>
135       <para>
136        Sélectivité de l'index
137       </para>
138      </listitem>
139     </varlistentry>
140
141     <varlistentry>
142      <term>*indexCorrelation</term>
143      <listitem>
144       <para>
145        Coefficient de corrélation entre l'ordre de lecture de l'index
146        et l'ordre de la table sous-jacente.
147       </para>
148      </listitem>
149     </varlistentry>
150    </variablelist>
151   </para>
152
153   <para>
154    Notez que les fonctions d'estimation de coût doivent être écrites en C,
155    pas en SQL ou avec un autre des langages de programmation disponibles,
156    car elles doivent accéder aux structures de données internes de
157    l'optimiseur.
158   </para>
159
160   <para>
161    Le coût d'accès aux index doit être calculé avec les unités utilisées dans
162    <filename>src/backend/optimizer/path/costsize.c</filename>&nbsp;: la lecture
163    séquentielle d'un bloc a un coût de 1,0, une lecture non séquentielle a un
164    coût de random_page_cost et le coût de traitement d'une ligne d'index a
165    généralement un coût de cpu_index_tuple_cost (qui est un paramètre
166    réglable par l'utilisateur).
167    De plus, un multiple approprié de cpu_operator_cost doit être ajouté pour
168    chaque opérateur de comparaison appelé lors du traitement de l'index et,
169    spécialement, pour l'évaluation des indexQuals eux-mêmes.
170   </para>
171
172   <para>
173    Le coût d'accès doit inclure chaque coût disque et CPU associé au parcours
174    de l'index lui même, mais PAS les coûts associés à la recherche ou au
175    traitement des lignes de la table principale qui sont identifiées par
176    l'index.
177   </para>
178
179   <para>
180    Le <quote>coût de départ</quote> est la part du coût total de parcours qui
181    doit être dépensée avant de pouvoir retrouver la première ligne. Pour la
182    plupart des index, il peut être mis à zéro, mais un index qui a un coût de
183    départ élevé peut vouloir lui donner un coût supérieur à zéro.
184   </para>
185
186   <para>
187    La sélectivité de l'index indexSelectivity doit indiquer la fraction de
188    la table principale qui sera retournée par le parcours de l'index.
189    Dans le cas d'un index peu intéressant, la sélectivité sera typiquement
190    supérieure à la fraction des lignes qui passent réellement les conditions
191    données.
192   </para>
193
194   <para>
195    indexCorrelation doit donner la corrélation (entre -1,0 et 1,0) entre l'ordre
196    de l'index et l'ordre de la table. Ce paramètre est utilisé pour ajuster le
197    coût de lecture de la table principale.
198   </para>
199
200   <procedure>
201    <title>Estimation de coût</title>
202    <para>
203     Une estimation de coût classique se fait comme suit&nbsp;:
204    </para>
205
206    <step>
207     <para>
208      Estimez et retournez la fraction de la table principale qui sera visitée,
209      en fonction des conditions qualifiés. En l'absence de connaissance
210      spécifique au type d'index, utilisez la fonction standard de l'optimiseur,
211      <function>clauselist_selectivity()</function>&nbsp;:
212
213      <programlisting>
214 *indexSelectivity = clauselist_selectivity(root, indexQuals,
215                                            rel-&nbsp;relid, JOIN_INNER);
216      </programlisting>
217     </para>
218    </step>
219
220    <step>
221     <para>
222      Estimez le nombre de lignes d'index qui seront visitées durant le
223      parcours. Pour de nombreux types d'index, cette valeur vaut
224      indexSelectivity fois le nombre de lignes de l'index mais elle peut valoir
225      plus. (Notez que la taille de l'index en pages et en lignes et disponible
226      dans la structure IndexOptInfo.)
227     </para>
228    </step>
229
230    <step>
231     <para>
232      Estimez le nombre de pages d'index qui seront retournées lors de son
233      parcours.
234      Ce sera peut-être juste indexSelectivity fois la taille de l'index en
235      pages.
236     </para>
237    </step>
238
239    <step>
240     <para>
241      Calculez le coût d'accès à l'index. Un estimateur générique pourrait
242      procéder comme suit&nbsp;:
243
244      <programlisting>
245     /*
246      * La supposition générale est que les pages d'index vont être lues
247      * séquentiellement, si bien qu'elles ont un coût de 1,0 chacune, et
248      * non pas de random_page_cost.
249      * De plus, on ajoute le coût de l'évaluation des conditions pour chaque
250      * ligne d'index. Tous les coûts sont supposés payés incrémentalement
251      * lors du parcours de l'index.
252      */
253     cost_qual_eval(&amp;index_qual_cost, indexQuals);
254     *indexStartupCost = index_qual_cost.startup;
255     *indexTotalCost = numIndexPages +
256         (cpu_index_tuple_cost + index_qual_cost.per_tuple) * numIndexTuples;
257      </programlisting>
258     </para>
259    </step>
260
261    <step>
262     <para>
263      Estimez la corrélation d'index. Pour un index simple ordonné sur un
264      seul champ, cela peut se retrouver dans pg_statistic.
265      Si vous ne savez pas, mettez zéro (pas de corrélation).
266     </para>
267    </step>
268   </procedure>
269
270   <para>
271    Des exemples de fonctions d'estimation peuvent être trouvés dans
272    <filename>src/backend/utils/adt/selfuncs.c</filename>.
273   </para>
274
275   <para>
276    Par convention, l'entrée dans <literal>pg_proc</literal> pour une
277    fonction <literal>amcostestimate</literal> a huit arguments tous déclarés
278    comme <type>internal</type> (car aucun n'a un type connu de SQL), et le type
279    retourné est <type>void</type>.
280   </para>
281  </chapter>
282
283 <!-- Keep this comment at the end of the file
284 Local variables:
285 mode:sgml
286 sgml-omittag:nil
287 sgml-shorttag:t
288 sgml-minimize-attributes:nil
289 sgml-always-quote-attributes:t
290 sgml-indent-step:1
291 sgml-indent-data:t
292 sgml-parent-document:nil
293 sgml-default-dtd-file:"./reference.ced"
294 sgml-exposed-tags:nil
295 sgml-local-catalogs:("/usr/lib/sgml/catalog")
296 sgml-local-ecat-files:nil
297 End:
298 -->
299
Note: See TracBrowser for help on using the browser.