锁定老帖子 主题:记一次oracle sql调优过程
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-15
最后修改:2010-01-18
这里两天都在对一条sql进行调优。该sql并不复杂,类似于
select ... from some_view
union all
select ... from some_table where datetime >= d1 and datetime< d2 and ....
底层使用ibatis2.1.6 + oracle 10g。
接到任务就像通常那样查看CBO生成的执行计划;一看就知道问题的所在--"Full table scan"(面对那样的多分区大表,这个选择实在太差),稍微修改一下查询条件选择了一个有global index的时间字段来替代;再在sql developer上试运行了一下,结果很满意--从原来的12s下降到了0.5s左右。ok,提交代码。本想着这就完事儿了,接下来出现了戏剧性的一幕:
------------顽强的分隔符------------ (updated at 2010-1-18) 今天花了些时间继续研究这个问题,导致该问题的原因的确是“导致oracle对datetime字段进行了隐式类型转换,最终CBO未能使用该列的全局索引”,不过问题不是出在ibatis上而是oracle driver。
我会再写一blog记录具体原因。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-20
完啦?
|
|
返回顶楼 | |
发表时间:2010-01-20
LZ似乎有一个大问题:
你不该对ibatis的逻辑sql调试,而应该以ibatis生成、oracle最终收到的(物理)SQL来调。 这个还是能得到的,ibatis应该提供这样的debug信息,或者用oracle相应的功能,监控收到的sql日志。 |
|
返回顶楼 | |
发表时间:2010-01-20
select * from (
select * from table_gmail union all select * from table_gdoc ) t where name = 'google' order by ... 和 select * from ( select * from table_gmail where name = 'google' union all select * from table_gdoc where name = 'google' ) order by 这个肯定有差异的 ,不过差异多少得要看数据量了 第二个效率明显高,因为他是先把查询后的结果集再union 第一个是先union再过滤 |
|
返回顶楼 | |
发表时间:2010-01-20
Hibernate也有这个问题,参考我的文:http://www.cnblogs.com/anran_guojianjun/archive/2009/10/30/1593038.html
|
|
返回顶楼 | |
发表时间:2010-01-20
JimmyWen 写道 select * from (
select * from table_gmail union all select * from table_gdoc ) t where name = 'google' order by ... 和 select * from ( select * from table_gmail where name = 'google' union all select * from table_gdoc where name = 'google' ) order by 这个肯定有差异的 ,不过差异多少得要看数据量了 第二个效率明显高,因为他是先把查询后的结果集再union 第一个是先union再过滤 数据库没那么傻 在很多数据库中这两个是一样的。 都是先过滤在union |
|
返回顶楼 | |
发表时间:2010-01-21
LucasLee 写道 LZ似乎有一个大问题:
你不该对ibatis的逻辑sql调试,而应该以ibatis生成、oracle最终收到的(物理)SQL来调。 这个还是能得到的,ibatis应该提供这样的debug信息,或者用oracle相应的功能,监控收到的sql日志。 可能是我没描述清楚 我并没有用“逻辑sql”调试, 我这个人比较懒,向来是使用v$sql_text查看最终的执行地sql语句 |
|
返回顶楼 | |
发表时间:2010-01-21
anranran 写道
Hibernate也有这个问题,参考我的文:http://www.cnblogs.com/anran_guojianjun/archive/2009/10/30/1593038.html
|
|
返回顶楼 | |
发表时间:2010-01-21
最后修改:2010-01-21
icefishc 写道 数据库没那么傻
在很多数据库中这两个是一样的。 都是先过滤在union oracle在解析sql的时候就会“重写”这类sql,使之达到最好的情况 |
|
返回顶楼 | |
发表时间:2010-01-21
Spike 写道 icefishc 写道 数据库没那么傻
在很多数据库中这两个是一样的。 都是先过滤在union oracle在解析sql的时候就会“重写”这类sql,使之达到最好的情况 呵呵,貌似一般的数据库都有自动优化 |
|
返回顶楼 | |