Перейти к основному содержанию
Перейти к основному содержанию

Движок таблицы StripeLog

Not supported in ClickHouse Cloud

Этот движок относится к семейству лог-движков. Общие свойства лог-движков и их различия см. в статье Log Engine Family.

Используйте этот движок в сценариях, когда необходимо создавать большое количество таблиц с небольшим объёмом данных (менее 1 миллиона строк). Например, такую таблицу можно использовать для хранения входящих пакетов данных для последующей трансформации, когда требуется их атомарная обработка. До 100 тыс. экземпляров таблиц этого типа являются нормальной конфигурацией для одного сервера ClickHouse. Этот табличный движок следует предпочесть движку Log, когда требуется большое количество таблиц, однако это происходит за счёт эффективности чтения.

Создание таблицы

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 = StripeLog

См. подробное описание запроса CREATE TABLE.

Запись данных

Движок StripeLog хранит все столбцы в одном файле. Для каждого запроса INSERT ClickHouse добавляет блок данных в конец файла таблицы, записывая столбцы по отдельности.

Для каждой таблицы ClickHouse создает следующие файлы:

  • data.bin — файл с данными.
  • index.mrk — файл с метками. Метки содержат смещения для каждого столбца каждого вставленного блока данных.

Движок StripeLog не поддерживает операции ALTER UPDATE и ALTER DELETE.

Чтение данных

Файл с метками позволяет ClickHouse параллелизировать чтение данных. Это означает, что запрос SELECT возвращает строки в непредсказуемом порядке. Используйте оператор ORDER BY для сортировки строк.

Пример использования

Создание таблицы:

CREATE TABLE stripe_log_table
(
    timestamp DateTime,
    message_type String,
    message String
)
ENGINE = StripeLog

Вставка данных:

INSERT INTO stripe_log_table VALUES (now(),'REGULAR','Первое обычное сообщение')
INSERT INTO stripe_log_table VALUES (now(),'REGULAR','Второе обычное сообщение'),(now(),'WARNING','Первое предупреждение')

Мы использовали два запроса INSERT, чтобы создать два блока данных в файле data.bin.

ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по мере завершения возвращает соответствующие строки независимо от других. В результате порядок блоков строк в выходных данных в большинстве случаев не совпадает с порядком этих же блоков во входных данных. Например:

SELECT * FROM stripe_log_table
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR      │ Второе обычное сообщение │
│ 2019-01-18 14:34:53 │ WARNING      │ Первое предупреждение  │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ Первое обычное сообщение │
└─────────────────────┴──────────────┴───────────────────────────┘

Сортировка результатов (по умолчанию — по возрастанию):

SELECT * FROM stripe_log_table ORDER BY timestamp
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR      │ Первое обычное сообщение   │
│ 2019-01-18 14:27:32 │ REGULAR      │ Второе обычное сообщение   │
│ 2019-01-18 14:34:53 │ WARNING      │ Первое предупреждение      │
└─────────────────────┴──────────────┴────────────────────────────┘