A cláusula 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 visitas, basta executar a consulta sobre 1/10 de todas as visitas 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).
As características da amostragem de dados estão listadas abaixo:
- 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.
Para a cláusula 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
Aqui, 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:
SELECT
Title,
count() * 10 AS PageViews
FROM hits_distributed
SAMPLE 0.1
WHERE
CounterID = 34
GROUP BY Title
ORDER BY PageViews DESC LIMIT 1000Neste exemplo, a consulta é executada em uma amostra de 0,1 (10%) dos dados. Os valores das funções de agregação não são corrigidos automaticamente; portanto, para obter um resultado aproximado, o valor de count() é multiplicado manualmente por 10.
SAMPLE N
Aqui, 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:
SELECT sum(PageViews * _sample_factor)
FROM visits
SAMPLE 10000000O exemplo a seguir mostra como calcular o número total de visitas:
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000O exemplo abaixo mostra como calcular a duração média da sessão. Observe que não é necessário usar o coeficiente relativo para calcular as médias.
SELECT avg(Duration)
FROM visits
SAMPLE 10000000SAMPLE K OFFSET M
Aqui, k e m são números entre 0 e 1. Os exemplos são mostrados abaixo.
Exemplo 1
SAMPLE 1/10Neste exemplo, a amostra corresponde a 1/10 de todos os dados:
[++------------]
Exemplo 2
SAMPLE 1/10 OFFSET 1/2Aqui, é selecionada uma amostra de 10% da segunda metade dos dados.
[------++------]