arraysize参数
这里先简单描述下这个客户端参数arrzysize。
arraysize是sqlplus的一个特定参数,最大值为5000(java程序中叫做fetchsize)。表示读取一次buffer,最多返回给用户的行的数量。
需要注意一点,当一个block的行数大于arraysize参数时,需要反复读取同一个buffer
场景模拟
接下来对这个场景进行模拟,分析下arraysize参数对于SQL执行的影响。
使用scott用户登录
SQL> connect scott/scott; Connected. SQL> show user; USER is "SCOTT"
复制
查看当前的arraysize值
SQL> show arraysize arraysize 15
复制
执行一个大型的查询语句
SQL> select * from t1; 86335 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 --------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------- | 0 | SELECT STATEMENT | | 86335 | 8262K| 344 (1)| 00:00:05 | | 1 | TABLE ACCESS FULL| T1 | 86335 | 8262K| 344 (1)| 00:00:05 | --------------------------------------------------------------- Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 6907 consistent gets 1233 physical reads 0 redo size 9926753 bytes sent via SQL*Net to client 63828 bytes received via SQL*Net from client 5757 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 86335 rows processed
复制
这里我们发现内存读的次数远远大于物理读的次数。
然后增大一下arraysize的值,再执行一遍
SQL> set arraysize 100; SQL> / 86335 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 --------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------- | 0 | SELECT STATEMENT | | 86335 | 8262K| 344 (1)| 00:00:05 | | 1 | TABLE ACCESS FULL| T1 | 86335 | 8262K| 344 (1)| 00:00:05 | --------------------------------------------------------------- Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 2089 consistent gets 1233 physical reads 0 redo size 9016841 bytes sent via SQL*Net to client 10016 bytes received via SQL*Net from client 865 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 86335 rows processed
复制
发现内存读次数明显减少,开始接近物理读的次数
然后将arraysize设置为5000
SQL> set arraysize 5000; SQL> / 86335 rows selected. ... Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 1253 consistent gets 1233 physical reads 0 redo size 8859485 bytes sent via SQL*Net to client 710 bytes received via SQL*Net from client 19 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 86335 rows processed
复制
内存读和物理读的次数变得十分接近,这样似乎会让我们看起来觉得是“正常”的了。这里我们先看另一个指标的变化,roundtrips。
5757 SQL*Net roundtrips to/from client 865 SQL*Net roundtrips to/from client 19 SQL*Net roundtrips to/from client
复制
用户一次请求,服务器一次数据返回叫做一次roundtrip。
结合起来,很好解释这个现象了。arraysize的值远远小于block中rows,因此每次只能读取一个block(或者说buffer)的一部分数据,而对于这个全表查询,需要每个block的所有rows,那么同一个bolck就需要被反复读取,带来的结果就是,读取的次数就增加了。由于读取的最小单位就是block,因此我们发现在一个block需要反复读取的时候,一次consistent gets变成了n次。
在不断增加arraysize大小的过程中,读取的次数逐渐减少,consistent gets与physical reads越来越接近。
最后修改时间:2020-03-15 16:30:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1318次阅读
2025-04-27 16:53:22
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
798次阅读
2025-04-18 14:18:38
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
794次阅读
2025-04-30 15:24:06
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
666次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
600次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
551次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
536次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
511次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
502次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
481次阅读
2025-04-30 12:17:50