如何优化在具有700M行的Oracle表上运行的更新SQL

前端之家收集整理的这篇文章主要介绍了如何优化在具有700M行的Oracle表上运行的更新SQL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
UPDATE [TABLE] SET [FIELD]=0 WHERE [FIELD] IS NULL

[TABLE]是一个具有超过7亿行的Oracle数据库表.我已经在运行了6个小时后取消了sql执行.

有什么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:
--------------------------------------------------------------------------------

猜你在找的Oracle相关文章