更新索引列Oracle

时间:2018-12-11 08:40:25

标签: oracle performance sql-tuning

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

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

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

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

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

  • 放置索引Index_Name
  • 更新DML
  • 在(汽车)上创建索引Index_Name

1 个答案:

答案 0 :(得分:0)

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

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

然后Status='A'在全表扫描中会更好,因为它可以获取表中的大多数数据,但是如果要获取'C',则索引在访问特定数据时会更好。

但是对于您的update,您有一个索引,优化器将(大部分时间)找到更好的执行和查询计划。那你为什么担心呢?比平时要花更多时间吗?

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

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

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