0

0

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

php中文网

php中文网

发布时间:2016-06-07 16:54:21

|

1099人浏览过

|

来源于php中文网

原创

当用户从数据表中查询数据时,Oracle数据库提供了两种查询的方式。一是从表中读取每一行,就是大家常说的全表扫描;二是通过ROWI

众所周知,索引确实可以提高数据库的性能。但是大家对索引的使用限制却一口未提。笔者认为对于数据库索引的作用,应该分两面看。除了肯定其对数据库性能带来的正面影响外,还需要认识到其可能带来的负面影响。只有如此,数据库管理员才能够在正确的场合使用正确的索引。要知道有时候一个错误的索引可能引发死锁,并导致数据库性能的急剧下降或进程终止;而如果数据库管理员能够做出一个正确的判断的话,那么可以使那些本来要运行几个小时甚至一天的进程在几分钟之内就能够完成。所以这两个差距是一个天上、一个地下。故笔者希望通过这篇文章能够让各位读者了解索引在使用过程中的限制,了解索引并不是万能的。

一、索引对数据库性能的影响跟数据选择性直接挂钩。

当用户从数据表中查询数据时,Oracle数据库提供了两种查询的方式。一是从表中读取每一行,就是大家常说的全表扫描;二是通过ROWID一此读取一行。当表中记录比较多的时候,很明显第二种方式能够更快的定位记录内容。而索引其实就是建立在这个查询原理之上的。如现在某个表中有300多万条记录,而现在用户可能只需要了解其中的10条记录信息。此时如果使用索引标识读取的块,则可以执行比较少的I/O,数据库系统会很快找到用户所需要的内容。而如果没有使用索引的话,则需要读取表中所有的块。

如果在这个表中加入了索引,那么到底对数据库的性能影响有多大呢?这个就不好说了,因为其跟很多因素相关。如跟数据选择性直接相关。如果用户的数据非常具有选择性,则表中家功能只有很少的行匹配索引值,则Oracle将能够快速查询匹配所引值得ROWID的索引,并且可以快速查询少量的相关表快。如还是上面这个表中,其如果存储有某个市的所有常住人口信息,其中身份证号码肯定是少不了的。如此时用户想根据身份证号码来查询某个人的信息时,那么数据库能够在很短的时间内给出响应。这主要是因为用户提供的数据非常具有选择性,基本上跟数据库中的索引值是一一对应的。而如果用户想通过出身年月信息来查询信息的话,则其数据库反映的速度就会比较慢了。

可见索引对数据库性能的影响直接跟数据的选择性挂钩。这对于数据库管理员设计索引时很有启发性。如数据库管理员在设计索引时,最好能够选择哪些具有唯一性的字段或者重复性比较少的字段。如此的话,索引对于数据库性能来说才有比较大的价值。

Picsart
Picsart

Picsart是全球最大的数字创作平台。

下载

二、索引效果跟数据库中记录的具体存储位置相关。

还是上面这张表中,如果现在用户想查找年龄超过100岁的老人,要对他们去进行慰问。假设现在符合这个条件的人只有10人。那么此时索引对数据库性能会有怎么样的影响呢?此时显然数据非常具有选择性,但是并不一定索引能够起到很好的效果。这还要看其具体存储的位置。如果这十条记录在硬盘中存储的物理位置比较近,如可能在同一个扇区之内,则此时索引对于数据库性能的影响就会比较大,,能够在最短时间内找到符合条件的数据。但是如果相关的行在表中存储的位置并不互相靠近,则这个索引的效果就会逐渐减少。因为如果匹配索引值的数据分散在硬盘上的多个酷爱时,则必须从表中选择多个单独的块以满足查询。

数据库管理员对于这一点要特别注意。因为此时如果数据库管理员查用了索引的话,那么很可能是画蛇添足。笔者建议,当数据库管理员发现数据分散在表的多个块的时候,最好是不要使用索引,而是执行全表扫描。此时执行扫描反而会比执行索引的效率更高。因为在执行全表扫描的时候,Oracle数据库系统会使用多块读取以加速扫描表。而如果采用索引的话,则其读取数据时是单块读取的。而由于数据存储在多个块中,所以其读取的速度反而会更慢。

由此可见,Oracle数据库管理员在数据库设计与日常维护中,也要想办法能够让数据尽量存储在临近的位置。如尽量减少在同一个服务器中不要部署不同的应用服务,防止硬盘产生过多的磁盘碎片;如需要采用多块硬盘的话,则最好通过表空间把类似的表放在同一个表空间中,从而让相关的行在表zhognd存储位置尽量靠近,以提高索引的使用效果。也就是说,数据库管理员在使用索引的时候,为表中的字段建立了索引这只是其工作的第一步。在后续数据库维护与调整的过程中,仍然要注意数据存储位置对索引的影响。

linux

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.6万人学习

Java 教程
Java 教程

共578课时 | 50.7万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号