关闭

解析Oracle数据扫描——Oracle SQL查询优化(1)

发表于:2013-2-28 10:23

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

 作者:javacoffe    来源:51Testing软件测试网采编

数据读取方式

  1、Oracle数据读取操作:

  1.1数据读取操作类型:

  在任何的数据库中,当我们发起一个SQL语句进行数据查询时,SQL执行引擎为了能够返回我们需要的数据,都会进行数据扫描。这个扫描可能直接发生在特定的内存空间中,也可能发生在存放数据的磁盘上。但无论如何归结起来,数据扫描的类型大致可以分为两种,即顺序扫描和随机读取。

  顺序扫描主要发生在大范围数据读取时,而随机扫描主要会发生在定位单条记录数据时。而且顺序扫描发生时通常会伴随磁盘I/O的发生,也就是说从内存中直接读取数据时通常不会发生数据顺序扫描;但是随机读取却可能发生在内存数据读取时也可能发生在磁盘数据读取时。当SQL执行数据读取时,数据能够从数据缓冲区中命中时,此时通常就会发生内存随机数据读取;但是当通过索引访问数据,而数据又没有缓存在数据缓冲区中时,此时就会通过索引回表去读取索引对应的数据,此时就会发生磁盘随机I/O读取。

  通常如果数据读取数量不大,无论是数据扫描还是随机读取,数据读取性能都不会太差,都能够很快返回数据。但是随着读取数据范围的扩大,那么随机读取就会表现出对数据读取性能的极大损害。如果发生的随机读取都是内存数据读取,那么这种损害的表现还不是马上就会显现,但是随着时间的推移以及数据读取范围的不断扩大,那么即便是内存数据读取也会表现出性能的急剧下降。因为数据在内存中,是被复杂的数据结构来管理的,在内存中操作这些数据时不可避免的要使用各种复杂的数据结构的操作算法,同时可能还要伴随着各种并发控制策略,因此大数据量的内存随机读取代价其实是不菲的。但是上述情况通常是不常见的,更加常见的是另外一种情况,那就是发生大量的随机磁盘I/O读取,通常这种情况会发生在,读取数据的索引选择性太差或者索引的聚簇因子过高等原因造成的,这种情况一旦出现那么对系统的整体性能造成的伤害会非常大。因为随机I/O所读写的数据都是一些不连续的数据,因此要进行大量的随机I/O,那么不可避免会造成物理磁盘不停的进行数据读写寻道,这非常可能形成系统整体的I/O瓶颈。在Oracle中如果出现了由于大量随机I/O造成的数据读取性能问题,通常会伴随有较高的诸如buffer_busy_wait、db_sequence_read等待事件时间。因此如果涉及较大范围的数据读取,最好能够驱使数据库的执行引擎不要进行随机I/O读取,而进行数据扫描读取,也就是说在数据范围较大读取发生时,应该驱使数据库出现连续I/O操作,而不要出现不连续I/O操作,因为扫描操作其实是一种连续I/O操作。

  扫描操作也分为两种情况,即全部范围扫描和局部范围扫描。所谓全部范围扫描,是指一次性扫描满足“驱动查询条件”范围的所有数据,然后在扫描的结果基础上应用查询的过滤条件进行数据过滤进而得到最终查询结果;局部范围扫描是指在进行数据扫描时,不会一次性扫描满足“驱动查询条件”范围的所有数据,而是只扫描满足驱动查询条件一定范围的数据,这个扫描范围远远小于整体数据范围,在Oracle中称为批量数组Array_Size,当扫描的数据足以填满批量数组时,查询就立刻返回查询结果,而且在用户再次提出数据浏览要求之前停止查询的执行。

  由此可见局部范围扫描能使扫描的数据量在很大程度上得到缩减,并能快速的返回查询结果,提高查询应用的响应性。局部范围扫描并不是真正的缩减了查询结果数据的范围,而是利用了大多数用户并不需要一次性浏览所有数据的特点,因此只返回部分数据供用户查看。因此在一个具有大数据量而又要求系统具有很高响应性,同时大多数查询操作涉及较大范围数据的应用系统中,应该更多的引导数据库的执行引擎进行数据局部范围扫描,来提升数据查询的性能和整体系统的响应性。

  全部范围扫描和局部范围扫描的处理过程如下图所示:

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号