0

我有带有列的表 Temp_load:

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); 

Source 表中有 2900 万条记录。上面的插入语句运行了 5 个多小时并且还在运行。我正在从同一张表中一次性插入 2900 万,我需要在不同的列上再插入 3 倍。

当我尝试使用 LOAD DATA INFILE 加载时,它会抛出 ERROR 1205 (HY000): Lock wait timeout exceeded; 尝试重新启动事务我也尝试将 innodb_lock_wait_timeout 增加到 120,但我们仍然面临问题。

同样在加载之前,我已在标志下方禁用。

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

我们还有其他最佳解决方案吗?插入可以以更快的方式完成。

谢谢

4

1 回答 1

0

问题可能是检查了要插入的每一行的 PRIMARY KEY 完整性。您应该在插入数据之前删除 PK。在 MariaDB 中,您可以禁用其中一些检查,但我不知道 MySQL 是否也可以。

另一种方法可能是UNION您的Temp_loadstaging.curves进入另一个表:

CREATE TABLE myNewTable 
SELECT ... FROM Temp_load
UNION
SELECT ... FROM staging.curves
于 2014-10-15T16:01:23.637 回答