Skip to content

Commit

Permalink
Correction du fichier fdwhandler
Browse files Browse the repository at this point in the history
  • Loading branch information
gleu committed Feb 29, 2016
1 parent 5208fc3 commit 14c0157
Showing 1 changed file with 60 additions and 64 deletions.
124 changes: 60 additions & 64 deletions postgresql/fdwhandler.xml
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ IterateForeignScan (ForeignScanState *node);
<strucfield>fdw_scan_tlist</structfield> si elle a été fournie,
sinon elles doivent correspondre au type de ligne de la table distante
parcourue. Si vous choisissez d'optimiser en récupérant d'avance des
colonnes non nécessaires, vous devriez insérer des valeurs nulls
colonnes non nécessaires, vous devriez insérer des valeurs NULL
dans les positions de ces colonnes, ou sinon générer une liste
<structfield>fdw_scan_tlist</structfield> avec ces colonnes omises.
</para>
Expand Down Expand Up @@ -308,12 +308,12 @@ EndForeignScan (ForeignScanState *node);
</sect2>

<sect2 id="fdw-callbacks-join-scan">
<title>Routines FDW pour le parcours des jointures distantes</title>
<title>Routines des FDW pour le parcours des jointures distantes</title>

<para>
Si un FDW permet d'effectuer des jointures distantes (autrement
qu'en récupérant les données des deux tables et en faisant la
jointure localement), il devrait fournir cette fonction callback:
jointure localement), il devrait fournir cette fonction callback&nbsp;:
</para>

