Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Motor de tabela Log

Sem suporte no ClickHouse Cloud

O motor pertence à família de motores Log. Consulte as propriedades comuns dos motores Log e as diferenças entre eles no artigo Família de motores Log.

Log difere de TinyLog pelo fato de um pequeno arquivo de "marcas" ficar junto aos arquivos de coluna. Essas marcas são gravadas em cada bloco de dados e contêm offsets que indicam onde começar a ler o arquivo para pular o número especificado de linhas. Isso torna possível ler os dados da tabela com várias threads. Para acesso concorrente aos dados, as operações de leitura podem ser executadas simultaneamente, enquanto as operações de escrita bloqueiam as leituras e umas às outras. O motor Log não oferece suporte a índices. Da mesma forma, se a escrita em uma tabela falhar, a tabela fica inutilizada, e a leitura dela retorna um erro. O motor Log é adequado para dados temporários, tabelas gravadas uma única vez e fins de teste ou demonstração.

Criando uma tabela

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = Log

Consulte a descrição detalhada da consulta CREATE TABLE.

Gravando os dados

O motor Log armazena dados com eficiência, gravando cada coluna em seu próprio arquivo. Para cada tabela, o motor Log grava os seguintes arquivos no caminho de armazenamento especificado:

  • <column>.bin: Um arquivo de dados para cada coluna, contendo os dados serializados e comprimidos. __marks.mrk: Um arquivo de marcas que armazena offsets e o número de linhas de cada bloco de dados inserido. As marcas são usadas para tornar a execução de consultas mais eficiente, permitindo que o motor ignore blocos de dados irrelevantes durante a leitura.

Processo de gravação

Quando os dados são gravados em uma tabela Log:

  1. Os dados são serializados e comprimidos em blocos.
  2. Para cada coluna, os dados comprimidos são acrescentados ao respectivo arquivo <column>.bin.
  3. Entradas correspondentes são adicionadas ao arquivo __marks.mrk para registrar o offset e a contagem de linhas dos dados recém-inseridos.

Leitura dos dados

O arquivo com marcas permite que o ClickHouse paralelize a leitura dos dados. Isso significa que uma consulta SELECT retorna as linhas em uma ordem imprevisível. Use a cláusula ORDER BY para ordenar as linhas.

Exemplo de uso

Criando uma tabela:

CREATE TABLE log_table
(
    timestamp DateTime,
    message_type String,
    message String
)
ENGINE = Log

Inserção de dados:

INSERT INTO log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')

Usamos duas consultas INSERT para criar dois blocos de dados dentro dos arquivos <column>.bin.

O ClickHouse usa várias threads ao selecionar dados. Cada thread lê um bloco de dados separado e retorna as linhas resultantes de forma independente, assim que termina. Como resultado, a ordem dos blocos de linhas na saída pode não corresponder à ordem desses mesmos blocos na entrada. Por exemplo:

SELECT * FROM log_table
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR      │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING      │ The first warning message  │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ The first regular message │
└─────────────────────┴──────────────┴───────────────────────────┘

Classificando os resultados (ordem crescente por padrão):

SELECT * FROM log_table ORDER BY timestamp
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ The first regular message  │
│ 2019-01-18 14:27:32 │ REGULAR      │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING      │ The first warning message  │
└─────────────────────┴──────────────┴────────────────────────────┘
Navigation