- Categorias:
SAMPLE / TABLESAMPLE¶
Retorna um subconjunto de linhas em amostras aleatórias a partir da tabela especificada. Os seguintes métodos de amostragem são suportados:
Amostra de uma fração de uma tabela, com uma probabilidade especificada para incluir uma determinada linha. O número de linhas devolvidas depende do tamanho da tabela e da probabilidade solicitada. Uma semente pode ser especificada para tornar a amostragem determinística.
Amostra de um número fixo e especificado de linhas. O número exato de linhas especificadas é retornado, a menos que a tabela contenha menos linhas.
SAMPLE e TABLESAMPLE são sinônimos e podem ser usados de forma intercambiável.
Sintaxe¶
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ] ( { <probability> | <num> ROWS } ) [ { REPEATABLE | SEED } ( <seed> ) ]
[ ... ]
Onde:
samplingMethod ::= { { BERNOULLI | ROW } | { SYSTEM | BLOCK } }
BERNOULLI | ROW
ou .SYSTEM | BLOCK
Especifica o método de amostragem a ser utilizado:
BERNOULLI
(ouROW
): inclui cada linha com umaprobability
dep/100
. Semelhante a virar uma moeda ponderada para cada linha.SYSTEM
(ouBLOCK
): inclui cada bloco de linhas com umaprobability
dep/100
. Semelhante a virar uma moeda ponderada para cada bloco de linhas. Este método não oferece suporte à amostragem em tamanho fixo.
O método de amostragem é opcional. Se nenhum método for especificado, o padrão é
BERNOULLI
.probability
ou .num ROWS
Especifica se a amostragem deve ser baseada em uma fração da tabela ou em um número fixo de linhas na tabela, onde:
probability
especifica a porcentagem de probabilidade a ser usada para a seleção da amostra. Pode ser qualquer número decimal entre0
(nenhuma linha selecionada) e100
(todas as linhas selecionadas) inclusive.num
especifica o número de linhas (até 1.000.000) a serem amostradas a partir da tabela. Pode ser qualquer número inteiro entre0
(nenhuma linha selecionada) e1000000
inclusive.
REPEATABLE | SEED ( seed )
Especifica um valor de semente para tornar a amostragem determinística. Pode ser qualquer número inteiro entre
0
e2147483647
, inclusive.
Notas de uso¶
As seguintes palavras-chave podem ser usadas de forma intercambiável:
SAMPLE | TABLESAMPLE
BERNOULLI | ROW
SYSTEM | BLOCK
REPEATABLE | SEED
O número de linhas devolvidas depende do método de amostragem especificado:
- Baseado em frações:
Para a amostragem
BERNOULLI | ROW
, o número esperado de linhas devolvidas é(p/100)*n
.Para a amostragem
SYSTEM | BLOCK
, a amostra pode ser tendenciosa, principalmente para tabelas pequenas.
Nota
Para tabelas muito grandes, a diferença entre os dois métodos deve ser insignificante.
Além disso, como a amostragem é um processo probabilístico, o número de linhas retornadas não é exatamente igual a
(p/100)*n
linhas, mas está próximo.Se nenhuma
seed
for especificada, SAMPLE gera resultados diferentes quando a mesma consulta é repetida.Se uma tabela não se alterar, e os mesmos
seed
eprobability
forem especificados, SAMPLE gerará o mesmo resultado. No entanto, a amostragem em uma cópia de uma tabela pode não retornar o mesmo resultado que a amostragem na tabela original, mesmo que os mesmosprobability
eseed
sejam especificados.
- Tamanho fixo:
Se a tabela for maior do que o número de linhas solicitado, o número de linhas solicitado é sempre retornado.
Se a tabela for menor do que o número de linhas solicitado, a tabela inteira é retornada.
SYSTEM | BLOCK
eseed
não são suportados para amostragem em tamanho fixo. Por exemplo, as seguintes consultas produzem erros:select * from example_table sample system (10 rows); select * from example_table sample row (10 rows) seed (99);
A amostragem com um
seed
não é suportada em exibições ou subconsultas. Por exemplo, a consulta a seguir produz um erro:select * from (select * from example_table) sample (1) seed (99);
A amostragem do resultado de um
JOIN
é permitida, mas somente quando todas as opções seguintes forem verdadeiras:A amostra é baseada em linhas (Bernoulli).
A amostragem não utiliza uma semente.
A amostragem é feita após a junção ter sido totalmente processada. Portanto, a amostragem não reduz o número de linhas unidas e não reduz o custo do
JOIN
. A seção Exemplos inclui um exemplo de amostragem do resultado de umJOIN
.Além de usar literais para especificar
probability | num ROWS
eseed
, também podem ser usadas variáveis de sessão ou de vinculação.
Considerações de desempenho¶
A amostragem
SYSTEM | BLOCK
é muitas vezes mais rápida do que a amostragemBERNOULLI | ROW
.A amostragem sem um
seed
é frequentemente mais rápida do que a amostragem com umseed
.A amostragem de tamanho fixo pode ser mais lenta do que a amostragem baseada em fração equivalente, pois a amostragem de tamanho fixo impede uma otimização da consulta.
Exemplos¶
Amostragem de linhas por fracionamento¶
Retornar uma amostra de uma tabela na qual cada linha tem uma probabilidade 10% de ser incluída na amostra:
SELECT * FROM testtable SAMPLE (10);
Retornar uma amostra de uma tabela na qual cada linha tem uma probabilidade 20,3% de ser incluída na amostra:
SELECT * FROM testtable TABLESAMPLE BERNOULLI (20.3);
Retornar uma tabela inteira, incluindo todas as linhas da tabela:
SELECT * FROM testtable TABLESAMPLE (100);
Retornar uma amostra vazia:
SELECT * FROM testtable SAMPLE ROW (0);
Este exemplo mostra como fazer a amostragem de várias tabelas em uma junção:
SELECT i, j FROM table1 AS t1 SAMPLE (25) -- 25% of rows in table1 INNER JOIN table2 AS t2 SAMPLE (50) -- 50% of rows in table2 WHERE t2.j = t1.i ;
A cláusula SAMPLE
aplica-se somente a uma tabela, não a todas as tabelas anteriores ou a toda a expressão anterior à cláusula SAMPLE
. A seguinte operação JOIN
junta todas as linhas de t1 a uma amostra de 50% das linhas da tabela2; não mostra 50% das linhas que resultam da junção de todas as linhas em ambas as tabelas:
SELECT i, j FROM table1 AS t1 INNER JOIN table2 AS t2 SAMPLE (50) WHERE t2.j = t1.i ;
Para aplicar a cláusula SAMPLE
ao resultado de um JOIN
, em vez de às tabelas individuais no JOIN
, aplicar o JOIN
a uma exibição inline que contenha o resultado do JOIN
. Por exemplo, executar o JOIN
como uma subconsulta, e depois aplicar o SAMPLE ao resultado da subconsulta. O exemplo abaixo mostra aproximadamente 1% das linhas retornadas por JOIN
:
select * from ( select * from t1 join t2 on t1.a = t2.c ) sample (1);
Amostragem de blocos baseada em frações (com sementes)¶
Retornar uma amostra de uma tabela na qual cada bloco de linhas tem uma probabilidade 3% de ser incluída na amostra, e definir a semente como 82:
SELECT * FROM testtable SAMPLE SYSTEM (3) SEED (82);
Retornar uma amostra de uma tabela na qual cada bloco de linhas tem uma probabilidade 0,012% de ser incluída na amostra, e definir a semente como 99992:
SELECT * FROM testtable SAMPLE BLOCK (0.012) REPEATABLE (99992);
Nota
Se qualquer uma destas consultas for executada novamente sem fazer nenhuma alteração na tabela, elas retornam o mesmo conjunto de amostras.
Amostragem de linhas de tamanho fixo¶
Retornar uma amostra de tamanho fixo de 10 linhas na qual cada linha tem uma probabilidade de min(1, 10/n)
de ser incluída na amostra, onde n
é o número de linhas na tabela:
SELECT * FROM testtable SAMPLE (10 ROWS);