Вставить все строки из одной таблицы в другую идентичной структуры

Я пытаюсь переместить все содержимое таблицы в другую таблицу с той же структурой. Здесь много строк, поэтому, когда я пытаюсь выполнить это так

insert into target_table select * from source_table;

Я получаю такую ​​ошибку:

ClickHouse exception, code: 159; Read timed out

Я предполагаю, что он пытается загрузить все данные SELECT в ОЗУ, а затем вставить их в таблицу, что в данном случае невозможно. Есть ли какие-то специальные способы сделать это?

Я бы тоже не хотел циклически выделять и вставлять данные маленькими порциями.

Изменить: я ищу решение SQL.


person Andrew    schedule 13.03.2019    source источник


Ответы (2)


Сам ClickHouse должен правильно обрабатывать такие запросы.

Для простого SELECT * не нужно считывать целые данные в память, он должен работать в потоковом режиме.

Скорее всего, ваш клиент просто получает тайм-аут при ожидании подтверждения завершения операции от ClickHouse.

Итак, у вас есть следующие возможности:

  1. просто увеличьте время ожидания соединения с клиентом

  2. копировать данные несколькими вставками - срезать данные по некоторым условиям.

    INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 1 and 10000;
    INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 10001 and 20000;
    ...
    
  3. самый эффективный способ с таблицей семейства MergeTree и когда структуры таблиц точно такие же, - это копировать данные путем копирования разделов непосредственно из одной таблицы в другую.

    ALTER TABLE dst_table ATTACH PARTITION '2019-01-01' FROM source_table;
    
    -- you get get the list of partitions like that:
    SELECT partition
       FROM system.parts
       WHERE database = '...' and table = 'source_table' and active = 1
       GROUP BY partition;
    
  4. если вам просто нужно иметь еще одну копию данных (например, с другим ключом), вы можете просто автоматически заполнить ее материализованным представлением

    CREATE MATERIALIZED VIEW str2dst TO dest_table AS SELECT * FROM source_table;
    
  5. если вам нужно переместить огромные объемы данных, особенно между кластерами, clickhouse-copier - лучший вариант.

person filimonov    schedule 14.03.2019

Да, select-insert - хорошее решение только при использовании небольших таблиц.
Вы можете использовать clickhouse-copier для больших таблиц, чтобы переместить их внутри кластера или в другой кластер.
Прочтите об этом здесь

person swayamraina    schedule 13.03.2019
comment
Спасибо, это способ. Плохо, что я не упомянул об этом в исходном сообщении, но мой случай - это не администратор баз данных, а встраивание этой операции в программный код, поэтому я ищу какой-то SQL-запрос, если это возможно. - person Andrew; 13.03.2019