我尝试使用以下查询在Oracle 11g中运行更新语句。通常它工作得很好。这一次,该声明需要花费相当长的时间才能运行。我之前在每张表中运行了多达1.5亿行。这次我在两张桌子上都有1.89亿行,而且真的很挣扎。我尝试过创建索引来帮助事情更快地运行。 Recid是唯一的,每个表都是一样的。
UPDATE QP24784_tab1_Strip1 A SET NoConflict_600_Flg = 1
WHERE NOT EXISTS (
SELECT 1 FROM QP24784_tab1_Strip_NC1 B
WHERE A.zip = B.zip AND A.lname = B.lname AND A.fname = B.fname
AND noconflict_600_rn > 1);
表QP24784_tab1_Strip_NC1是QP24784_tab1_Strip1的列的子集,但创建了nonconflict_600_rn标志。此过程的目的是创建一个不与其他记录冲突的标志 - 没有冲突意味着没有其他记录具有相同的名称和邮政编码。使用row_number函数在行上创建noconflict_600_rn,并且任何row_number高于1的记录意味着存在冲突。然后我通过加入名称和zip将该标志添加回主表。
对于我的生活,我似乎无法想出一种方法来提高这种效率。任何建议都表示赞赏。
答案 0 :(得分:0)
您可以尝试在临时表中插入要设置为1的所有ID,然后从该表进行更新。 Oracle倾向于喜欢这种方法。
在一天结束时,我最终在更新Oracle中的数百万条记录时不得不进行可怕的基于光标的更新。