UPDATE [TABLE] SET [FIELD]=0 WHERE [FIELD] IS NULL
[TABLE]是一个具有超过7亿行的Oracle数据库表.我已经在运行了6个小时后取消了sql执行.
编辑:此查询将运行一次,然后再也不会.
首先是一次性查询还是一次循环查询?如果您只需要执行此操作,则可能需要以并行模式查看运行查询.您将不得不扫描所有行,您可以自己分配工作负载范围的ROWID(自己动手并行)或使用Oracle内置功能.
假设您想要频繁运行它,并希望优化此查询,则字段列为NULL的行数最终将与总行数相比较小.在这种情况下,索引可以加速事情. Oracle不会将所有索引列的行索引为NULL,因此字段上的索引将不会被查询使用(因为您要查找字段为NULL的所有行).
或者:
>在(FIELD,0)上创建一个索引,0将作为一个非空的伪列,并且所有的行都将在表上编制索引.
>在(CASE WHEN字段IS NULL THEN 1 END)上创建基于函数的索引,这将仅索引为NULL的行(因此索引将非常紧凑).在这种情况下,您必须重写您的查询:
UPDATE [TABLE] SET [FIELD] = 0 WHERE(CASE WHEN字段为NULL THEN 1 END)= 1
编辑:
由于这是一次性场景,您可能需要使用PARALLEL提示:
sql> EXPLAIN PLAN FOR 2 UPDATE /*+ PARALLEL(test_table 4)*/ test_table 3 SET field=0 4 WHERE field IS NULL; Explained sql> select * from table( dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 4026746538 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%cpu)| Time -------------------------------------------------------------------------------- | 0 | UPDATE STATEMENT | | 22793 | 289K| 12 (9)| 00:00: | 1 | UPDATE | TEST_TABLE | | | | | 2 | PX COORDINATOR | | | | | | 3 | PX SEND QC (RANDOM)| :TQ10000 | 22793 | 289K| 12 (9)| 00:00: | 4 | PX BLOCK ITERATOR | | 22793 | 289K| 12 (9)| 00:00: |* 5 | TABLE ACCESS FULL| TEST_TABLE | 22793 | 289K| 12 (9)| 00:00: --------------------------------------------------------------------------------