Categorias:

Sintaxe de consulta

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> ) ]
[ ... ]
Copy

Onde:

samplingMethod ::= { { BERNOULLI | ROW } |
                     { SYSTEM | BLOCK } }
Copy
BERNOULLI | ROW ou . SYSTEM | BLOCK

Especifica o método de amostragem a ser utilizado:

  • BERNOULLI (ou ROW): inclui cada linha com uma probability de p/100. Semelhante a virar uma moeda ponderada para cada linha.

  • SYSTEM (ou BLOCK): inclui cada bloco de linhas com uma probability de p/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 entre 0 (nenhuma linha selecionada) e 100 (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 entre 0 (nenhuma linha selecionada) e 1000000 inclusive.

REPEATABLE | SEED ( seed )

Especifica um valor de semente para tornar a amostragem determinística. Pode ser qualquer número inteiro entre 0 e 2147483647, 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 e probability 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 mesmos probability e seed 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 e seed 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);
      
      Copy
  • 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);
    
    Copy
  • 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 um JOIN.

  • Além de usar literais para especificar probability | num ROWS e seed, 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 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 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);
Copy

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);
Copy

Retornar uma tabela inteira, incluindo todas as linhas da tabela:

SELECT * FROM testtable TABLESAMPLE (100);
Copy

Retornar uma amostra vazia:

SELECT * FROM testtable SAMPLE ROW (0);
Copy

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
    ;
Copy

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
    ;
Copy

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);
Copy

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);
Copy

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);
Copy

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);
Copy