ОСНОВЫ И ALTER
БЫСТРЫЙ СТАРТ
CREATE DATABASE clickXX ON CLUSTER default;
USE clickXX;
ALTER СТОЛБЦЫ
| Операция | Команда |
| Добавить | ADD COLUMN col UInt64; |
| Изменить | MODIFY COLUMN col String; |
| Удалить | DROP COLUMN col; |
| Переместить | MODIFY COLUMN col AFTER col2; |
CODEC И TTL
-- Сжатие
MODIFY COLUMN col CODEC(ZSTD(10));
MODIFY COLUMN col REMOVE CODEC;
-- TTL
MODIFY COLUMN col TTL date_col + INTERVAL 1 YEAR;
MODIFY COLUMN col REMOVE TTL;
ПРОВЕРКА КЛАСТЕРА
-- Подключение к кластеру
SELECT hostName() FROM
clusterAllReplicas('default', system.one);
-- Структура на всех узлах
SELECT name, type, hostName()
FROM clusterAllReplicas('default', system.columns)
WHERE database = 'clickXX' AND table = 'table_name';
ПРАВИЛО ON CLUSTER:
✅ ALTER TABLE clickXX.table ON CLUSTER default
❌ ALTER TABLE clickXX.table (только локально)
ПАРТИЦИИ
УПРАВЛЕНИЕ ПАРТИЦИЯМИ
| Операция | Команда |
| Отсоединить | DETACH PARTITION 202101; |
| Присоединить часть | ATTACH PART '202101_1_1_0'; |
| Присоединить партицию | ATTACH PARTITION 202101; |
| Удалить | DROP PARTITION 202101; |
ОПЕРАЦИИ МЕЖДУ ТАБЛИЦАМИ
-- Копировать (исходная остается)
ALTER TABLE clickXX.dest_table
ATTACH PARTITION 202101 FROM clickXX.source_table;
-- Переместить (исходная удаляется)
ALTER TABLE clickXX.source_table
MOVE PARTITION 202101 TO TABLE clickXX.dest_table;
ПАРТИЦИОНИРОВАНИЕ
-- По год-месяц
PARTITION BY toYYYYMM(date_col)
-- По году
PARTITION BY toYear(date_col)
-- По дню
PARTITION BY toDate(date_col)
ТЕСТОВЫЕ ДАННЫЕ
INSERT INTO clickXX.table (date_col, id, value)
SELECT
toDateTime('2018-01-01') + number * 3600,
number,
rand() % 1000000
FROM numbers(8760); -- год данных
СОЗДАНИЕ ТАБЛИЦЫ
CREATE TABLE clickXX.table (
id UInt64,
date_col DateTime,
value String
) ENGINE = MergeTree
ORDER BY (id, date_col)
PARTITION BY toYYYYMM(date_col);
МОНИТОРИНГ И ДИАГНОСТИКА
СИСТЕМНЫЕ ТАБЛИЦЫ
-- Активные части
SELECT partition, name, rows, bytes_on_disk
FROM system.parts
WHERE database = 'clickXX'
AND table = 'table_name'
AND active = 1;
-- Отсоединенные части
SELECT * FROM system.detached_parts
WHERE database = 'clickXX'
AND table = 'table_name';
-- Мутации (ALTER операции)
SELECT table, command, is_done, latest_failed_part
FROM system.mutations
WHERE database = 'clickXX' AND is_done = 0;
АНАЛИЗ РАЗМЕРОВ
-- По партициям
SELECT
partition,
count() AS parts,
sum(rows) AS rows,
formatReadableSize(sum(bytes_on_disk)) AS size
FROM system.parts
WHERE database = 'clickXX'
AND table = 'table_name'
AND active = 1
GROUP BY partition ORDER BY size DESC;
-- По таблицам
SELECT table, total_rows,
formatReadableSize(total_bytes_on_disk) AS size
FROM system.tables
WHERE database = 'clickXX'
ORDER BY total_bytes_on_disk DESC;
РЕШЕНИЕ ПРОБЛЕМ
Ошибка "Tables have different structure"
-- Через промежуточную таблицу
CREATE TABLE clickXX.temp
AS clickXX.source_table
ENGINE = MergeTree...;
ALTER TABLE clickXX.source_table
MOVE PARTITION 202101 TO TABLE clickXX.temp;
ALTER TABLE clickXX.temp DROP COLUMN extra_col;
ALTER TABLE clickXX.temp
MOVE PARTITION 202101 TO TABLE clickXX.dest_table;
DROP TABLE clickXX.temp;
ОЧИСТКА
-- Проверить объекты
SELECT name FROM system.tables
WHERE database = 'clickXX';
-- Удалить
DROP TABLE IF EXISTS clickXX.table1;
DROP DATABASE IF EXISTS clickXX;
ВАЖНЫЕ НАПОМИНАНИЯ:
• Замените XX на номер (01, 02, 03...)
• Всегда ON CLUSTER для реплицированных таблиц
• Проверяйте через system.parts и system.mutations
• Используйте database = 'clickXX' в WHERE