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

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

Experimental feature. Learn more.

Движок Alias создаёт прокси для другой таблицы. Все операции чтения и записи перенаправляются в целевую таблицу, при этом сама таблица-алиас не хранит данных и только поддерживает ссылку на целевую таблицу.

Справочные материалы

Это экспериментальная функция, которая может измениться в будущих релизах с нарушением обратной совместимости. Включите использование движка таблицы Alias с помощью настройки allow_experimental_alias_table_engine. Введите команду set allow_experimental_alias_table_engine = 1.

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

CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_table)

Или с указанием имени базы данных:

CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_db, target_table)
Примечание

Таблица Alias не поддерживает явное определение столбцов. Столбцы автоматически наследуются от целевой таблицы. Это гарантирует, что таблица Alias всегда соответствует схеме целевой таблицы.

Параметры движка

  • target_db (optional) — Имя базы данных, содержащей целевую таблицу.
  • target_table — Имя целевой таблицы.

Поддерживаемые операции

Движок таблицы Alias поддерживает все основные операции.

Операции с целевой таблицей

Эти операции проксируются на целевую таблицу:

ОперацияПоддержкаОписание
SELECTЧтение данных из целевой таблицы
INSERTЗапись данных в целевую таблицу
INSERT SELECTПакетная вставка в целевую таблицу
ALTER TABLE ADD COLUMNДобавление столбцов в целевую таблицу
ALTER TABLE MODIFY SETTINGИзменение настроек целевой таблицы
ALTER TABLE PARTITIONОперации с партициями (DETACH/ATTACH/DROP) для целевой таблицы
ALTER TABLE UPDATEОбновление строк в целевой таблице (мутация)
ALTER TABLE DELETEУдаление строк из целевой таблицы (мутация)
OPTIMIZE TABLEОптимизация целевой таблицы (слияние частей)
TRUNCATE TABLEОчистка целевой таблицы

Операции с самим алиасом

Эти операции применяются только к алиасу, а не к целевой таблице:

ОперацияПоддержкаОписание
DROP TABLEУдаляет только алиас, целевая таблица остаётся без изменений
RENAME TABLEПереименовывает только алиас, целевая таблица остаётся без изменений

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

Создание простого алиаса

Создайте простой алиас в этой же базе данных:

-- Создать исходную таблицу
CREATE TABLE source_data (
    id UInt32,
    name String,
    value Float64
) ENGINE = MergeTree
ORDER BY id;

-- Вставить данные
INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2);

-- Создать псевдоним
CREATE TABLE data_alias ENGINE = Alias('source_data');

-- Выполнить запрос через псевдоним
SELECT * FROM data_alias;
┌─id─┬─name─┬─value─┐
│  1 │ one  │  10.1 │
│  2 │ two  │  20.2 │
└────┴──────┴───────┘

Межбазовый псевдоним

Создайте псевдоним, ссылающийся на таблицу в другой базе данных:

-- Создать базы данных
CREATE DATABASE db1;
CREATE DATABASE db2;

-- Создать исходную таблицу в db1
CREATE TABLE db1.events (
    timestamp DateTime,
    event_type String,
    user_id UInt32
) ENGINE = MergeTree
ORDER BY timestamp;

-- Создать псевдоним в db2, указывающий на db1.events
CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events');

-- Или используя формат database.table
CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events');

-- Оба псевдонима работают одинаково
INSERT INTO db2.events_alias VALUES (now(), 'click', 100);
SELECT * FROM db2.events_alias2;

Операции записи через алиас

Все операции записи перенаправляются в целевую таблицу:

CREATE TABLE metrics (
    ts DateTime,
    metric_name String,
    value Float64
) ENGINE = MergeTree
ORDER BY ts;

CREATE TABLE metrics_alias ENGINE = Alias('metrics');

-- Вставка через псевдоним
INSERT INTO metrics_alias VALUES 
    (now(), 'cpu_usage', 45.2),
    (now(), 'memory_usage', 78.5);

