Table of Contents
La implementación de PostgreSQL de la cláusula TABLESAMPLE
admite métodos personalizados de muestreo de tablas, además de los métodos
BERNOULLI y SYSTEM que son requeridos
por el estándar SQL. El método de muestreo determina qué filas de la tabla
se seleccionarán cuando se utilice la cláusula TABLESAMPLE.
A nivel SQL, un método de muestreo de tablas se representa mediante una única función SQL, normalmente implementada en C, que tiene la firma:
nombre_metodo(internal) RETURNS tsm_handler
El nombre de la función es el mismo nombre de método que aparece en la
cláusula TABLESAMPLE. El argumento internal es un valor ficticio
(que siempre tiene valor cero) que simplemente sirve para evitar que esta función se llame
directamente desde un comando SQL.
El resultado de la función debe ser una estructura asignada con palloc de
tipo TsmRoutine, que contiene punteros a funciones de soporte para el
método de muestreo. Estas funciones de soporte son funciones C ordinarias y
no son visibles ni invocables a nivel SQL. Las funciones de soporte se describen
en la Section 59.1.
Además de los punteros a funciones, la estructura TsmRoutine debe
proporcionar los siguientes campos adicionales:
List *parameterTypes
Esta es una lista de OIDs que contiene los OIDs de los tipos de datos de los parámetros
que aceptará la cláusula TABLESAMPLE cuando se utilice este
método de muestreo. Por ejemplo, para los métodos integrados, esta
lista contiene un único elemento con el valor FLOAT4OID, que
representa el porcentaje de muestreo. Los métodos de muestreo personalizados pueden tener
más o diferentes parámetros.
bool repeatable_across_queries
Si es true, el método de muestreo puede entregar muestras idénticas
en consultas sucesivas, si se proporcionan los mismos parámetros
y el mismo valor de semilla REPEATABLE cada vez y el
contenido de la tabla no ha cambiado. Cuando es false,
no se acepta la cláusula REPEATABLE para su uso con el
método de muestreo.
bool repeatable_across_scans
Si es true, el método de muestreo puede entregar muestras idénticas
en escaneos sucesivos en la misma consulta (asumiendo que los parámetros, la semilla y
el snapshot no cambian).
Cuando es false, el planificador no seleccionará planes que
requieran escanear la tabla muestreada más de una vez, ya que eso
podría resultar en una salida de consulta inconsistente.
El tipo de estructura TsmRoutine se declara
en src/include/access/tsmapi.h, el cual se puede consultar para obtener
más detalles.
Los métodos de muestreo de tablas incluidos en la distribución estándar son buenas
referencias al intentar escribir uno propio. Busca en
el subdirectorio src/backend/access/tablesample del árbol de fuentes
para los métodos de muestreo integrados, y en el subdirectorio contrib
para los métodos adicionales (add-on).