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