最近有个开发同事,讲用python调用sqlplus 运行sql脚本Select 结果很慢 有时会超过1个小时
公司有安装OEM 19c Real-time SQL Monitoring 非常强大 找到相关sqlid 结果看到 Duration 近1小时 远远大于 几分钟的Database Time
记得之前有看到过类似如下的情况解读。一种情况在于sqlplus arraysize过小 会导致 fetch过多次 更多时间消耗在 网络交互往返中
http://www.nocoug.org/download/2016-02/Poder_Real_Time_SQL_Monitoring_in_Oracle_Database_12c.pdf

现在简单试验一下
windows sqlplus client 连接测试 19c
运行下面sql 能让OEM Real-time SQL Monitoring 捕捉到
select /*+ monitor no_parallel */ * from dba_source where rownum<20000;
set termout off 让sqlplus不回显
先用默认 arraysize 15 第一次运行
再修改 set arraysize 1500 第二次运行

第一次运行 Real-time SQL Monitoring

第二次运行 Real-time SQL Monitoring

对比如下
# fetch Duration DB_Time
1 1335 2s 71ms
2 15 45ms 45ms
果然 sqlplus 默认arraysize过小 会导致 fetch过多次 更多时间消耗在 网络交互往返中 导致 Duration 远远大于 Database Time 引发实际运行时间过长
另外 现在 sqlplus 工具有个 命令选项 –F[ast] option 可以加快运行 实际也通过加大arraysize等实现,参考如下




