深度揭露Oracle索引使用中的限制

发表于:2009-4-30 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

  通常情况下,索引可以提高数据库的性能。如通过索引,则Select、Update、、Delete语句的Where子句的性能可以从索引中获得收益。但是这并不是百分之百准确的。或者说,只有这些语句涉及到的行比较少的时候,这个原则是准确的。但是如果所涉及到的行比较多,则这个索引的应用反而会降低数据库的性能。

  如现在数据库系统中有一张表,其中包含了300万条记录。而用户现在需要利用Delete语句删除其中100万条记录。如想要把记录创建日期为2005年12月31日前的数据全部删除掉。此时虽然采用了Where子句的限制条件,但是这个时候因为删除的数据量太多,其并不能够从索引中获取什么好处。因为利用delete语句删除记录的时候,同时需要删除相关的索引。当Delete语句需要删除将近表中一半的记录的时候,同时需要删除跟这个表相关的近一半的索引,这个过程是非常耗时的。为此大量行的Delete操作会因为表中存在索引而降低其执行速度。另外Insert语句也会有类似的现象。通常情况下,增加索引会降低Insert语句的执行新能。因为在执行insert语句的时候,由于索引的存在,数据库需要同时往数据表与索引表中插入数据。为此,从理论上来说,数据库表中的每个索引都回使得对这个表进行Insert操作时速度减慢两倍;而在这个数据表上使用两条索引则会使得插入速度减慢一倍。

  可见并不是所有语句或者操作都能够从索引中获得收益。为此数据库管理员必须要了解索引跟一些常用命令之间的冲突。只有如此数据库管理员才能够在索引给某些操作带来的收益与损失之间取得一个均衡,并根据相关的操作来调整索引。对于这一点笔者有如下几个建议,大家可以参考一下。

  一是当需要网一个表中插入大量数据的时候,最好能够先把索引取消,以提高插入的速度。如现在数据库管理员需要往表Product中添加记录的话,无论其采用什么方式,如采用Select into语句,还是采用图形化的导入工具都好。当需要插入的记录比较多的时候,最好先把索引禁用掉。此时数据库只需要在数据表中插入数据即可,而不用维护索引表。等到数据导入完成之后,再起用这个索引。此时数据库会重建这些记录的索引。这是大部分数据库管理员在数据插入的过程中常用的手段。可以明显提高数据库的插入性能。

  二是当因为某些原因需要清空数据库表中的记录时,如果这张数据表中的记录比较多时,则可以考虑一下先把表中的索引取消掉,然后再执行删除操作。如此的话数据库系统在删除数据的时候,就不用同时维护数据表与索引表了。故可以成倍提高Delete的操作效率。等到删除操作执行完毕后,再启用索引。

  当受影响的记录比较多时,上面这两个建议可以明显的提高数据库的执行性能。特别是在应用系统初始化的过程中,可能需要导入大量的初始化记录。有时候可能发现数据导入有错误需要整张表清空等等。此时如果先把索引禁用掉的话,则数据库管理员会发现,期初数据导入会变得顺利许多。

  数据库系统强制性的要求。即使不采用这些建议,数据库最终也可以完成相关的任务。只是其速度上可能会有差异。而且随着记录的不同,这个差异有时候可能会相差几十个小时。总之笔者认为作为一个优秀的数据库管理员,应该了解索引在不同情况下对数据库系统的影响。大丈夫能屈能伸。在必要的情况下,数据库管理员要敢于取消索引,以提高某些操作的性能。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号