在INSERT和UPDATE操作中如何以及何时使用索引?

时间:2016-01-10 13:42:04

标签: oracle indexing

考虑this关于索引的Oracle文档,this关于插入速度和StackOverflow上的this问题让我得出以下结论:

  • 索引可帮助我们更快地找到信息
  • 主键和唯一键自动编入索引
  • 使用索引插入会导致性能下降

但是,每次讨论索引时,只有SELECT个操作显示为示例。

我的问题是INSERTUPDATE操作中使用的索引是什么?何时以及如何?

我的建议是:

  • UPDATE可以在WHERE子句中使用索引(如果子句中的列有索引)
  • INSERT在使用SELECT时可以使用索引(但在这种情况下,索引来自另一个表)
  • 或者可能在检查完整性约束时

但我对使用索引并不了解。

2 个答案:

答案 0 :(得分:1)

对于UPDATE语句,如果优化器认为索引可以加速,则优化器可以使用索引。索引将用于定位要更新的行。索引也是一种表格,所以如果索引列得到更新,显然也需要更新索引。另一方面,如果您在没有WHERE子句的情况下运行更新,优化器可能会选择不使用索引,因为它必须访问整个表,全表扫描可能更有效(但可能仍需要更新索引)。优化器根据几个参数在运行时做出这些决定,例如是否存在针对相关表和索引的有效统计数据,受影响的数据量,硬件类型等等。

对于INSERT语句虽然INSERT本身不需要索引,但索引也需要插入',因此需要由oracle访问。 INSERT可以导致索引使用的另一种情况是INSERT,如下所示:

INSERT INTO mytable (mycolmn)
SELECT mycolumn + 10 FROM mytable;

答案 1 :(得分:0)

Insert语句对索引没有直接好处。但是more index on a table cause slower insert operation。考虑一个没有索引的表,如果要在其上添加一行,它将找到具有足够可用空间并存储该行的表块。但是如果该表上有索引,则数据库必须确保通过索引找到这些新行,因此要在具有索引的表上添加新行,也需要在索引中输入。这会使插入操作倍增。 So more index you have, more time you need to insert new rows

update it depends on whether you update indexed column or not。如果您没有更新索引列,则不应影响性能。 Index can also speed up a update statements if the where conditions can make use of indexes