ORACLE索引表的插入性能

5
为什么在索引表上执行插入语句速度较慢?
4个回答

14

这实际上是与以下问题相同的类型:

为什么把所有杂货放在超市购物袋里离开后,要把它们全部放到厨房的正确位置需要更多时间?

这是因为当储存您的杂货时,您希望它们处于一个良好的、众所周知的位置,以便以后更容易找到它们。

数据库也必须这样做。

  • 如果没有索引的表格,它可以将新数据直接添加到表格末尾。
  • 如果有索引,数据库就要执行更多的工作。它可能仍然会将记录放在表格末尾,但另外它还要更新索引,以确保如果您之后想要找到该记录,它会比没有索引时更快地找到。

这意味着添加更多的索引将进一步减慢插入速度。

很明显,只有在之后也要使用索引来提高查询性能时,才应该创建索引。如果你只创建了一个索引而且后面并没有使用它来改善查询性能,那么就没有必要拥有这个索引,因为它只会减慢插入速度,并不会改善任何查询。


为了使类比更加严谨正确,我会说这就像获得每种杂货的两个;一个项目以任何旧顺序放在食品储藏室中,重复的项目按字母顺序放在厨房台面上。当然,除非您使用索引组织表,在这种情况下,您不需要为食品储藏室获取该项目 :) - Jeffrey Kemp

9

一个INSERT语句需要将数据添加到表数据块并更新表定义的任何索引。

显然,如果您有一个索引,插入操作还需要做一些额外的工作来更新索引。


1

索引允许您在索引块中存储有关数据的更多信息,从而帮助更轻松地检索数据。显然,您最初要做额外的工作以便日后受益(用于选择操作)。


0
如果您需要在以后从插入的表中删除一些数据,那么在表上建立索引不是一个好主意吗?将数据插入表中所需的额外时间可以通过在索引表上运行更快的删除操作来补偿(如果在删除WHERE子句中使用了索引列)。???

这并没有回答所问的问题。此外,一般性的反对使用索引的建议(尤其是没有具体上下文的情况下)是很差的建议。 - Vadim K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接