前些时候候遇到一个SQL的性能问题,在解决过程里了解到了一些东西。有数据库表T,主键是列A, B, C, D, E。每天需要定时从上游数据库源取数据过来更新,大约10几万条。更新的操作过程是,对每条上游数据按几个关键字段在表T中进行删除操作。delete from T where B = ? and C=? and E = ?
然后再进行Insert操作。
系统运行到三个多月的时候,遇到了问题。UAT环境(Oracle 10g)性能正常,10万条记录更新是10多分钟,Production环境(Oracle 9i,还没来得及升级), 有一天突然从10多分钟变成了一个小时,用户无法接受。首先确认了表的统计信息都是最新的,在分析查询计划后,发现性能下降主要由delete操作引起的,10g在优化中找到了索引,而9i在优化中用了CBO,全表扫描。试着改成强制使用RBO,还是没有用到索引。后来想到,可能是因为列A没有在where条件中,而我们除了主键以外,没有建另外的索引,所以聚集索引匹配的时候,第一个字段没有匹配上,就放弃使用索引了。而10g的优化器聪明一些,第一个列没找到后,还尝试了继续匹配。于是试着在where中加上A=?这人条件,再执行,果然用上索引了。由于A条件放在where中没什么意义,所以后来的解决办法是在区别度比较大的列C上单独加了一个索引,再执行时速度有明显提升,从一个小时回到了10多分钟。
总结两点:
1.Oracel不同版本的优化器智商有差距。
2.我们还是要尊重一般经验,在有只有主键聚集索引时, 至少把第一列作为的where里的条件。
3.由于10g以后已经变聪明了,所以第二点无效,还是可以随便写写。
分享到:
相关推荐
第一次解析SQL之后, ORACLE将SQL语句存放在共享池中. ORACLE只对简单的表提供高速缓冲(cache buffering)这个功能并不适用于多表连接查询. 在数据高速缓冲区中存放着Oracle系统最近使用过的数据块(即用户的高速...
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个...
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个...
第2章 风驰电掣——有效缩短SQL优化过程 24 2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优...
另外《Oracle优化日记:一个金牌DBA的故事》第一次详尽地披露了Oracle数据库内部存储结构,并公布了部分代码,对于有兴趣研究数据库内部存储结构或者编写dul工具的读者有一定的参考价值。《Oracle优化日记:一个金牌...
ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. b. 通过ROWID访问表 你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)...
梁敬彬,福富研究院副理事长、公司四星级内训师。...著有多本畅销数据库技术书籍,其代表作《收获,不止Oracle》已成为数据库领域有口皆碑的经典书籍,《收获,不止SQL优化》即将开创一个新的里程碑。
, 然而,SQL虽然实现简单可乐,却极易引发性能问题,那时广大SQL使用人员可要“愁”就一个字,心碎无数次了。, 缘何有性能问题?原因也一字概括:“量”。当系统数据量、并发访问量上去后,不良SQL就会拖跨整个系统...
随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题,...
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你...
常用的oracle优化,全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.
作为一个Oracle专业人员,你应该知道在SQL语句第一次进入库缓存时可能存在重大的启动延迟。但是聪明的Oracle DBA和开发人员能够改变表的搜索限制参数或者使用ordered提示来手工指定表的连接顺序,从而显著地减少优化...
10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 ...
资源名称:收获,不止SQL优化--抓住SQL的本质作者简介:梁敬彬,福富研究院副理事长、公司唯一四星级内训师。不仅是公司特级专家也是国内一线知名数据库专家,其个人及团队在数据库优化和培训领域有着丰富的经验、...
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你...
以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则...
盖国强 的一次案例分析 是一次SQL优化分析的全过程,曾经在itpub上发过相关的帖子,现在整理了一下,添加了详细的说明,希望对大家有些帮助。
├─第一篇 DBA工作手记 │ 01.Eygle的DBA工作手记 │ 02.Yangtingkun的DBA工作手记 │ 03.老熊的DBA手记 │ 04.BanPing的DBA工作手记 │ ├─第二篇 诊断案例篇 │ 01.ASM案例分析与诊断 ...一次排序的调整与优化