Cláusula SAMPLE
A cláusula SAMPLE no ClickHouse permite realizar consultas em uma amostra aleatória de linhas de uma tabela, em vez de processar a tabela inteira. Isso é útil para obter resultados rápidos em conjuntos de dados grandes, reduzindo o tempo de execução das consultas. A amostra é definida como uma porcentagem ou fração das linhas totais, e o ClickHouse usa hashing para garantir que a amostra seja consistente em diferentes execuções, desde que os dados subjacentes não mudem. Em outras palavras, quando a amostragem de dados está habilitada(SAMPLE), a consulta não é realizada em todos os dados, mas apenas em uma certa fração de dados são utilizados na amostra, por exemplo, se você precisa calcular estatísticas para todas as visitas, é suficiente executar a consulta na fração 1/10 de todas as visitas e então multiplicar o resultado por 10.
O processamento de consulta aproximado pode ser útil nos seguintes casos:
Quando você tem requisitos de latência rigorosos (como abaixo de 100 ms), mas não consegue justificar o custo de recursos de hardware adicionais para atendê-los.
Quando seus dados brutos não são precisos, a aproximação não degrada visivelmente a qualidade.
Os requisitos de negócios visam resultados aproximados (para melhor relação custo-benefício ou para comercializar resultados exatos para usuários premium).
Observação
Você só pode usar amostragem com as tabelas da família MergeTree e somente se a expressão de amostragem tiver sido especificada durante a criação da tabela (consulte o mecanismo MergeTree ).
Os recursos de amostragem de dados estão listados abaixo:
A amostragem de dados é um mecanismo determinístico. O resultado da mesma SELECT .. consulta SAMPLE é sempre o mesmo.
A amostragem funciona consistentemente para tabelas diferentes. Para tabelas com uma única chave de amostragem, uma amostra com o mesmo coeficiente sempre seleciona o mesmo subconjunto de dados possíveis. Por exemplo, uma amostra de IDs de usuário pega linhas com o mesmo subconjunto de todas as IDs de usuário possíveis de tabelas diferentes. Isso significa que você pode usar a amostra em subconsultas na cláusula IN . Além disso, você pode unir amostras usando a cláusula JOIN .
A amostragem permite ler menos dados de um disco. Observe que você deve especificar a chave de amostragem corretamente. Para obter mais informações, consulte Criando uma tabela MergeTree .
Para a cláusula SAMPLE, a seguinte sintaxe é suportada:
Sintaxe da cláusula SAMPLE Descrição
SAMPLE k Aqui kestá o número de 0 a 1. A consulta é executada em kfração de dados. Por exemplo, SAMPLE 0.1 executa a consulta em 10% dos dados.
SAMPLE n Aqui nestá um inteiro suficientemente grande. A consulta é executada em uma amostra de pelo menos nlinhas (mas não significativamente mais do que isso). Por exemplo, SAMPLE 10000000 executa a consulta em um mínimo de 10.000.000 de linhas. Leia mais
SAMPLE k OFFSET m Aqui kestão mos números de 0 a 1. A consulta é executada em uma amostra de kfração dos dados. Os dados usados para a amostra são compensados por mfração. Leia mais
AMOSTRA
Aqui kestá o número de 0 a 1 (tanto notações fracionárias quanto decimais são suportadas). Por exemplo, SAMPLE 1/2ou SAMPLE 0.5.
Em uma SAMPLE kcláusula, a amostra é retirada da kfração de 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 1000
Neste exemplo, a consulta é executada em uma amostra de 0,1 (10%) de dados. Os valores das funções de agregação não são corrigidos automaticamente, então, para obter um resultado aproximado, o valor count()é multiplicado manualmente por 10.
AMOSTRA
Aqui nestá um inteiro suficientemente grande. Por exemplo, SAMPLE 10000000.
Neste caso, a consulta é executada em uma amostra de pelo menos nlinhas (mas não significativamente mais do que isso). Por exemplo, SAMPLE 10000000executa a consulta em um mínimo de 10.000.000 linhas.
Como a unidade mínima para leitura de dados é um grânulo (seu tamanho é definido pela index_granularityconfiguração), faz sentido definir uma amostra que seja muito maior que o tamanho do grânulo.
Ao usar a SAMPLE ncláusula, você não sabe qual porcentagem relativa de dados foi processada. Então você não sabe o coeficiente pelo qual as funções agregadas devem ser multiplicadas. Use a _sample_factorcoluna virtual para obter o resultado aproximado.
A _sample_factorcoluna contém coeficientes relativos que são calculados dinamicamente. Esta coluna é criada automaticamente quando você cria uma tabela com a chave de amostragem especificada. Os exemplos de uso da _sample_factorcoluna são mostrados abaixo.
Vamos considerar a tabela visits, que contém as estatísticas sobre 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 10000000
O próximo exemplo mostra como calcular o número total de visitas:
SELECT sum(_sample_factor)
FROM visits
SAMPLE 10000000
O exemplo abaixo mostra como calcular a duração média da sessão. Note que você não precisa usar o coeficiente relativo para calcular os valores médios.
SELECT avg(Duration)
FROM visits
SAMPLE 10000000
AMOSTRA K OFFSET
Aqui kestão mnúmeros de 0 a 1. Exemplos são mostrados abaixo.
Exemplo 1
SAMPLE 1/10
Neste exemplo, a amostra é 1/10 de todos os dados:
[++------------]
Exemplo 2
SAMPLE 1/10 OFFSET 1/2
Aqui, uma amostra de 10% é retirada da segunda metade dos dados.
[------++------]
SAMPLE Clause. Clickhouse.com. Disponível em:
https://clickhouse.com/docs/en/sql-reference/statements/select/sample. Acesso em: 05 Jan 2024.