- 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(ou- ROW): inclui cada linha com uma- probabilityde- p/100. Este método é semelhante a lançar uma moeda ponderada para cada linha.
- SYSTEM(ou- BLOCK): inclui cada bloco de linhas com uma- probabilityde- p/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 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: - probabilityespecifica a porcentagem de probabilidade a ser usada para a seleção da amostra. Pode ser qualquer número decimal entre- 0(nenhuma linha selecionada) e- 100(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 entre- 0(nenhuma linha selecionada) e- 1000000inclusive.
 - Além de usar literais para especificar - probabilityou- num 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 - 0e- 2147483647, inclusive. Este parâmetro se aplica somente às amostragens- SYSTEMe- BLOCK.- 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 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 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)*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 - seede- probabilityforem 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 mesmos- probabilitye- seedsejam 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 | BLOCKe- SEED (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 amostragem- BERNOULLI | ROW.
- A amostragem sem um - seedé frequentemente mais rápida do que a amostragem com um- seed.
- 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);