我们在一张表中有超过2000万条记录,我们尝试更新3K记录,但是它花了7分多钟而且没有完成,因此终止了查询。
示例查询,
UPDATE TABLE_A
SET STATUS = 'PENDING'
WHERE ID IN (
SELECT ID
FROM TMP_TABLE_A_STATUS_FIX
); /*took more than 7 mins and didn't complete even after that*/
我们收集了所有需要在临时表TMP_TABLE_A_STATUS_FIX中更新的ID(只有3K记录)。
由于上述查询花了太长时间,我们单独更新,如
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 1;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 2;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 3;
.
.
.
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 2999;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 3000; /*updated all 3K recordds in 0.00 secs*/
我真的不明白IN
查询有什么问题。
有人可以解释在where子句中有IN
的更新有什么问题,以及为什么即使在7分钟后也没有完成?
注 - TABLE_A中的ID是主键并且已编制索引。 TABLE_A中的STATUS也被索引。我们删除了STATUS的索引,因为我们认为由于索引重组而更新索引列可能需要时间,但这没有帮助。
答案 0 :(得分:4)
使用in子句的内容尝试使用内连接
UPDATE TABLE_A
INNER JOIN TMP_TABLE_A_STATUS_FIX on TABLE_A.ID = TMP_TABLE_A_STATUS_FIX .ID
SET STATUS = 'PENDING';