Table des matières
L'implémentation de la clause TABLESAMPLE
de
PostgreSQL supporte l'utilisation de
méthodes personnalisées d'échantillonnage de table, en plus des
méthodes BERNOULLI
et SYSTEM
qui sont requises par le standard SQL. La méthode d'échantillonnage
détermine les lignes de la table sélectionnées lorsque
la clause TABLESAMPLE
est utilisée.
Au niveau SQL, une méthode d'échantillonnage de table est représentée par une simple fonction, classiquement implémentée en C, et qui a la signature suivante :
method_name(internal) RETURNS tsm_handler
Le nom de la fonction est le même que le nom de la méthode
apparaissant dans la clause TABLESAMPLE
. L'argument
internal
est factice (il a toujours une valeur de
zéro) qui sert uniquement à interdire que cette fonction soit
appelée directement à partir d'une commande SQL. Le résultat
de cette fonction doit être une structure allouée avec palloc
de type TsmRoutine
, qui contient des pointeurs de
fonction supportant la méthode d'échantillonnage. Ces fonctions
sont des fonctions C pleines et entières qui ne sont ni visibles ni
appellables au niveau SQL. Les fonctions de support sont décrites
dans le Section 58.1.
En plus des pointeurs de fonction, la structure TsmRoutine
doit fournir ces champs additionnels :
List *parameterTypes
Il s'agit d'une liste d'OID contenant les OID des types de
données du ou des paramètre(s) qui seront acceptés par la
clause TABLESAMPLE
lorsque cette méthode
d'échantillonnage sera utilisée. Par exemple, pour les méthodes
incluses, cette liste contient un simple élément avec la valeur
FLOAT4OID
, qui représente le pourcentage
d'échantillonnage. Les méthodes d'échantillonnage personnalisées
peuvent avoir des paramètres en plus ou différents.
bool repeatable_across_queries
Si true
, la méthode d'échantillonnage
peut renvoyer des échantillons identiques pour des requêtes
successives, si les mêmes paramètres et la valeur de graine de la
clause REPEATABLE
sont fournis à chaque fois et
que le contenu de la table n'a pas changé. Lorsque positionné à
false
, la clause REPEATABLE
n'est pas acceptée comme valable pour la méthode
d'échantillonnage.
bool repeatable_across_scans
Si true
, la méthode d'échantillonnage peut
renvoyer des échantillons identiques pour des parcours successifs
dans la même requête (en supposant des paramètres, une graine
et une image de la base inchangés). Lorsque positionné à
false
, le planificateur ne sélectionnera pas
des plans qui requièrent de parcourir la table échantillonnée
plus d'une fois, dans la mesure où ceci pourrait entraîner des
résultats de sortie incohérents.
La structure TsmRoutine
est déclarée dans le
fichier src/include/access/tsmapi.h
, auquel il
convient de se référer pour des détails supplémentaires.
Les méthodes d'échantillonnage de table incluses dans
la distribution standard sont de bonnes références
pour écrire la vôtre. Jeter un œil dans le répertoire
src/backend/access/tablesample
de l'arbre
des sources pour les méthodes incluses, et dans le répertoire
contrib
pour des méthodes additionnelles.