2015-02-24 74 views
0

我正在尝试使用以下查询在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

Recid是独一无二的吗?但是你不会在你的查询中使用它。也发布执行计划。根据定义,反连接是有问题的,有时候如何优化它们是没有办法的。您可以在QP24784_tab1_Strip_NC1(zip,lname,fname,noconflict_600_rn)上创建唯一/名词索引。但是,即使您创建该索引,Oracle可能会决定将整个表QP24784_tab1_Strip_NC1放入TEMP表空间的散列段中,然后通过QP24784_tab1_Strip1运行全表扫描。 – ibre5041 2015-02-24 15:47:38

+0

另外当你注意到你对数据有更多的了解时,你可以使用基数提示来帮助他。 – ibre5041 2015-02-24 15:48:52

+0

我认为所有这些解释计划不会帮助你处理的行数。您需要批量运行更新,例如针对行数运行更新并提交。然后再次运行你的代码......如果我正确地记住了这个技巧,在Tom Kyte有效的Oracle设计书中描述。在其中一章中,他描述了如何处理大量行并确保有效运行查询的确切步骤。如果不忘记的话,我可以试着查看它。我认为你可以下载这本书。 – Art 2015-02-24 17:02:21

回答

0

您可以尝试在临时表中插入想要设置为1的所有ID,然后从该表中更新。 Oracle倾向于喜欢这种方式。

在一天结束时,我在更新Oracle数百万条记录时不得不做出可怕的基于游标的更新。