<para>
Expand All @@ -329,7 +329,7 @@ GetForeignJoinPaths (PlannerInfo *root,
Crée les chemins possibles d'accès pour une jointure de
deux (ou plus) tables distantes qui toutes proviennent du
même serveur distant. Cette fonction optionnelle est appelée
durant la planification de la requête. De la même fâçon que
durant la planification de la requête. De la même façon que
<function>GetForeignPaths</function>, cette fonction devrait
générer des chemins <structname>ForeignPath</structname> pour
le paramètre <literal>joinrel</literal> fourni, et appeler la
Expand All @@ -344,36 +344,36 @@ GetForeignJoinPaths (PlannerInfo *root,
<para>
Notez que cette fonction sera invoquée de manière répétitive
pour la même jointure, avec des combinaisons différentes de
relations internes ou externes; il est de la responsabilité du
relations internes ou externes&nbsp;; il est de la responsabilité du
FDW de minimiser les tâches dupliquées.
</para>

<para>
Si un chemin <structname>ForeignPath</structname> est choisi
pour la jointure, il représentera l'ensemble du processus
de jointure; les chemins générés pour les tables qui
de jointure&nbsp;; les chemins générés pour les tables qui
la composent et les jointures auxiliaires ne seront pas
utilisés. Les traitements suivants des chemins de jointure
procèdent essentiellement de la même manière que pour un chemin
parcourant une simple table distante. Une différence est que le
<structfield>scanrelid</structfield> résultant du nœud du plan
<structname>ForeignScan</structname> devrait être mis à zéro,
dans la mesure où il ne représente aucune relation simple; à
la place le champ <structfield>fd_relids</structfield> du nœud
dans la mesure où il ne représente aucune relation simple&nbsp;; à
la place, le champ <structfield>fd_relids</structfield> du nœud
<structname>ForeignScan</structname> représente l'ensemble des
relations qui ont été jointes. (Le dernier champ est positionné
automatiquement par le code interne du planificateur, et n'a pas
besoin d'être rempli par le FDW.) Une autre différence est que,
parce que la liste des colonnes pour une jointure distante ne peut
comme la liste des colonnes pour une jointure distante ne peut
être trouvée dans les catalogues systèmes, le FDW doit remplir
<structfield>fdw_scan_tlist</strucfield> avec une liste appropriée
de nœud <structfield>TargetEntry</structfield>, représentant
de nœuds <structfield>TargetEntry</structfield>, représentant
l'ensemble des colonnes qu'il fournira à l'exécution dans les
lignes qu'il retournera.
</para>

<para>
Voir <xref linkend="fdw-planning"/> pour des informations additionnelles.
Voir <xref linkend="fdw-planning"/> pour des informations supplémentaires.
</para>

</sect2>
Expand Down Expand Up @@ -737,7 +737,7 @@ IsForeignRelUpdatable (Relation rel);
Si un FDW veut supporter le <firstterm>verrouillage
tardif de lignes</firstterm> (comme décrit à <xref
linkend="fdw-row-locking"/>), il doit fournir les fonctions callbacks
suivantes:
suivantes&nbsp;:
</para>

<para>
Expand Down Expand Up @@ -820,7 +820,7 @@ RefetchForeignRow (EState *estate,

<para>
Notez que par défaut, l'échec pour prendre un verrou ligne
devrait avoir pour conséquence de lever une erreur; un
devrait avoir pour conséquence de lever une erreur&nbsp;; un
retour <literal>NULL</literal> est seulement approprié si
l'option <literal>SKIP LOCKED</literal> est spécifié par
<literal>erm-&gt;waitPolicy</literal>.
Expand All @@ -833,7 +833,7 @@ RefetchForeignRow (EState *estate,
est envoyée comme type <type>Datnum</type>, elle ne peut être
actuellement que de type <type>tid</tid>. L'API de la fonction est
choisie dans l'espoir qu'il sera possible d'autoriser d'autre types
de données pour les IDs des lignes dans le futur.
de données pour les identifiants des lignes dans le futur.
</para>

<para>
Expand All @@ -852,38 +852,36 @@ RefetchForeignRow (EState *estate,
bool
RecheckForeignScan (ForeignScanState *node, TupleTableSlot *slot);
</programlisting>
<!-- EDLM commentaire: plusieurs difficultés de traduction sur ce
paragraphe: join pushdown, pushdown, qualifiers.... La traduction
du paragraphe est à revoir de près... -->
Vérifie à nouveau qu'une ligne retournée précédemment
correspond toujours au parcours et qualificatifs de jointures
applicable, et éventuellement fourni une version modifiée de la
ligne. Pour les wrappers de données distantes qui n'effectuent
pas des jointures pushdown, il sera typiquement plus pratique de
positionner cette fonction à <literal>NULL</literal> et à la
place positionner <structfield>fdw_recheck_quals</structfield>
correspond toujours au parcours et aux qualificatifs de jointures,
et éventuellement fournit une version modifiée de la
ligne. Pour les wrappers de données distantes qui ne supportent pas
les jointures (<foreignphrase>join push-down</foreignphrase>), il
sera plus pratique de positionner ce pointeur de fonction à
<literal>NULL</literal> et, à la place, configurer
<structfield>fdw_recheck_quals</structfield>
de manière appropriée. Cependant lorsque des jointures
externes sont poussées il n'est pas suffisant d'appliquer à
nouveau les vérifications applicables à toutes las tables
externes sont poussées au serveur distant, il n'est pas suffisant d'appliquer à
nouveau les vérifications applicables à toutes les tables
de base à la ligne résultat, même si tous les attributs
nécessaires sont présents, parce que l'impossibilité de mettre
en correspondance certains qualificatifs pourrait résulter en la
mise à NULL de certains attributs, plutôt qu'aucune ligne ne soit
mise à NULL de certaines colonnes, plutôt qu'aucune ligne ne soit
retournée. <literal>RecheckForeignScan</literal> peut vérifier
à nouveau les qualificatifs et renvoyer true si ils sont toujours
satisfaits et false dans le cas contraire, mais elle peut aussi
stocké une ligne de remplacement dans l'emplacement fourni.
stocker une ligne de remplacement dans l'emplacement fourni.
</para>

<para>
Pour mettre en place les jointures pushdown, un wrapper de données
Pour implémenter le support des jointures, un wrapper de données
distantes construira typiquement un plan alternatif local qui est
utilisé uniquement pour les revérifications; celui-ci deviendra
utilisé uniquement pour les revérifications&nbsp;; celui-ci deviendra
le sous-plan externe de <literal>ForeignScan</literal>. Lorsqu'une
révérification est requise, ce sous-plan peut être exécuté
et la ligne résultante peut être stockée dans l'emplacement. Ce
plan n'a pas besoin d'être efficace car aucune table de base ne
retournera plus d'une ligne; par exemple, il peut réaliser toutes
retournera plus d'une ligne&nbsp;; par exemple, il peut réaliser toutes
les jointures comme des boucles imbriquées.
</para>
</sect2>
Expand Down Expand Up @@ -1022,9 +1020,9 @@ ImportForeignSchema (ImportForeignSchemaStmt *stmt, Oid serverOid);
<structfield>remote_schema</structfield> est le nom
du schéma distant à partir duquel les tables sont à
importer. <structfield>list_type</structfield> indique comment
filtrer les noms de tables: <literal>FDW_IMPORT_SCHEMA_ALL</literal>
filtrer les noms de tables&nbsp;: <literal>FDW_IMPORT_SCHEMA_ALL</literal>
signifie que toutes les tables dans le schéma distant devraient
être importées (dans ce cas <structfield>table_list</structfield>
être importées (dans ce cas, <structfield>table_list</structfield>
est vide), <literal>FDW_IMPORT_SCHEMA_LIMIT_TO</literal>
signifie d'inclure seulement les tables listées
dans <structfield>table_list</structfield>, et
Expand All @@ -1043,11 +1041,11 @@ ImportForeignSchema (ImportForeignSchemaStmt *stmt, Oid serverOid);
Le FDW peut ignorer le champ <structfield>local_schema</structfield>
de <structname>ImportForeignSchemaStmt</structname>, parce que
le serveur principal insérera automatiquement ce nom dans les
commandes analysées <command>CREATE FOREIGN TABLE</command>.
commandes <command>CREATE FOREIGN TABLE</command> analysées.
</para>

<para>
Le FDW n'a pas besoin de mettre en place lui même le
Le FDW n'a pas besoin de mettre en place lui-même le
filtrage spécifié par <structfield>list_type</structfield>
et <structfield>table_list</structfield>, dans la mesure où
le serveur principal ignorera automatiquement les commandes
Expand Down Expand Up @@ -1312,20 +1310,20 @@ GetForeignServerByName(const char *name, bool missing_ok);

<para>
Un autre champ <structname>ForeignScan</structname> qui peut être
rempli par les FDWs est <structfield>fdw_scan_tlist</structfield>,
rempli par les FDW est <structfield>fdw_scan_tlist</structfield>,
qui décrit les lignes renvoyées par le FDW pour ce nœud du
plan. Pour les parcours simples de tables distantes ceci peut être
plan. Pour les parcours simples de tables distantes, il peut être
positionné à <literal>NIL</literal>, impliquant que les lignes
renvoyées ont le type de ligne déclaré pour la table distante. Une
valeur non-<symbol>NIL</symbol> doit être une liste cible (liste
valeur différente de <symbol>NIL</symbol> doit être une liste cible (liste
de <structname>TargetEntry</structname>) contenant des variables
et/ou expressions représentant les colonnes renvoyées. Ceci peut
être utilisé, par exemple, pour montrer que le FDW a omis certaines
colonnes qu'il a noté comme non nécessaire à la requête. Aussi,
si le FDW peut calculer des expressions utilisées par la requête
de manière moins coûteuse que localement, il pourrait ajouter ces
expressions à <structfield>fdw_scan_tlist</structfield>. Notez que
les plans de jointure (créés à partir des chemins créés par
les plans de jointure (créés à partir des chemins construits par
<function>GetForeignJoinPaths</function>) doivent toujours fournir
<structfield>fdw_scand_tlist</structfield> pour décrire l'ensemble
des colonnes qu'ils retourneront.
Expand Down Expand Up @@ -1360,8 +1358,8 @@ GetForeignServerByName(const char *name, bool missing_ok);
de base. L'information à propos de la jointure envisagée
peut être passée à <function>GetForeignPlan</function>
de la même manière que décrit ci-dessus. Cependant,
<structfield>baserestrictinfo</structfield> n'est ps applicable
pour les jointures; à la place, les clauses de jointure
<structfield>baserestrictinfo</structfield> n'est pas applicable
pour les tables d'une jointure&nbsp;; à la place, les clauses de jointure
applicables pour une jointure particulière sont passées à
<function>GetForeignJoinPaths</function> comme un paramètre séparé
(<literal>extra-&gt;restrictlist</literal>).
Expand Down Expand Up @@ -1389,7 +1387,7 @@ GetForeignServerByName(const char *name, bool missing_ok);
cible de conflit, dans la mesure où les contraintes uniques
ou les contraintes d'exclusion sur les tables distantes ne
sont pas localement connues. Ceci entraîne également que
<literal>ON CONFLICT DO UPDATE</literal> n'est pas supporté,
<literal>ON CONFLICT DO UPDATE</literal> n'est pas supporté
car la spécification est obligatoire ici.
</para>

Expand All @@ -1410,33 +1408,33 @@ GetForeignServerByName(const char *name, bool missing_ok);
</para>

<para>
Une décision clef à effectuer est si il vaut mieux
Une décision clef à prendre est si il vaut mieux
effectuer un <firstterm>verrouillage précoce</firstterm> ou un
<firstterm>verrouillage tardif</firstterm>. Dans le verrouillage
précoce, une ligne est verrouillée lorsqu'elle est récupérée
pour la première fois à partir du stockage sous-jacent, alors
qu'avec le verrouillage tardif, la ligne est verrouillée seulement
lorsque le besoin est connu et nécessaire. (La différence
survient parce que certaines lignes peuvent être abandonnées
par des restrictions localement vérifiées ou des conditions de
par des restrictions vérifiées localement ou des conditions de
jointure.) Le verrouillage précoce est beaucoup plus simple et
évite des allers-retours supplémentaires vers le stockage distant,
mais il peut entraîner des verrouillage de lignes qui n'auraient pas
mais il peut entraîner des verrouillages de lignes qui n'auraient pas
eu besoin de l'être, résultant en une réduction de la concurrence
voir même des blocages inattendus. Aussi, le verrouillage tardif
voire même des deadlocks inattendus. De plus, le verrouillage tardif
n'est possible seulement que si la ligne à verrouiller peut être
identifiée de manière unique à nouveau plus tard. Idéalement
l'identificateur de ligne devrait identifier une version spécifique
de la ligne, comme les TIDS de <productname>PostgreSQL</productname>
identifiée de manière unique à nouveau plus tard. Idéalement,
l'identifiant de ligne devrait identifier une version spécifique
de la ligne, comme les TID de <productname>PostgreSQL</productname>
le font.
</para>

<para>
Par défaut, <productname>PostgreSQL</productname>
ignore les considérations de verrouillage lorsqu'il
s'interface avec les FDWs, mais un FDW peut effectuer un
s'interface avec les FDW, mais un FDW peut effectuer un
verrouillage précoce sans un support explicite du code du
serveur principal. Les fonctions de l'API décrites à <xref
serveur principal. Les fonctions de l'API décrites dans le <xref
linkend="fdw-callbacks-row-locking"/>, qui ont été ajoutées dans
la version 9.5 de <productname>PostgreSQL</productname>, autorise
un FDW à utiliser un verrouillage tardif si il le désire.
Expand All @@ -1452,18 +1450,18 @@ GetForeignServerByName(const char *name, bool missing_ok);
copies des lignes non ciblées qui étaient auparavant jointes
à la ligne cible. En travaillant avec des tables standards
<productname>PostgreSQL</productname>, ceci est effectué en
incluant les TIDs des tables non ciblées dans la liste des colonnes
incluant les TID des tables non ciblées dans la liste des colonnes
projetées via la jointure, puis en récupérant à nouveau les
lignes non ciblées lorsque nécessaire. Cette approche maintien
l'ensemble des données jointes compacte, mais il demande une
capacité de récupération à nouveau peu chère, ainsi qu'un TID
lignes non ciblées si nécessaire. Cette approche maintient
l'ensemble des données jointes compact, mais il demande une
capacité peu coûteuse de récupération à nouveau, ainsi qu'un TID
qui peut identifier de manière unique la version de la ligne à
récupérer à nouveau. Par défaut, donc, l'approche utilisée
avec les tables distantes est d'inclure une copie de la ligne
entière récupérée dans la liste de colonnes projetée via
la jointure. Ceci n'impose rien au FDW mais peut entraîner des
performances réduites des jointures par fusion ou hash. Un FDW qui
rempli les conditions pour récupérer à nouveau peut choisir de
performances réduites des jointures par fusion ou hachage. Un FDW qui
remplit les conditions pour récupérer à nouveau peut choisir de
le faire.
</para>

Expand All @@ -1472,7 +1470,7 @@ GetForeignServerByName(const char *name, bool missing_ok);
<command>DELETE</command> sur une table distante, il est recommandé
que l'opération de <literal>ForeignScan</literal> sur la table cible
effectue un verrouillage précoce sur les lignes qu'elle récupère,
peut être via un équivalent de la commande <command>SELECT FOR
peut-être via un équivalent de la commande <command>SELECT FOR
UPDATE</command>. Un FDW peut détecter si une table est la cible
d'une commande <command>UPDATE</command>/<command>DELETE</command>
lors de la planification en comparant son relid à
Expand All @@ -1496,15 +1494,15 @@ GetForeignServerByName(const char *name, bool missing_ok);
<function>GetForeignRowMarkType</function>, sélectionner
l'option rowmark <literal>ROW_MARK_EXCLUSIVE</literal>,
<literal>ROW_MARK_NOKEYEXCLUSIVE</literal>,
<literal>ROW_MARK_SHARE</literal>, ou
<literal>ROW_MARK_SHARE</literal> ou
<literal>ROW_MARK_KEYSHARE</literal> en fonction de la force
du verrouillage demandé. (Le code du serveur principal agira
de la même manière indépendamment de l'option choisie parmi
ces quatres options.) Ailleurs, vous pouvez détecter si une
table distante a été verrouillée par ce type de commandes en
utilisant la fonction <function>get_plan_rowmark</function> lors de
la planification, ou la fonction <function>ExecFindRowMark</function>
lors de l'exécution; vous devez vérifier non seulement si une
la planification ou la fonction <function>ExecFindRowMark</function>
lors de l'exécution&nbsp;; vous devez vérifier non seulement si une
structure rowmark non nulle est renvoyée, mais également que
son champ <structfield>strength</structfield> n'est pas égal à
<literal>LCS_NONE</literal>.
Expand All @@ -1520,7 +1518,7 @@ GetForeignServerByName(const char *name, bool missing_ok);
<literal>ROW_MARK_REFERENCE</literal> lorsqu'elle voit comme valeur
de puissance de verrouillage <literal>LCS_NONE</literal>. Ceci aura
pour conséquence d'appeler <function>RefetchForeignRow</function>
avec cette valeur pour le champ <structfield>markType</structfield>;
avec cette valeur pour le champ <structfield>markType</structfield>&nbsp;;
elle devrait alors récupérer à nouveau la ligne sans
prendre aucun nouveau verrouillage. (Si vous avez une fonction
<function>GetForeignRowMarkType</function> mais ne souhaitez
Expand All @@ -1534,12 +1532,10 @@ GetForeignServerByName(const char *name, bool missing_ok);
<filename>src/include/nodes/lockoptions.h</filename>,
pour <type>RowMarkType</type> et dans
<filename>src/include/nodes/plannodes.h</filename>
pour <type>PlanRowMark</type> , et les
pour <type>PlanRowMark</type>, et les
commentaires pour <type>ExecRowMark</type> dans
<filename>src/include/nodes/execnodes.h</filename> pour des
informations complémentaires.
</para>

</sect1>

</chapter>

0 comments on commit 14c0157

Please sign in to comment.