Clickhouse: Cláusula SAMPLE

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.
 

Data de Publicação: 26-08-2024

Categoria: Clickhouse