前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统迁移导致SQL性能下降,神马原因?

系统迁移导致SQL性能下降,神马原因?

作者头像
老虎刘
发布2022-06-22 17:37:45
4980
发布2022-06-22 17:37:45
举报
文章被收录于专栏:老虎刘谈oracle性能优化

今天病休,还好有存货。

宝岛某客户,系统迁移后(主机迁移,数据库版本相同,都是11.2.0.3),某个SQL性能严重下降,执行时间由原系统的的0.001秒,变成了131秒多,严重影响了业务的正常使用:

(注:其中#1执行计划是在使用了sql profile固定后生成的,新系统开始只有一个#2的执行计划)

SQL代码如下:

SELECT *

FROM MB_PN_MESSAGE

WHERE (UDID = : 1 OR CUST_ID = : 2) AND

(MB_PN_MESSAGE.APP IS NULL OR MB_PN_MESSAGE.APP = 'MB')

AND MESSAGE_DATE <= SYSDATE

ORDER BY MESSAGE_DATE DESC ,MESSAGE_NUMBER DESC;

迁移后新系统的执行计划为:

根据谓词条件,使用message_date字段上的索引明显是非常差的选择。

原系统的执行计划是:

原系统SQL执行计划使用了选择性好的UDID和CUST_ID两个字段上独立索引,做Bitmap OR操作,这个计划才是最优的。

发现这个区别后,我们马上使用coe_xfr_sql_profile.sql脚本,将原系统的执行计划导出(生成sql脚本),然后在新的系统上执行该SQL,这样就通过sql profile,将新系统的执行计划与原系统保持了一致。快速恢复系统运行正常后,接下来我们就可以从容地对这个问题的原因进行分析了。

因为MESSAGE_DATE字段创建的索引为降序索引,DDL如下:

CREATE INDEX "INHBMGR"."MB_PN_MESSAGE_MESSAGE_DATE" ON "INHBMGR"."MB_PN_MESSAGE" ("MESSAGE_DATE" DESC)

我们团队的资深专家很快就把问题怀疑到bug上,经过一番努力搜索,发现一个疑似的bug:

Bug 11072246 : NON OPTIMAL INDEX IS USED WHEN INDEX COLUMN IS IN DESC ORDER

Bug 11072246 - Wrong Cardinality estimations for columns with DESC indexes (Doc ID 11072246.8)

bug的描述与现场的情况基本一致, 但是,大家心中又有一个疑问,既然是bug,为什么在原系统上没有触发?而再看bug的修复情况,在11.2.0.3版本的某个patch set已经得到修复,难道说两个系统的patch set不一致?

这个时候,我做了一个test case,在11.2.0.3 (没有任何patch)和12.1.0.1上分别执行SQL,对比执行计划后,基本可以确定为bug:

在客户现场仔细对比原系统和新系统的patch信息后,确实是新系统的patch比原系统要少,而缺少的patch恰恰就导致了SQL触发了bug。我们在测试环境也证明了这一点:11.2.0.3.7打11072246 patch前后的对比与现场情况完全一致。

总结:

系统迁移,不光数据库的大版本要相同,patch也要保持一致。

coe_xfr_sql_profile.sql脚本最适合在这种情况下使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档