Capítulo 59. Escrita de método de amostragem de tabela

Índice

59.1. Funções de suporte ao método de amostragem

A implementação da cláusula TABLESAMPLE do PostgreSQL oferece suporte a métodos de amostragem de tabela personalizados, além dos métodos BERNOULLI e SYSTEM exigidos pelo padrão SQL. O método de amostragem determina quais linhas da tabela serão selecionadas quando for usada a cláusula TABLESAMPLE.

No nível SQL, um método de amostragem de tabela é representado por uma única função SQL, normalmente implementada em C, com a assinatura

nome_do_método(internal) RETURNS tsm_handler

O nome da função é o mesmo nome do método que aparece na cláusula TABLESAMPLE. O argumento internal é fictício (sempre com valor zero), servindo simplesmente para evitar que esta função seja chamada diretamente de um comando SQL. O resultado da função deve ser uma estrutura alocada usando palloc do tipo TsmRoutine, contendo ponteiros para funções de suporte ao método de amostragem. Estas funções de suporte são funções C simples e não são visíveis nem podem ser chamadas no nível SQL. As funções de suporte são descritas em Funções de suporte ao método de amostragem.

Além dos ponteiros de função, a estrutura TsmRoutine deve fornecer estes campos adicionais:

List *parameterTypes

Esta é uma lista de OIDs contendo os OIDs do tipo de dados dos parâmetros que serão aceitos pela cláusula TABLESAMPLE quando este método de amostragem for usado. Por exemplo, para os métodos nativos, esta lista contém um único item com valor FLOAT4OID, que representa a porcentagem de amostragem. Os métodos de amostragem personalizados podem ter mais parâmetros, ou parâmetros diferentes.

bool repeatable_across_queries

Se true, o método de amostragem poderá fornecer amostras idênticas em consultas sucessivas, se forem fornecidos os mesmos parâmetros e valor semente da cláusula REPEATABLE a cada vez, e o conteúdo da tabela não tiver sido alterado. Quando for false, a cláusula REPEATABLE não é aceita para uso com o método de amostragem.

bool repeatable_across_scans

Se true, o método de amostragem poderá fornecer amostras idênticas em varreduras sucessivas na mesma consulta (assumindo parâmetros imutáveis, valor da semente e instantâneo). Quando for false, o planejador não selecionará planos que exijam a varredura da tabela amostrada mais de uma vez, porque isto poderá resultar em uma saída de consulta inconsistente.

A estrutura TsmRoutine é declarado no arquivo src/include/access/tsmapi.h, que deve ser consultado para obter detalhes adicionais.

Os métodos de amostragem de tabela incluídos na distribuição padrão são boas referências ao tentar escrever os seus próprios métodos. Procure no subdiretório src/backend/access/tablesample da árvore de distribuição do código-fonte os métodos de amostragem nativos, e no subdiretório contrib para métodos contribuídos.

Exemplo 59.1. Exemplo do tradutor

Amostragem de tabela

Este exemplo consulta a tabela estados, que contém os nomes dos estados brasileiros mais o distrito federal, e retorna uma amostra aleatória de aproximadamente 20% desses estados usando o método Bernoulli. Execuções sucessivas dessa consulta retornam não apenas outros conjuntos de estados, mas retornam também um número diferente de linhas.

SELECT estado FROM estados TABLESAMPLE BERNOULLI(20);
     estado
----------------
 Acre
 Minas Gerais
 Paraíba
 Rio de Janeiro
 Sergipe
(5 linhas)

Veja também