-- Вставка с SELECT
INSERT INTO metrics_alias 
SELECT now(), 'disk_usage', number * 10 
FROM system.numbers 
LIMIT 5;

-- Проверка данных в целевой таблице
SELECT count() FROM metrics;  -- Возвращает 7
SELECT count() FROM metrics_alias;  -- Возвращает 7

Изменение схемы

Операции ALTER изменяют схему целевой таблицы:

CREATE TABLE users (
    id UInt32,
    name String
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE users_alias ENGINE = Alias('users');

-- Добавление столбца через псевдоним
ALTER TABLE users_alias ADD COLUMN email String DEFAULT '';

-- Столбец добавляется в целевую таблицу
DESCRIBE users;
┌─name──┬─type───┬─default_type─┬─default_expression─┐
│ id    │ UInt32 │              │                    │
│ name  │ String │              │                    │
│ email │ String │ DEFAULT      │ ''                 │
└───────┴────────┴──────────────┴────────────────────┘

Мутации данных

Поддерживаются операции UPDATE и DELETE:

CREATE TABLE products (
    id UInt32,
    name String,
    price Float64,
    status String DEFAULT 'active'
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE products_alias ENGINE = Alias('products');

INSERT INTO products_alias VALUES 
    (1, 'item_one', 100.0, 'active'),
    (2, 'item_two', 200.0, 'active'),
    (3, 'item_three', 300.0, 'inactive');

-- Обновление через алиас
ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active';

-- Удаление через алиас
ALTER TABLE products_alias DELETE WHERE status = 'inactive';

-- Изменения применяются к целевой таблице
SELECT * FROM products ORDER BY id;
┌─id─┬─name─────┬─price─┬─status─┐
│  1 │ item_one │ 110.0 │ активный │
│  2 │ item_two │ 220.0 │ активный │
└────┴──────────┴───────┴────────┘

Операции с партициями

Для секционированных таблиц операции с партициями передаются далее:

CREATE TABLE logs (
    date Date,
    level String,
    message String
) ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date;

CREATE TABLE logs_alias ENGINE = Alias('logs');

INSERT INTO logs_alias VALUES 
    ('2024-01-15', 'INFO', 'message1'),
    ('2024-02-15', 'ERROR', 'message2'),
    ('2024-03-15', 'INFO', 'message3');

-- Отсоединить партицию через псевдоним
ALTER TABLE logs_alias DETACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- Возвращает 2 (партиция 202402 отсоединена)

-- Присоединить партицию обратно
ALTER TABLE logs_alias ATTACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- Возвращает 3

Оптимизация таблицы

Оптимизируйте операции по слиянию частей в целевой таблице:

CREATE TABLE events (
    id UInt32,
    data String
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE events_alias ENGINE = Alias('events');

-- Множественные вставки создают несколько частей
INSERT INTO events_alias VALUES (1, 'data1');
INSERT INTO events_alias VALUES (2, 'data2');
INSERT INTO events_alias VALUES (3, 'data3');

-- Проверка количества частей
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;

-- Оптимизация через алиас
OPTIMIZE TABLE events_alias FINAL;

-- Части объединяются в целевой таблице
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;  -- Возвращает 1

Управление алиасами

Алиасы можно переименовывать или удалять независимо:

CREATE TABLE important_data (
    id UInt32,
    value String
) ENGINE = MergeTree
ORDER BY id;

INSERT INTO important_data VALUES (1, 'critical'), (2, 'important');

CREATE TABLE old_alias ENGINE = Alias('important_data');

-- Переименование псевдонима (целевая таблица не изменяется)
RENAME TABLE old_alias TO new_alias;

-- Создание ещё одного псевдонима для той же таблицы
CREATE TABLE another_alias ENGINE = Alias('important_data');

-- Удаление одного псевдонима (целевая таблица и другие псевдонимы не изменяются)
DROP TABLE new_alias;

SELECT * FROM another_alias;  -- По-прежнему работает
SELECT count() FROM important_data;  -- Данные не повреждены, возвращается 2