Chapter 59. Escritura de un método de muestreo de tablas

Table of Contents

59.1. Funciones de soporte del método de muestreo

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).