- Categorias:
SAMPLE / TABLESAMPLE¶
Retorna um subconjunto de linhas em amostras aleatórias a partir da tabela especificada. Você pode especificar diferentes tipos de métodos de amostragem e pode amostrar uma fração de uma tabela ou um número fixo de linhas:
Quando você faz uma amostragem de uma fração de uma tabela, com uma probabilidade especificada de incluir uma determinada linha, o número de linhas retornadas depende do tamanho da tabela e da probabilidade solicitada. Você pode especificar uma semente para tornar a amostragem determinística.
Quando você faz uma amostragem de um número fixo e especificado de linhas, a consulta retorna o número exato de linhas especificadas, 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 ]
[ ... ]
Onde:
samplingMethod ::= { { BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) | { SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Parâmetros¶
{ BERNOULLI | ROW }ou .{ SYSTEM | BLOCK }Especifica o método de amostragem a ser utilizado:
BERNOULLI(ouROW): inclui cada linha com umaprobabilitydep/100. Este método é semelhante a lançar uma moeda ponderada para cada linha.SYSTEM(ouBLOCK): inclui cada bloco de linhas com umaprobabilitydep/100. Esse método é semelhante a lançar uma moeda ponderada para cada bloco de linhas. Esse método não é compatível com amostragem de tamanho fixo.
O método de amostragem é opcional. Se nenhum método for especificado, o padrão é
BERNOULLI.probabilityou .num ROWSEspecifica se a amostragem deve ser baseada em uma fração da tabela ou em um número fixo de linhas na tabela, onde:
probabilityespecifica 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.numespecifica 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) e1000000inclusive.
Além de usar literais para especificar
probabilityounum ROWS, também é possível usar variáveis de sessão ou de ligação.{ REPEATABLE | SEED ( seed ) }Especifica um valor de semente para tornar a amostragem determinística. Pode ser qualquer número inteiro entre
0e2147483647, inclusive. Este parâmetro se aplica somente às amostragensSYSTEMeBLOCK.Além de usar literais para especificar
seed, também é possível usar variáveis de sessão ou de vinculação.
Notas de uso¶
As seguintes palavras-chave podem ser usadas de forma intercambiável:
SAMPLE | TABLESAMPLEBERNOULLI | ROWSYSTEM | BLOCKREPEATABLE | SEED
O número de linhas retornadas depende do método de amostragem especificado e se a amostra é baseada em uma fração da tabela ou em um número fixo de linhas na tabela:
- Baseado em frações:
Para a amostragem
BERNOULLI | ROW, o número esperado de linhas devolvidas é(p/100)*n. Para a amostragemSYSTEM | 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)*nlinhas, mas está próximo desse valor.Se nenhuma
seedfor especificada, SAMPLE gera resultados diferentes quando a mesma consulta é repetida.Se uma tabela não for alterada e os mesmos
seedeprobabilityforem 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 mesmosprobabilityeseedsejam 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 | BLOCKeSEED (seed)não são compatíveis com amostragens de 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
SEED (seed)não é compatível com 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 uma união é permitida, mas somente quando ambos dos itens a seguir forem verdadeiros:
A amostragem é baseada em linhas (Bernoulli).
A amostragem não usa 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 da junção. A seção Exemplos inclui um exemplo de amostragem do resultado de uma junção.
Tanto a cláusula LIMIT quanto a cláusula SAMPLE retorna um subconjunto de linhas de uma tabela. Quando você usa a cláusula LIMIT, o Snowflake retorna o número especificado de linhas da maneira mais rápida possível. Quando você usa a cláusula SAMPLE, o Snowflake retorna linhas com base no método de amostragem especificado na cláusula.
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 equivalente baseada em frações porque a amostragem de tamanho fixo impede alguma otimização de consulta.
Exemplos¶
Os exemplos a seguir usam a cláusula SAMPLE.
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);
Amostragem com junções¶
Este exemplo mostra como fazer a amostragem de várias tabelas em uma junção: Ele faz a amostragem de 25% das linhas em table1 e 50% das linhas em table2:
SELECT i, j
FROM
table1 AS t1 SAMPLE (25)
INNER JOIN
table2 AS t2 SAMPLE (50)
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 operação JOIN a seguir une todas as linhas de table1 para uma amostra de 50% das linhas em table2. Ela não faz a amostragem de 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 uma junção, em vez de às tabelas individuais na junção, aplique a junção a uma exibição em linha que contenha o resultado da junção. Por exemplo, execute a junção como uma subconsulta e, em seguida, aplique SAMPLE ao resultado da subconsulta. O exemplo abaixo mostra aproximadamente 1% das linhas retornadas pela junção:
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);