`
Joard
  • 浏览: 28629 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

记一次oracle sql调优过程

阅读更多

 

    这里两天都在对一条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,提交代码。本想着这就完事儿了,接下来出现了戏剧性的一幕:

引用一下我在twitter上的原话
“@JoardSpike
这该死的Oracle CBO,无论你使用sqlplus, Toad还是sql developer在targe DB上调试出多么完美的执行计划,一旦上了应用,一样让你蛋疼。”

出现了这样的话,想必就知道为啥了?无论怎么样通过app访问测试数据库,该sql和以前一样慢。God!新的执行计划还是全表扫描,但是在其他client里却能正确执行。

    一招不行来第二招,这种不一致的情况以前也有过,ok,把视图拿下换上原表,然后加上index hint。结果还是不行,这次虽然走索引了,但是用的却不是我“提示”的索引。通常招数不行了,来更狠的。
        重新收集表的统计信息。不行... :(
        重建索引。还是不行... wo kao
        备份数据,truncate源表,重建表,为了节省时间,随便还再次重建索引。依然不行....晕
        清空shared_pool,强制让CBO为该sql生成新的执行计划。仍然不行...
        劫持DBA,一同调试,也没有找到原因。
时间就这么过去了!!!

    当我对CBO一筹莫展之际,逐步把怀疑的目光移向了应用程序。首先,在ibatis里使用的map作为parameterClass,而且使用的绑定变量,难道会是这个原因?问题会出现在这种基本处理上?首先将变量中的时间改成格式化为字符串,并在sql中在显示进行类型转换“datetime >= to_date(d1, 'yyyy-MM-dd hh24:mi:ss')”。执行计划回归正常。这个过程总只花了很少的时间。
    从上述情况来看,很有可能ibatis在处理Date时未能正确经行转换,导致oracle对datetime字段进行了隐式类型转换,最终CBO未能使用该列的全局索引。
    当然,也有可能是oracle driver有问题?也许... ...

下班了咯!现在暂时就不深究了!
不过各位同学有没有类似经验?ibatis2里会出现这种基础问题?还请告之 嘿嘿  :)

------------顽强的分隔符------------
    其实这个绑定变量的潜在问题,Tom在《Oracle高效设》就提到过,需要同学们多注意,我这次就是忘记了这点,浪费了不少时间。但最主要的原因,也是我本次写blog要记录的问题--思维定势。就像以前总结的那样,CBO大部分情况下都是正确的,不要老是怀疑CBO有问题,先找找自己的问题,最后再来怀疑那些成熟的(开源)产品。

------------顽强的分隔符------------
    在啰嗦两句。对那些才接触oracle的同学,看看这两类写法在oracle上会有多大的性能差异:
    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 ...

 

------------顽强的分隔符------------

(updated at 2010-1-18)

今天花了些时间继续研究这个问题,导致该问题的原因的确是“导致oracle对datetime字段进行了隐式类型转换,最终CBO未能使用该列的全局索引”,不过问题不是出在ibatis上而是oracle driver。

 

我会再写一blog记录具体原因。

分享到:
评论
14 楼 Spike 2010-02-04  
yongdi2 写道
Oracle调优类问题发在itpub上,几分钟内会有大牛来解决。
我发现很多开发和DBA,一有性能问题,很喜欢质疑数据库本身的能力,好像这样才显得有本事,假设Oracle,MS等设计的优化器都靠不住似的,实际以我的经验来看,它们出错的几率低到完全不必考虑。就好像本楼这个问题,date被隐形转换导致全表扫描,其实这在优化器看来是正常的不是么。和电脑不同,人总是想当然的以为什么什么就该这样,而电脑始终按实际情况办事。
80%的性能问题是因为糟糕的SQL,所以有问题应该更着眼于应用程序设计和SQL,PROC这些是否合理,也能更快速的解决问题


同意楼上的观点
CBO“正确地”输出了执行计划,而我缺“错误地”理解。
我之前也写过blog阐述过和你类似的观点
但是即便是记录过问题,却仍然出现了定势思维,这就是我记录这次调优过程的原因,提醒自己。
13 楼 yongdi2 2010-02-04  
Oracle调优类问题发在itpub上,几分钟内会有大牛来解决。
我发现很多开发和DBA,一有性能问题,很喜欢质疑数据库本身的能力,好像这样才显得有本事,假设Oracle,MS等设计的优化器都靠不住似的,实际以我的经验来看,它们出错的几率低到完全不必考虑。就好像本楼这个问题,date被隐形转换导致全表扫描,其实这在优化器看来是正常的不是么。和电脑不同,人总是想当然的以为什么什么就该这样,而电脑始终按实际情况办事。
80%的性能问题是因为糟糕的SQL,所以有问题应该更着眼于应用程序设计和SQL,PROC这些是否合理,也能更快速的解决问题
12 楼 强强爱妍妍 2010-01-30  
Spike 写道
强强爱妍妍 写道
可否把v$sql_text的最终执行的sql语句的条件部分发出来?


select SQL_TEXT , SQL_ID from v$sqltext
where SQL_TEXT  like '%KEY_WORD%';

:KEY_WORD是你想要查询的sql的关键字,例如特定的表名


我想要的是你这句sql的结果集,谢谢.
11 楼 Spike 2010-01-29  
强强爱妍妍 写道
可否把v$sql_text的最终执行的sql语句的条件部分发出来?


select SQL_TEXT , SQL_ID from v$sqltext
where SQL_TEXT  like '%KEY_WORD%';

:KEY_WORD是你想要查询的sql的关键字,例如特定的表名
10 楼 强强爱妍妍 2010-01-28  
Spike 写道
LucasLee 写道
LZ似乎有一个大问题:
你不该对ibatis的逻辑sql调试,而应该以ibatis生成、oracle最终收到的(物理)SQL来调。
这个还是能得到的,ibatis应该提供这样的debug信息,或者用oracle相应的功能,监控收到的sql日志。


可能是我没描述清楚

我并没有用“逻辑sql”调试,
我这个人比较懒,向来是使用v$sql_text查看最终的执行地sql语句


可否把v$sql_text的最终执行的sql语句的条件部分发出来?
9 楼 cwfmaker 2010-01-21  
Spike 写道
icefishc 写道
数据库没那么傻
在很多数据库中这两个是一样的。 都是先过滤在union



oracle在解析sql的时候就会“重写”这类sql,使之达到最好的情况

呵呵,貌似一般的数据库都有自动优化
8 楼 Spike 2010-01-21  
icefishc 写道
数据库没那么傻
在很多数据库中这两个是一样的。 都是先过滤在union



oracle在解析sql的时候就会“重写”这类sql,使之达到最好的情况
7 楼 Spike 2010-01-21  
<div class="quote_title">anranran 写道</div>
<div class="quote_div">Hibernate也有这个问题,参考我的文:http://www.cnblogs.com/anran_guojianjun/archive/2009/10/30/1593038.html</div>
<p><br><br>呵呵 我和兄台的情况类似<br>具体导致整个问题的根本原因我在<a href="http://joard.iteye.com/blog/573534">这个blog</a>记录一下</p>
<p> </p>
6 楼 Spike 2010-01-21  
LucasLee 写道
LZ似乎有一个大问题:
你不该对ibatis的逻辑sql调试,而应该以ibatis生成、oracle最终收到的(物理)SQL来调。
这个还是能得到的,ibatis应该提供这样的debug信息,或者用oracle相应的功能,监控收到的sql日志。


可能是我没描述清楚

我并没有用“逻辑sql”调试,
我这个人比较懒,向来是使用v$sql_text查看最终的执行地sql语句
5 楼 icefishc 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
4 楼 anranran 2010-01-20  
Hibernate也有这个问题,参考我的文:http://www.cnblogs.com/anran_guojianjun/archive/2009/10/30/1593038.html
3 楼 JimmyWen 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再过滤
2 楼 LucasLee 2010-01-20  
LZ似乎有一个大问题:
你不该对ibatis的逻辑sql调试,而应该以ibatis生成、oracle最终收到的(物理)SQL来调。
这个还是能得到的,ibatis应该提供这样的debug信息,或者用oracle相应的功能,监控收到的sql日志。
1 楼 rentianchou 2010-01-20  
完啦?
   

相关推荐

    Oracle Sql性能调优.ppt

    Oracle SQL 性能调优是一个非常重要的课题,它涉及到 Oracle 数据库的性能优化,包括 SQL 语句优化、索引使用优化、多表关联查询操作优化、SQL 执行计划优化等。下面是Oracle SQL 性能调优的详细知识点: 1. Oracle...

    ORACLE 19C SQL调优指南 中文版 Oracle DBA

    Oracle 19C SQL调优是数据库管理员(DBA)日常工作中不可或缺的一部分,它涉及到优化SQL查询性能,提高数据库系统的整体效率。本指南针对Oracle 19C版本,提供了丰富的调优策略和技术,旨在帮助DBA们更好地管理和维护...

    Oracle 19C SQL调优指南 中文版 DBA优化利器

    Oracle 19C是Oracle数据库的一个重要版本,引入了许多新的特性和优化机制,使得SQL调优有了更多的可能性和挑战。 1. **Oracle 19C新特性** - **In-Memory选项**:Oracle 19C强化了In-Memory功能,将数据的一部分...

    大牛传授Oracle SQL调优精要

    本文将深入探讨Oracle SQL调优的关键概念、方法和策略,旨在帮助读者理解并掌握这一技术。 首先,了解SQL的基础是调优的前提。SQL(Structured Query Language)是用于管理关系数据库的标准语言,包括数据查询、...

    oracle sql调优培训大纲

    Oracle SQL调优是数据库管理员和开发人员提升数据库性能的关键技能之一。在Oracle数据库环境中,SQL调优涉及到优化查询语句,以减少资源消耗,提高数据处理速度,进而改善整体系统性能。以下是一份详细的Oracle SQL...

    oracle sql调优技术文档

    sql调优 oracle sql调优技术文档

    ORACLE执行计划和SQL调优

    【Oracle执行计划和SQL调优】是数据库管理中至关重要的环节,主要涉及到如何高效地运行SQL语句,提高数据库性能。下面将详细讲解执行计划的相关概念以及SQL调优的策略。 1. **Rowid的概念**:Rowid是Oracle数据库中...

    oracle sql 调优,全面

    ### Oracle SQL调优详解 #### 一、Oracle执行计划选择 在进行Oracle SQL优化时,首先需要理解Oracle是如何选择执行计划的。Oracle提供了三种主要的执行计划选择方式: 1. **RULE模式**:这是Oracle最早的执行策略...

    Oracle SQL 调优健康检查脚本

    Oracle SQL调优是数据库管理中的重要环节,它涉及到性能优化、资源利用率以及系统稳定性等多个方面。这个"Oracle SQL 调优健康检查脚本"(sqlhc.sql)显然是一个用于评估和诊断Oracle数据库SQL查询性能的实用工具。...

    Maclean 讲 Oracle SQL 调优精要【技术文档】

    Maclean讲授的Oracle SQL调优精要,为我们提供了深入理解Oracle SQL调优原理与实践的方法。本文将详细介绍文档中提到的几个关键知识点,包括调优的思想、SQL语句的处理过程、会话执行SQL时的状态以及游标的相关知识...

    oracle SQL 调优.emmx

    oracle SQL 调优.emmx

    oracle sql调优新思维

    《Oracle SQL调优新思维》是一本深入探讨SQL性能优化的专业资料,涵盖了从理论到实践的全面内容。在Oracle数据库管理中,SQL调优是提升系统性能的关键环节,它涉及了多个方面,包括查询优化、执行计划分析、索引策略...

    Oracle 性能调优的基本方案

    Oracle 性能调优需要通过八个步骤来实现,包括设立合理的 Oracle 性能优化目标、测量并记录当前性能、确定当前 Oracle 性能瓶颈、把等待事件记入跟踪文件、确定当前的 OS 瓶颈、优化所需的成分、跟踪并实施更改控制...

    ORACLE 19C SQL调优指南.chm

    Oracle 19C SQL调优优化指南,全面提升SQL优化能力,DBA必备,开发必备

    oracle的sql调优宝典

    ### Oracle的SQL调优宝典 #### 概述 Oracle数据库是业界领先的数据库管理系统之一,在企业级应用中占据着举足轻重的地位。随着数据量的不断增长以及业务复杂度的提升,对Oracle数据库的性能优化变得尤为重要。SQL...

    Oracle SQL调优.pptx

    通过以上对Oracle SQL调优的知识点介绍,我们可以了解到SQL语句从创建到执行完成的整个生命周期,以及如何通过优化器和执行计划来提高查询效率。这对于任何从事Oracle数据库管理或开发工作的专业人士来说都是非常...

    OracleSQL调优[参照].pdf

    总的来说,Oracle SQL调优是一项综合性的任务,需要考虑查询优化器的选择、访问方法、SQL语句的复用、索引设计以及数据库配置等多个方面。理解这些知识点,并结合实际情况进行调整,可以有效地提升数据库的性能和...

    高性能SQL调优

    Oracle数据库作为业界广泛使用的数据库管理系统,其SQL调优是提升系统性能的关键环节。"高性能SQL调优"这一主题涵盖了许多相关知识点,包括但不限于以下内容: 1. **SQL优化基础**:SQL查询是数据库操作的核心,...

Global site tag (gtag.js) - Google Analytics