背景简介:

Oracle版本:11.2.0.4   OS 版本:OEL5.8

在一次Oracle的Dataguard正常switchover过程中,遇到了一个极其诡异的问题,一条主业务的SQL语句在新主库的执行时间由之前的毫秒级别完成变成了20-60秒不等,为避免高峰业务超时必须尽快进行优化,否则只能走回退方案。

优化过程:

其实这个语句在之前将备库切换为snapshot备库做测试时表现是非常良好的,但是切换之后立马出了问题。在备库实际执行后获取到的执行计划与在主库一模一样,如下:

获取执行计划的语句如下:(语句出自ITPUB大神版主lfree)

select *
from
table(dbms_xplan.display_cursor(NVL('&1',NULL),
NULL,
'ALL ALLSTATS LAST PEEKED_BINDS cost partition -projection -outline &2'));

这里的参数1和2全部设置为空即可,此语句可以查出当前会话中上一个执行过语句的真实执行计划。

此SQL中不涉及视图,所以这个执行计划是非常好的,在主库执行也是毫秒级别的,因此同样的执行计划在备库却非常慢就很值得思考了。

接下来我利用set autot工具得到了执行此SQL后的统计信息,发现存在大量物理读。这里就很搞笑了,真实执行计划中不存在表扫描,所以出现这么多的物理读一定是回表操作特别多,那么为什么回表?显然内存不够。

于是我将SGA加大至80GB(比主库还大20GB),重启数据库再查,问题依旧。

我依然坚信是缓存的问题,那么必须要搞清为何数据未被缓存至内存,对Oracle数据库来说大多有2个原因:

1、数据太多,内存太小。

2、不是热点数据,被LRU刷出内存。

首先排除第二条,原主库60G的SGA都可以,现在80G的SGA没理由不可以。

此外注意到一个现象,v$sgainfo中的buffer pool在接近30GB时有一个很长时间的停顿,然后才慢慢增长至接近70G(剩余部分属于sharedpool等)。

于是突然想到NUMA的问题,果然:

numactl --hardware的运行结果:

这就尴尬了,在/etc/grub.conf的kernel一行后添加了numa=off,重启服务器后果然问题被解决。

事后查看数据库日志找到了如下信息:

.

因此可以确认是操作系统未关闭NUMA特性引起的(只设置数据库禁用NUMA的隐含参数是无用的,Oracle在11GR2之后已经默认禁用NUMA,但只是数据库级别)。

关于Oracle NUMA的相关信息,参考官网文档:Oracle NUMA Usage Recommendation (文档 ID 759565.1)

名词解释:

什么是NUMA:

NUMA模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。 NUMA模式下,处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间。 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。

--OK,注意这几个字:大幅提高并行性。Oracle数据库绝大多数时候进程都是串行的,除非特意设置并行度,而SQL Server也只有超过cost阈值才会并行,因此数据库服务器应该禁用NUMA。

关于NUMA更加详细的信息参考:

https://www.ibm.com/developerworks/cn/linux/l-numa/index.html

https://technet.microsoft.com/zh-cn/library/ms178144(v=sql.105).aspx

http://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html

NUMA导致的Oracle性能问题的更多相关文章

  1. Oracle性能优化之SQL语句

    1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  2. ORACLE性能优化之SQL语句优化

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合 ...

  3. Oracle 性能相关常用脚本(SQL)

    在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考.以下脚本均在Oracle 10g测试通过,Oracle 11g可能要做相应调整 ...

  4. oracle性能优化之awr分析

    oracle性能优化之awr分析 作者:bingjava 最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录. 导致系 ...

  5. Oracle Tuning (Oracle 性能调整)的一些总结

    Oracle Tuning (Oracle 性能调整)的一些总结 Oracle Tuning (Oracle 性能调整)的一些总结关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库 ...

  6. Oracle性能问题sql调优脚本集

    ---------------------------------------------------------------------------------------------------- ...

  7. 一次vm 虚拟机时间倒流而导致的oracle 数据库启动故障

    一次vm 虚拟机时间倒流而导致的oracle 数据库启动故障 本文是原创文章.若转载请注明出处: http://blog.csdn.net/msdnchina/article/details/3878 ...

  8. Oracle性能分析12:对象统计信息

    对象统计信息描写叙述数据是如何在数据库中存储的,查询优化器使用这些统计信息来做出正确的决定.Oracle中有三种类型的对象统计信息:表统计.列统计和索引统计.而在每种类型中,有细分为:表或索引级别的统 ...

  9. Oracle性能图表工具:awrcrt.sql 介绍,更新到了2.14 (2018年3月31日更新)

    2018-03-31 awrcrt更新到了2.14版本, 下载地址为 https://pan.baidu.com/s/1IlYVrBJuZWwOljomVfta5g https://pan.baidu ...

随机推荐

  1. Long类型时间如何转换成视频时长?

    数据库中存放的视频时长是一个Long类型的毫秒/秒时间,现在需要把这个时间转换成标准的视频时长格式,在我看来这应该是一个很常用的转化有一个很常用的转换方法工具才对,可是我百度找了许久,没有一个简单直观 ...

  2. ES6躬行记(4)——模板字面量

    模板字面量(Template Literal)是一种能够嵌入表达式的格式化字符串,有别于普通字符串,它使用反引号(`)包裹字符序列,而不是双引号或单引号.模板字面量包含特定形式的占位符(${expre ...

  3. Go语言如何判断一个chan被关闭

    当一个chanel被关闭后,再取出不会阻塞,而是返回零值 package main import "fmt" func main() { c := make(chan int, 5 ...

  4. 了解golang的可变参数(... parameters),这一篇就够了

    在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...

  5. iOS 快速排序

    一.快速排序概念及其思想 快速排序(QuickSort),又称为交换排序,是分治算法的一种,快速排序采用分治的策略. 1.分治法的基本思想: 将原问题分解为若干个规模更小但结构和原问题相似的子问题.递 ...

  6. 设置TabWidget的样式的方法、关联Fragment与tabwidget的方法、点击tab显示相应Fragment方法

    private void updateTabHost(TabHost tabHost) { int count = tabHost.getTabWidget().getChildCount(); ; ...

  7. 图解vs2015生成JSON实例

    在开发的过程中那个会使用到JSON数据,在使用的时候需要将它反序列化进行使用 如果说JSON存在很多实例情况手动敲肯定显得很繁琐而且很容易出错,VS提供了粘贴JSON类的方法. 这是我的JSON文件 ...

  8. 使用wubi安装ubuntu14.04出现的常见错误的解决办法

    花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot download the metalink and therefore the ISO”错误,解决后,又报“ ...

  9. SQL 語法

    查詢 Sql = ("SELECT A1, A2, A5, A4 FROM Table1 ") 筆數 Sql = ("Select COUNT(*) From TW01. ...

  10. 【软工神话】第四篇(Alpha冲刺)

    前言:咳咳,一个多月了,最近忙这忙那,都把这个故事给落下了,昨晚刚回到家,白天得干活,晚上赶紧把这个故事写完,以此纪念自己的软工. 说明:故事中的人物均是化名,故事情节经过些许加工,故事情节并没有针对 ...