一则sql优化的例子
来源:互联网 发布:炸微信群软件下载 编辑:程序博客网 时间:2024/05/19 07:11
今天开发的同事跟我说一个奇怪的现象,一个统计的sql语句如果在存储过程里面查询就很慢,半个多小时都查不出来,但是把sql语句拷到pl develop里面执行就很快,100s左右就执行完了,让我看看什么情况,我用pl develop登录上去后,首先找到这个会话的sid(从pl develop的session窗口可以找到其sql语句,对比一下就知道了),根据我的习惯,首先看等待事件,通过v$sessiion视图查看等待事件,状态,执行时长等信息。很奇怪的是:这个会话的状态为active,等待事件是SQL*Net message from client, 执行时长2000多秒。有点发蒙,通常我们看到SQL*Net message from client 等待事件的时候都是inactive状态,然后网上查了下,有一篇文章说 继续观察 v$sql里面的buffer_gets,disk_reads,cpu_time,elapsed_time字段值,如果这些值还在增长,说明sql语句有问题,需要调优。
继而查询了v$sql 中的这些字段值,sql语句如下:
select buffer_gets,disk_reads,cpu_time,elapsed_time
from v$sql where sql_id='0tbcdsp23xta9'
发现这些值果然在增长,看来是sql语句的问题。
看来需要对sql语句进行优化,根据我的思路,首先查看执行计划:
select * from table(dbms_xplan.display_cursor('3ru5wuxz0qkz0',null,'all'));
发现执行计划走了个不该走的索引,现在问题算是定位到了。
找到问题就比较好解决了,本来以为清空共享池会走正确的执行计划(报表数据库,清空共享池不会造成大的影响),因为清空共享池会重新生成执行计划,试了一下,还是会走之前的执行计划。不凑效,只好在sql语句中加hint让它不走该索引,在select后面加上 /* no_index(A IND_WLAN_USER_1)*/就可以了,继续测试,发现很快就执行完了。
同事问我为啥在pl develop里面执行就比较快,在存储过程中执行就变慢了,我解释:
因为sql语句的执行计划不一样,在存储里面用的绑定变量,使用已生成的执行计划;在pl develop里面使用的是字面值,得重新解析生成新的执行计划。事实上,oracle会认为这是两个不同的sql语句,执行计划就可能不一样了。
至于为啥出现存储过程在执行过程中(未执行完),状态是active,sql_id不为空,而等待事件是 SQL*Net message from client,我还是没搞清楚,希望能得到高人解惑!著名笔者刊www.zmbzk.com
继而查询了v$sql 中的这些字段值,sql语句如下:
select buffer_gets,disk_reads,cpu_time,elapsed_time
from v$sql where sql_id='0tbcdsp23xta9'
发现这些值果然在增长,看来是sql语句的问题。
看来需要对sql语句进行优化,根据我的思路,首先查看执行计划:
select * from table(dbms_xplan.display_cursor('3ru5wuxz0qkz0',null,'all'));
发现执行计划走了个不该走的索引,现在问题算是定位到了。
找到问题就比较好解决了,本来以为清空共享池会走正确的执行计划(报表数据库,清空共享池不会造成大的影响),因为清空共享池会重新生成执行计划,试了一下,还是会走之前的执行计划。不凑效,只好在sql语句中加hint让它不走该索引,在select后面加上 /* no_index(A IND_WLAN_USER_1)*/就可以了,继续测试,发现很快就执行完了。
同事问我为啥在pl develop里面执行就比较快,在存储过程中执行就变慢了,我解释:
因为sql语句的执行计划不一样,在存储里面用的绑定变量,使用已生成的执行计划;在pl develop里面使用的是字面值,得重新解析生成新的执行计划。事实上,oracle会认为这是两个不同的sql语句,执行计划就可能不一样了。
至于为啥出现存储过程在执行过程中(未执行完),状态是active,sql_id不为空,而等待事件是 SQL*Net message from client,我还是没搞清楚,希望能得到高人解惑!著名笔者刊www.zmbzk.com
0 0
- 一则sql优化的例子
- Nginx + Apache 的优化例子一则
- SQL优化一则
- SQL优化案例一则
- 区间检索SQL优化一则
- Oracle SQL 'or' 的优化,最近的案例一则。
- SQL优化一则:灵活运用字段的选择性
- 一则XML Schema的例子
- SQL优化案例一则,insert到临时表的sql优化余地
- 多条件组合查询SQL优化一则
- 使用WITH语法优化SQL一则
- SQL 大数据量的优化例子讨论
- SQL优化一则:CBO查询SQL一次比一次慢
- 一则PHP性能优化的技巧
- 一则对or条件的优化处理
- 一则分页查询的简单优化
- sql优化例子
- sql优化经典例子
- 如果组织引细绳一位狭
- 教你70呢?塞,得知狙
- LoaderManager使用详解(三)---实现Loaders
- Swift开发iOS项目实战视频教程(九)---一站到底5(题目更新与结果显示)
- STL 迭代器
- 一则sql优化的例子
- ACM:树的变换,根据表达式建立表达式树
- phpcms v9多文件上传字段获取文件url路径地址的方法
- 单变量线性回归程序实现
- 在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错
- Hibernate Annotation (Hibernate 注解)
- 提供webServices的网址
- LoaderManager使用详解(四)---实例:AppListLoader
- phpcms中$PHPCMS 数组