oracle sql 高级编程学习笔记(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whandgdh/article/details/81945512

优化器确定了执行计划,并保存导库高速缓存区中以备日后使用,实际上下一步就是执行 计划并取得数据行。
执行计划就是告诉oracle对于每一个表对象如何访问以及什么联结方式和联结顺序来将多个表联结到一起的一系列指令。
执行计划的每一个步骤会产生一个行源,然后与另外一个行源联结,直到所有的对象都被访问和联结。
满足查询条件的行必须从数据库返回给应用。对于任何大小的结果集,需要返回的数据行可能不会在一次往返中传递给应用。数据包将会从数据库
通过网络传递给应用,直到所有的行都到达用户和调用者。
当你执行一个sql查询,返回给你的是一个简单的满足查询条件数据行组成的响应,实际上是由一系列单独执行的调用完成的,为了完成响应,你的查询将会完成解析,绑定,执行,提取步骤,在一个查询执行过程中可能有一个或多个提取调用,每次返回满足查询结果所需的一部分数据行。下图展示 一条select 语句执行的时候后台实际进行的步骤
这里写图片描述
每次调用时客户端和数据库之间的网络往返回路将会影响语句总的响应时间。除了fetch外,其他的数据库调用类型在一次查询过程中都只会发生一次。正如前面所说,oracle需要执行足够次数的fetch来调用获取并返回满足查询所需要的所有结果。
一次fetch 调用将会访问缓冲器缓存中的一个或多个数据块。每次访问一个数据块的时候,oracle都会从该块中取出数据行然后在一次回路中返回给客户端,一次返回的行数是一个可配置的值 称为列大小 arraysize。列大小是一个网络回路中一次可以传输的可能行数,如果数据行太大以至于一个包都装不下,oracle将会将这些行分解到多个包中,但即使是这样,也只需要一个fetch调用来提供特定数目的行。
sqlplus 中列大小的默认值是15(jdbc的是10),可以同构set arraysize n命令来改变它的大小。具有较大的数组大小的可能的好处有两点:减少fetch调用的次数以减少网络往返。如下例子可以很好体现,注 逻辑读取是使用consistent gets (一般来说逻辑读取还包含db block gets)标出

查看 arraysize 默认值
show arraysize
这里写图片描述
实例演示 arraysize 大小对执行计划影响

select * from order_items;

来看执行计划 其中 consistent 可以粗略的看做是逻辑读取 有52个,数据库与客户端网络往返回路为46
这里写图片描述

设置arraysize 为45
执行计划 如下
这里写图片描述

同样是返回665行数据,网络往返的次数由46减少为16,逻辑读取次数由52变为22.
当然这种改变与sql语句本身没有任何关系,而与oracle 如何能够访问并返回数据行相关。
备注 consistent gets 减少 表示查询需要的逻辑I/O减少。
arraysize 最大值5000,但是并不是设置为5000最好,因为会导致客户端和服务器使用更多的内存,并且因为服务器必须一次性准备好5000行记录才能提供给终端,会导致终端一会在等待,一会又突然处理一大批数据,导致性能出现不稳定。
S
jdbc的参数为fetch size 通常设置为50,太大会耗内存。通过如下代码设置
Connection con = null;
Statement stmt = null;
stmt = con.createStatement ();
int newFetchSize=50;
stmt.setFetchSize(newFetchSize);

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/81945512