2014-10-15 1 views
0

У меня есть таблица Temp_load с колонками:Ошибки вставка 100 млн записи в таблицах MYSQL

key bigint(19) UN PK 
plane_key bigint(20) PK 
locat_key bigint(20) PK 
time_period_key bigint(19) UN PK 
business_unit_key bigint(19) UN 
curret_allocated tinyint(1) 
value float 
valid_ind int(11) 
last_updated datetime 

выше, столбец таблицы, который Temp_load является содержащимся в нем.

я пытаюсь вставить данные в эту таблицу, используя ниже запроса

INSERT INTO <Schema_name>.`Temp_load` 
      (key, 
      plane_key, 
      locat_key, 
      time_period_key, 
      business_unit_key, 
      curret_allocated, 
      value) 
(SELECT DISTINCT 1, 
       plane_key, 
       locat_key, 
       1, 
       CASE 
        WHEN current_area = 'HEALTH' THEN 1 
        WHEN current_area = 'BEAUTY/PERSONAL' THEN 3 
        WHEN current_area = 'GM' THEN 2 
        WHEN current_area = 'CONSUMABLES' THEN 4 
       end, 
       current_flag, 
       opt_metric_1 
FROM staging.curves 
WHERE opt_metric_1 IS NOT NULL 
     AND current_area IS NOT NULL); 

Таблица Источник оказывает 29 миллионов записей в нем. Вышеупомянутый элемент вставки работает более 5 часов и продолжает работать. Я делаю вставку из 29 миллионов в один ход, как это из той же таблицы, мне нужно сделать в 3 раза больше вставки на другой столбец.

Когда я пытаюсь загрузить с помощью LOAD DATA INFILE, он бросает ERROR 1205 (HY000): превышение ожидания ожидания ожидания ожидания; попробуйте перезапустить транзакцию Я также попытался увеличить innodb_lock_wait_timeout до 120, но все же мы столкнулись с проблемой.

Также перед загрузкой i ave отключен ниже флагов.

SET FOREIGN_KEY_CHECKS = 0; 
SET UNIQUE_CHECKS = 0; 
SET AUTOCOMMIT = 0; 

Есть ли у нас какие-либо другие оптимальные решения для этого? где вставка может быть выполнена гораздо быстрее.

Благодаря

+0

Если целостность входных данных можно предположить, вы можете попробовать удалить индексы из таблицы назначения заранее, и только добавить снова после вставки. Индексы могут замедлять массивные вставки данных, поскольку данные индекса должны быть переписаны часто. Только добавление индексов впоследствии может быть способом ускорить процесс. (Однако никаких гарантий нет.) – CBroe

ответ

0

Проблема может быть, что первичный ключ целостности проверяется для каждой строки для вставки. Вы должны удалить ПК, прежде чем вставлять свои данные. В MariaDB вы можете отключить некоторые из этих проверок, но я не знаю, возможно ли это для MySQL.

Альтернативой может быть UNION вашей Temp_load и staging.curves в другую таблицу:

CREATE TABLE myNewTable 
SELECT ... FROM Temp_load 
UNION 
SELECT ... FROM staging.curves