“月底难过”- 都是统计信息惹的祸

作者简介

案例说明

某大型电商公司数据仓库系统经常出现在月底运行缓慢的情况,但在平时系统运行却非常正常。这是因为月底往往有月报等大批量作业运行,而就在这个时间点上,常常会出现缓慢情况,因此业务人员一到月底就非常紧张。这也成了一个老大难问题,困扰了很长时间。

DBA介入处理,发现一个很奇怪的现象:某条主要SQL是造成执行缓慢的主因,其执行计划是不确定的,也就是说因为执行计划的改变,导致其运行效率不同。而往往较差的执行计划发生在月底几天,且由于月底大批作业的影响,整体性能比较饱和,更突显了这个问题。针对某个出现问题的时间段,做了进一步分析,结果表明是由于统计信息的缺失导致了优化器产生了较差的执行计划,并据此指定了人工策略,彻底解决了这个问题。

1、问题分析

执行计划如下:

执行计划中,多表关联并用了嵌套循环,这点对于OLAP系统来说是比较少见的。一般优化器更倾向于使用SM和HJ。进一步检查发现其成本竟然是0,怪不得优化器使用了嵌套循环。

2、深入分析

检查发现索引数据统计信息异常,这是分区索引,仅两天的分区统计信息都是0。导致优化器认为嵌套循环的执行效率更高,而不是使用哈希连接。结合业务发现,月底是业务高峰期,对于系统统计信息的作业收集,在指定的时间窗口内无法完成。最后导致统计信息不完整,优化器采用了错误的执行计划。

3、解决方案

解决的代码如下

分析完对象的统计信息即恢复正常。

案例启示

统计信息是优化器优化的重要参考依据,一个完整、准确的统计信息是必要条件。往往在优化过程中,第一步就是查看相关对象的统计信息。

分区机制是Oracle针对大数据的重要解决手段,但其也很容易造成所谓“放大效应”。即对于普通表而言,统计信息更新不及时可能不会导致执行计划偏差过大;但对于分区表、索引来说,很容易出现因更新不及时出现0的情况,进而导致执行计划产生严重偏差。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Windows SharePoint Services 3.0 Service Pack 1

微软于2008年3月6日发布了Windows SharePoint Services 3.0 Service Pack 1,Windows SharePoint...

1929
来自专栏向治洪

Android 绿色应用公约

Android 绿色应用公约(草案) 宗旨 这是一项旨在推动Android生态中的优秀应用共同维护一个更加良性的『设备体验』而发起的开放公约。 设备体验:影响效...

3026
来自专栏Debian社区

Linux:为什么那么多人讨厌 Systemd

Systemd在Linux社区引起了无限争议。一些Linux用户对systemd的反对绝不屈从,还有一些Linux用户对systemd喜爱有加,还有很多人满不在...

1282
来自专栏程序人生

[技术产品] 用node-webkit做桌面应用

node-webkit是两周前我才刚刚认识的桌面开发利器。那天程序君写了篇关于github atom的文章,中间有段文字做了大胆的猜测:「这就是Atom最大的亮...

4699
来自专栏Spark学习技巧

spark源码导读一

1,业务需求,现有框架满足不了项目需要,需要对源码的一部分进行修改或者叫做二次开发,需要阅读部分源码。那么这个针对性就很强了,修改不符合需求的部分。

1361
来自专栏知晓程序

小程序微信认证太麻烦?那是你没看这篇文章 | 小程序接入指南

3114
来自专栏腾讯云数据库(TencentDB)

如何利用MongoDB打造TOP榜小程序

大家好,我叫李晓慧,我没有一页PPT介绍自己,我就自己简单说一下,我以前是一个开发,我感觉很孤独,因为开发的女生很少,我转过两次组,然后一开始做C++开发,后来...

3646
来自专栏FreeBuf

挖洞经验 | 看我如何发现Google的第三方应用服务漏洞

今年三月我参与了谷歌软件工程师的面试,没想到完全出于意外,我却发现了谷歌(Google)某个应用服务的漏洞,其也成为了我的第一个赏金漏洞。一切请听我细细道来。 ...

2347
来自专栏一名叫大蕉的程序员

一场关于逻辑应该写在哪里的争论No.93

先说结论,我支持将逻辑写在 Java 等应用系统中。 观察了一下,传统企业以及绝大部分转型中的企业的 Java 应用中,很神奇的是,他们的开发人员包括我自己以...

5488
来自专栏Golang语言社区

Golang语言-写一个检测 tcp udp 状态的包

因为要跟着 dockerpool 的基友写 Docker 管理的程序,所以今年的目标是学习 go 语言。 看完 go 的入门教程,高深的代码还看不懂,所以决定先...

3845

扫码关注云+社区

领取腾讯云代金券