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

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

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

首先,它是一次性查询还是循环查询?如果只需要执行一次,则可能要考虑以并行模式运行查询。无论如何,您都将不得不扫描所有行,您可以使用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:--------------------------------------------------------------------------------


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存