这里两天都在对一条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记录具体原因。
分享到:
相关推荐
Oracle SQL 性能调优是一个非常重要的课题,它涉及到 Oracle 数据库的性能优化,包括 SQL 语句优化、索引使用优化、多表关联查询操作优化、SQL 执行计划优化等。下面是Oracle SQL 性能调优的详细知识点: 1. Oracle...
Oracle 19C SQL调优是数据库管理员(DBA)日常工作中不可或缺的一部分,它涉及到优化SQL查询性能,提高数据库系统的整体效率。本指南针对Oracle 19C版本,提供了丰富的调优策略和技术,旨在帮助DBA们更好地管理和维护...
Oracle 19C是Oracle数据库的一个重要版本,引入了许多新的特性和优化机制,使得SQL调优有了更多的可能性和挑战。 1. **Oracle 19C新特性** - **In-Memory选项**:Oracle 19C强化了In-Memory功能,将数据的一部分...
本文将深入探讨Oracle SQL调优的关键概念、方法和策略,旨在帮助读者理解并掌握这一技术。 首先,了解SQL的基础是调优的前提。SQL(Structured Query Language)是用于管理关系数据库的标准语言,包括数据查询、...
Oracle SQL调优是数据库管理员和开发人员提升数据库性能的关键技能之一。在Oracle数据库环境中,SQL调优涉及到优化查询语句,以减少资源消耗,提高数据处理速度,进而改善整体系统性能。以下是一份详细的Oracle SQL...
sql调优 oracle sql调优技术文档
【Oracle执行计划和SQL调优】是数据库管理中至关重要的环节,主要涉及到如何高效地运行SQL语句,提高数据库性能。下面将详细讲解执行计划的相关概念以及SQL调优的策略。 1. **Rowid的概念**:Rowid是Oracle数据库中...
### Oracle SQL调优详解 #### 一、Oracle执行计划选择 在进行Oracle SQL优化时,首先需要理解Oracle是如何选择执行计划的。Oracle提供了三种主要的执行计划选择方式: 1. **RULE模式**:这是Oracle最早的执行策略...
Oracle SQL调优是数据库管理中的重要环节,它涉及到性能优化、资源利用率以及系统稳定性等多个方面。这个"Oracle SQL 调优健康检查脚本"(sqlhc.sql)显然是一个用于评估和诊断Oracle数据库SQL查询性能的实用工具。...
Maclean讲授的Oracle SQL调优精要,为我们提供了深入理解Oracle SQL调优原理与实践的方法。本文将详细介绍文档中提到的几个关键知识点,包括调优的思想、SQL语句的处理过程、会话执行SQL时的状态以及游标的相关知识...
oracle SQL 调优.emmx
《Oracle SQL调优新思维》是一本深入探讨SQL性能优化的专业资料,涵盖了从理论到实践的全面内容。在Oracle数据库管理中,SQL调优是提升系统性能的关键环节,它涉及了多个方面,包括查询优化、执行计划分析、索引策略...
Oracle 性能调优需要通过八个步骤来实现,包括设立合理的 Oracle 性能优化目标、测量并记录当前性能、确定当前 Oracle 性能瓶颈、把等待事件记入跟踪文件、确定当前的 OS 瓶颈、优化所需的成分、跟踪并实施更改控制...
Oracle 19C SQL调优优化指南,全面提升SQL优化能力,DBA必备,开发必备
### Oracle的SQL调优宝典 #### 概述 Oracle数据库是业界领先的数据库管理系统之一,在企业级应用中占据着举足轻重的地位。随着数据量的不断增长以及业务复杂度的提升,对Oracle数据库的性能优化变得尤为重要。SQL...
通过以上对Oracle SQL调优的知识点介绍,我们可以了解到SQL语句从创建到执行完成的整个生命周期,以及如何通过优化器和执行计划来提高查询效率。这对于任何从事Oracle数据库管理或开发工作的专业人士来说都是非常...
总的来说,Oracle SQL调优是一项综合性的任务,需要考虑查询优化器的选择、访问方法、SQL语句的复用、索引设计以及数据库配置等多个方面。理解这些知识点,并结合实际情况进行调整,可以有效地提升数据库的性能和...
Oracle数据库作为业界广泛使用的数据库管理系统,其SQL调优是提升系统性能的关键环节。"高性能SQL调优"这一主题涵盖了许多相关知识点,包括但不限于以下内容: 1. **SQL优化基础**:SQL查询是数据库操作的核心,...