首先,它是一次性查询还是循环查询?如果只需要执行一次,则可能要考虑以并行模式运行查询。无论如何,您都将不得不扫描所有行,您可以使用ROWID(自己动手做并行性)范围自己划分工作负载,也可以使用Oracle内置功能。
假设您要经常运行它并希望优化此查询,则
field列为NULL的行数最终将比总行数少。在这种情况下,索引可以加快处理速度。Oracle不会将所有索引列都为NULL的行编制索引,因此
field查询不会使用on的索引(因为您要查找所有
field为NULL的行)。
任何一个:
- 在上创建索引
(FIELD, 0)
,该索引0
将用作非NULL伪列,并且所有行都将在表上建立索引。 - 在上创建基于函数的索引
(CASE WHEN field IS NULL THEN 1 END)
,这只会索引为NULL的行(因此索引将非常紧凑)。在这种情况下,您将不得不重写查询:
UPDATe [TABLE] SET [FIELD]=0 WHERe (CASE WHEN field IS NULL THEN 1 END)=1编辑:
由于这是一次性方案,因此您可能需要使用
PARALLEL提示:
SQL> EXPLAIN PLAN FOR 2 UPDATE test_table 3 SET field=0 4 WHERe field IS NULL;ExplainedSQL> 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:--------------------------------------------------------------------------------
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)