我有两个表ORDERS和ORDER_TEMP,两者结构相同。 ORDER_ID是两个表中的主键。
现在,我必须从ORDER_TEMP表中的值更新ORDER表中的KEY_ID列。
两个表中都有超过百万条记录。
UPDATE ORDER
SET KEY_ID = ( SELECT KEY_ID FROM ORDER_TEMP WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID and ORDER_TEMP.PNP_GROUP=99)
如果我在ORDER表上放置一个where子句并为一个订单运行它确实有效,但是当我为整个表执行时它会永远运行并且它不起作用。
请帮忙
答案 0 :(得分:1)
假设您的目的是仅更新ORDER
表中ORDER_TEMP
表中匹配且KEY_ID
不同的行,而忽略ORDER
不同的行{1}}是一个无效的表名,我首先要确保您只更新表中预期修改的行数少于20%
UPDATE ORDER
SET KEY_ID = ( SELECT KEY_ID
FROM ORDER_TEMP
WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID
and ORDER_TEMP.PNP_GROUP=99)
WHERE EXISTS( SELECT 1
FROM order_temp
WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID
and ORDER_TEMP.PNP_GROUP=99
and order_temp.key_id != order.key_id)
如果两个表中的KEY_ID
都为NULL
,则需要调整EXISTS
子句中的不等式比较。
如果这不能解决问题,我们需要从当前查询计划和可用索引开始的更多信息。