我的表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):超出锁定等待超时;尝试重新启动事务 我也尝试将innodb_lock_wait_timeout增加到120,但我们仍然面临着这个问题。
在加载之前,我也禁用了旗帜。
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
我们还有其他最佳解决方案吗?插入可以更快的方式完成。
由于
答案 0 :(得分:0)
问题可能是检查要插入的每一行的PRIMARY KEY完整性。您应该在插入数据之前删除PK。在MariaDB中,您可以禁用其中一些检查,但我也不知道MySQL是否也可以。
替代方案可能是UNION
Temp_load
和staging.curves
到另一个表格中:
CREATE TABLE myNewTable
SELECT ... FROM Temp_load
UNION
SELECT ... FROM staging.curves