关于察看SQL执行时间

[复制链接]
查看11 | 回复6 | 2012-11-15 10:37:52 | 显示全部楼层 |阅读模式
我在sqlplus里用set timing on来察看一条SQL的执行时间是12分钟,但是我在pl/sql developer里执行取完所有结果也只用了2分钟。我想知道set timing on所得出的时间是什么时间呢?和用工具从执行语句到取到结果所用的时间有什么区别呢?希望高手解惑,谢谢!

回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
你在sqlplus 里设置过arraysize吗?
回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
因为有结果缓存区,第一次执行的结果会保存在内存,第二次执行时就直接从内存找,所以第二次就快多了。与执行的工具无关,你可以测试使用工具的不同顺序。
回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
demonat 发表于 2012-9-27 11:35
你在sqlplus 里设置过arraysize吗?

高人呐!根据你的提示我把arraysize由默认的15改为100,查询时间由12分钟降为不到2分钟。另外这个arraysize的最优值应该设为多少呢?
回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
arraysize定义了一次返回到客户端的行数,当扫描了arraysize 行后,停止扫描,返回数据,然后继续扫描。
这个过程就是统计信息中的SQL*Net roundtrips to/from client。因为arraysize 默认是15行,那么就有一个问题,因为我们一个block 中的记录数一般都会超过15行,所以如果按照15行扫描一次,那么每次扫描要多扫描一个数据块,一个数据块也可能就会重复扫描多次。
重复的扫描会增加consistent gets 和 physical reads。 增加physical reads,这个很好理解,扫描的越多,物理的可能性就越大。
consistent gets,这个是从undo里读的数量,Oracle 为了保证数据的一致性,当一个查询很长,在查询之后,数据块被修改,还未提交,再次查询时候,Oracle根据Undo 来构建CR块,这个CR块,可以理解成数据块在之前某个时间的状态。 这样通过查询出来的数据就是一致的。 那么如果重复扫描的块越多,需要构建的CR块就会越多,这样读Undo 的机会就会越多,consistent gets 就会越多。
如果数据每次传到客户端有中断,那么这些数据会重新扫描,这样也就增加逻辑读,所以调整arraysize可以减少传的次数,减少逻辑读。
它其实只会减少将数据传给客户端的次数其实并不是可以搞高sql执行的效率的
回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
学习了!
回复

使用道具 举报

千问 | 2012-11-15 10:37:52 | 显示全部楼层
学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行