SAMPLE permite o processamento aproximado de consultas SELECT.
Quando a amostragem de dados está habilitada, a consulta não é executada sobre todos os dados, mas apenas sobre uma determinada fração deles (amostra). Por exemplo, se você precisar calcular estatísticas para todas as visits, basta executar a consulta sobre 1/10 de todas as visits e depois multiplicar o resultado por 10.
O processamento aproximado de consultas pode ser útil nos seguintes casos:
- Quando você tem requisitos rigorosos de latência (como abaixo de 100 ms), mas não consegue justificar o custo de recursos adicionais de hardware para atendê-los.
- Quando seus dados brutos não são precisos, de modo que a aproximação não degrada perceptivelmente a qualidade.
- Quando os requisitos de negócio exigem resultados aproximados (por custo-benefício ou para oferecer resultados exatos a usuários premium).
Você só pode usar amostragem com tabelas da família MergeTree, e apenas se a expressão de amostragem tiver sido especificada durante a criação da tabela (consulte motor MergeTree).
- A amostragem de dados é um mecanismo determinístico. O resultado da mesma consulta
SELECT .. SAMPLEé sempre o mesmo. - A amostragem funciona de forma consistente em tabelas diferentes. Para tabelas com uma única chave de amostragem, uma amostra com o mesmo coeficiente sempre seleciona o mesmo subconjunto dos dados possíveis. Por exemplo, uma amostra de IDs de usuário seleciona linhas com o mesmo subconjunto de todos os IDs de usuário possíveis em tabelas diferentes. Isso significa que você pode usar a amostra em subconsultas na cláusula IN. Além disso, você pode combinar amostras usando a cláusula JOIN.
- A amostragem permite ler menos dados do disco. Observe que você deve especificar a chave de amostragem corretamente. Para mais informações, consulte Criando uma tabela MergeTree.
SAMPLE, a seguinte sintaxe é compatível:
| Sintaxe da cláusula SAMPLE | Descrição |
|---|---|
SAMPLE k | Aqui, k é um número de 0 a 1. A consulta é executada sobre a fração k dos dados. Por exemplo, SAMPLE 0.1 executa a consulta sobre 10% dos dados. Leia mais |
SAMPLE n | Aqui, n é um número inteiro suficientemente grande. A consulta é executada sobre uma amostra de pelo menos n linhas (mas não significativamente mais do que isso). Por exemplo, SAMPLE 10000000 executa a consulta sobre um mínimo de 10.000.000 de linhas. Leia mais |
SAMPLE k OFFSET m | Aqui, k e m são números de 0 a 1. A consulta é executada sobre uma amostra da fração k dos dados. Os dados usados na amostra são deslocados pela fração m. Leia mais |
SAMPLE K
k é um número de 0 a 1 (há suporte tanto para notação fracionária quanto decimal). Por exemplo, SAMPLE 1/2 ou SAMPLE 0.5.
Em uma cláusula SAMPLE k, a amostra é extraída da fração k dos dados. O exemplo é mostrado abaixo:
count() é multiplicado manualmente por 10.
SAMPLE N
n é um inteiro suficientemente grande. Por exemplo, SAMPLE 10000000.
Nesse caso, a consulta é executada em uma amostra de pelo menos n linhas (mas não muito mais do que isso). Por exemplo, SAMPLE 10000000 executa a consulta sobre, no mínimo, 10.000.000 linhas.
Como a unidade mínima de leitura de dados é um grânulo (cujo tamanho é definido pela configuração index_granularity), faz sentido definir uma amostra muito maior do que o tamanho do grânulo.
Ao usar a cláusula SAMPLE n, você não sabe qual porcentagem relativa dos dados foi processada. Portanto, não sabe por qual coeficiente as funções de agregação devem ser multiplicadas. Use a coluna virtual _sample_factor para obter o resultado aproximado.
A coluna _sample_factor contém coeficientes relativos calculados dinamicamente. Essa coluna é criada automaticamente quando você cria uma tabela com a chave de amostragem especificada. Os exemplos de uso da coluna _sample_factor são mostrados abaixo.
Vamos considerar a tabela visits, que contém estatísticas de visitas ao site. O primeiro exemplo mostra como calcular o número de visualizações de página:
SAMPLE K OFFSET M
k e m são números entre 0 e 1. Os exemplos são mostrados abaixo.
Exemplo 1
[++------------]
Exemplo 2
[------++------]