SQL性能优化

客户反映访问历史数据的一条语句跑了1个多小时没有出结果,应该是跑不出来了,要求想办法让语句可以出结果。

01

分析语句


看着熟悉的hint

不就是去年八月提供优化建议的语句

怎么又出性能问题

得出结论

02

根据OEM显示的执行计划,走的是nested loop,因为历史数据量很大,这样跑不出结果算正常,这个分区表的一个老问题,当新分区插入数据,统计信息没有更新,导致优化器认为分区无记录,因而选择索引和基于小结果集的nested-loop连接方式,而这样的执行计划在实际的数据量下极其低效。

03

寻找解决办法

解决的方法不少,如:插入数据后马上更新统计信息、利用dbms_stats的copy功能从旧分区复制统计信息(同时需要锁定统计信息,以免被自动任务刷洗)、预插入垃圾数据等,以及在语句中加hint定制执行计划。

奇怪的是之前的hint并没有生效,很可能之前添加hint的同时,客户也收集了统计信息,执行计划改善了,误认为是Hint在起作用。

研究了下,觉得可能是f2位于子查询中,而use_hash(f2)作用范围默认是当前的query block,按下面方式做了修改:


显式指定了query block之后,执行计划按照我们要求的hash join来连接,因为客户又已经收集了统计信息,不放心,把谓词中的分区键值日期改成4月份,确认还是走hash join,这样就没有问题了!

作者–慕容荃

银信科技AIX/Oracle/TSM/Informix方面的资深技术专家。年少轻狂时致力于成为走过的每一个领域的专家;随着岁月老去,更看重在分享中寻获的快乐,从早年的aixchina.com到现在的银信微讲堂,一直在路上。工作之余,喜欢打牌,看电影,看科幻小说,也不排斥跑步打球出一身汗。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
免责声明: IT学馆所发布的一切资源及文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。admin@itxueguan.com
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论