【问题标题】:Update an indexed column Oracle更新索引列 Oracle
【发布时间】:2018-12-11 17:20:07
【问题描述】:

假设我们有一个带有索引列(类别)的表(汽车) 包含 'A' 、 'B' 、 'C' 等值。

如果我想调整此列上的更新,知道我在 where 条件下使用它:

 update cars set category = 'Class A' where category = 'A';

那么最好的解决方案是什么?

  • 更改索引 Index_Name 禁用
  • 更新 DML
  • 更改索引 Index_Name 重建

  • 删除索引Index_Name
  • 更新 DML
  • 在(汽车)上创建索引 Index_Name

【问题讨论】:

  • 你认为你为什么需要它?除非您更新数亿行,否则通常不需要这样做
  • 假设我有一个包含 5000 万行的表。

标签: oracle performance sql-tuning


【解决方案1】:

让我解释一下,更新将根据数据分布使用索引

70% Status='A'
20%'B'
10% 'C'

那么Status='A' 会更好地使用全表扫描,因为它可以获取表中的大部分数据,但是如果您想获得“C”,那么在您访问特定数据时索引会更好。

但是对于你的 update ,并且你有一个索引,优化器(大多数时候)会找到一个更好的执行和查询计划。那你为什么担心?是不是比平时要花更多时间?

如果您有大量数据并且想要更新它们,第一种方法将是您正在执行的索引,如果此表被大量命中(许多 dml 操作)并且它包含多个索引,则需要更新统计信息,此查询将在上次更新统计信息时为您提供信息(从 user_tables 中选择 last_analyzed where table_name ='urtable';)

Alter Index Index_Name Disable--> 只有在基于函数的索引时,此语句才会禁用索引。您可以使用unusable 或更好的方法,并建议将其设为不可见。

Alter Index Index_Name rebuild 就像您再次创建索引一样,它会回收空间。当您有很多数据更改时,您可以考虑它。请注意,您需要与索引相同的空间。

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2021-11-25
    • 2017-08-30
    相关资源
    最近更新 更多