- 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 ]
[ ... ]
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 umaprobability
dep/100
. Este método é semelhante a lançar uma moeda ponderada para cada linha.SYSTEM
(ouBLOCK
): inclui cada bloco de linhas com umaprobability
dep/100
. Este método é semelhante a lançar 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.
Além de usar literais para especificar
probability
ounum 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
0
e2147483647
, inclusive. Este parâmetro se aplica somente às amostragensSYSTEM
eBLOCK
.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 | 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 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)*n
linhas, mas é próximo desse valor.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 (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 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 uma junção é permitida, mas somente quando todas as seguintes condições 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 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);
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);