Как минимизировать требования к оперативной памяти для копирования данных из (большой) многораздельной таблицы в другую многораздельную таблицу? - PullRequest
0 голосов
/ 30 мая 2020

Для двух больших таблиц, table1 и table2 с тысячами разделов и 150 миллионами строк в table1, mysql / mariadb выполняет этот запрос неэффективно.

insert into table2 select * from table1

Фактически, используя 8192 раздела в обеих таблицах, RAM был исчерпан до завершения запроса. Мне пришлось прекратить его, когда он выделил 6,1 ГБ ОЗУ, поскольку в этом конкретном устройстве было только 8 ГБ ОЗУ. Как можно выполнить эту задачу с меньшим объемом оперативной памяти?

1 Ответ

0 голосов
/ 30 мая 2020

Заставив mysql / mariadb работать с данными из одного раздела за раз, задача может быть выполнена, используя менее 500 МБ ОЗУ в любой момент.

Структура решения выглядит так:

insert into table2 select * from table1 partition (p<X>)

, где X должен быть полным набором целых чисел, которые соответствуют разделам, в моем случае от 0 до 8191. Это может быть реализовано с помощью хранимой процедуры, такой как:

drop procedure if exists create_partitioned_table_tweets;

delimiter #
create procedure my_partitioning_data_copy_procedure()
begin

declare v_max int unsigned default 8191;
declare v_counter int unsigned default 0;

  start transaction;
  while v_counter < v_max do
    SET @expression = concat("insert into table2 select * from table1 partition (p", v_counter, ");");
    prepare myquery from @expression;
    execute myquery;
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call my_partitioning_data_copy_procedure();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...