`
骑猪逛街666
  • 浏览: 144196 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

深入Oracle优化器:一条诡异执行计划的解决之道

阅读更多
阅读原文请点击:http://click.aliyun.com/m/22905/
摘要: CBO计算成本并选择最佳执行计划的至关重要输入物就是表和索引的统计信息,过旧或错误的统计信息则可能导致一个性能极差的执行计划被错误地选中。本文将以一个案例展示诡异的统计信息如何影响执行计划的生成。 1案例介绍    这是一个简单的sql,近两个月来对于告警明细表(分区)做月度汇总查询时,总是出现了异常缓慢的情况。

CBO计算成本并选择最佳执行计划的至关重要输入物就是表和索引的统计信息,过旧或错误的统计信息则可能导致一个性能极差的执行计划被错误地选中。本文将以一个案例展示诡异的统计信息如何影响执行计划的生成。



1案例介绍



这是一个简单的sql,近两个月来对于告警明细表(分区)做月度汇总查询时,总是出现了异常缓慢的情况。



测试SQL:



20160505101224330.png



字段NEALARM_TIME是固定条件,字段RELATED_EMS_CUID是不固定的(这些不固定条件的选择性都不强),分区裁剪到的分区有着1~3月份的数据。



关于HISTORY_ALARM表, 存放20150301至今的数据,每天大约150w数据,有按1天1分区、1个月1分区,第41个分区比较特殊,这是一个有着2016年1月~3月份数据的分区;相信各位了解到这个sql的数据分区情况,第一联系到的访问路径就是分区全表扫描或访问复合索引,毕竟访问的数据占据着1/3个分区的数据。



下面是执行计划:



20160505101234374.png



该表最新收集了表和索引的统计信息,采样比为auto,没有收集直方图,请看执行计划可以注意到其中一些奇怪的细节:

1.索引HIS_ALARM_INDEX1预估基数比父节点回表的基数还小,而且小很多;

2.索引HIS_ALARM_INDEX1是一个复合索引(NEALARM_TIME,NEEND_TIME),访问的字段只是日期(NEALARM_TIME)



正常情况下,索引选择率>=单表选择率,通过rowid回表后filter所返回的行数要小于索引扫描返回的行数;而如果访问索引只是单纯靠日期(NEALARM_TIME)过滤数据,还要再回表,对于1/3分区数据多达1500w行,其成本代价是远高于分区全表扫描的,这也难怪查询如此缓慢。



从执行计划上可以看到问题入手点:即id 3的索引预估返回值远小于id 4单表预估返回值,这是不合理的;再者即便要访问索引,为什么选择了复合索引,而不是前导列同样为NEALARM_TIME的单字段索引?



210053看问题



为了弄清楚上一步分析后的疑问,我们收集10053 trace帮助解析CBO是如何根据统计信息选择执行计划。



1. 首先计算单表基数



20160505101250771.png




分区裁剪为Part#:40,统计信息来自分区统计信息



单表选择率,没有直方图:



选择率


阅读原文请点击:http://click.aliyun.com/m/22905/
分享到:
评论

相关推荐

    Oracle优化器及执行计划.pdf

    ### Oracle优化器及执行计划详解 #### 一、性能调整概览 Oracle 数据库作为一款高性能的数据库管理系统,其性能优化对于确保系统高效稳定运行至关重要。性能调整涉及到多个层面,包括但不限于应用程序设计、数据库...

    Oracle优化日记:一个金牌DBA的故事(第一、二部)

    《Oracle优化日记》是两本深入探讨Oracle数据库性能优化的专业书籍,由金牌DBA撰写,旨在分享其在实际工作中的经验和技巧。Oracle优化是数据库管理中的核心任务,它关乎系统的响应速度、资源利用率以及整体性能。这...

    通过分析SQL语句的执行计划优化SQL

    本文档主要介绍了与SQL调整有关的内容,涉及多个方面:SQL语句执行的过程、ORACLE优化器、表之间的关联、如何得到SQL执行计划、如何分析执行计划等内容。通过从浅入深的方式了解SQL优化的过程,使大家逐步步入SQL...

    Oracle优化日记:一个金牌DBA的故事.pdf 高清pdf下载.rar 下载

    《Oracle优化日记:一个金牌DBA的故事》这本书深入探讨了Oracle数据库的性能优化技术,是DBA们不可或缺的参考资料。作者通过自身丰富的实战经验,分享了一系列解决实际问题的方法和策略,帮助读者理解Oracle数据库的...

    Oracle优化器介绍

    Oracle 优化器是 Oracle 数据库中的一种核心组件,负责生成执行计划,以提高 SQL 语句的执行效率。 Oracle 优化器可以分为两大类:基于规则的优化器(RBO)和基于成本的优化器(CBO)。 基于规则的优化器(RBO) ...

    关于Oracle中执行计划稳定性深入研究

    在Oracle数据库系统中,执行计划是数据库为了执行SQL查询而制定的一种操作策略,它详细描述了数据如何被访问、如何排序、如何过滤等一系列步骤。执行计划的稳定性涉及到查询性能的可预测性和一致性,这对于数据库...

    oracle 执行计划 详解

    为了更好地理解和优化 Oracle 数据库的执行计划,我们需要了解执行计划的生成过程、优化方法和执行计划的解读方法。 执行计划生成过程 执行计划的生成过程可以分为四个步骤: 1. 解析:判断对象是否存在,是否有...

    ORACLE数据库查看执行计划的方法

    执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。1:在PL/SQL下按F5查看执行计划。第三方工具toad等。很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面...

    oracle执行计划解读

    执行计划是 Oracle 优化器生成的,用于指导查询执行的过程。 二、如何访问数据 在物理层面上,Oracle 读取数据块,读取的最小单位是一个 Oracle 块,最大的单位受操作系统限制(多块 I/O)。在逻辑层面上,Oracle ...

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1/2

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1

    Oracle DBA手记:数据库诊断案例与性能优化实践

    * SQL 优化:包括 SQL 语句优化、SQL 语句重写、SQL 语句优化器 Hint 等。 * 存储优化:包括存储空间管理、存储配置优化、存储分区优化等。 * Connection 池优化:包括 Connection 池配置优化、Connection 池监控等...

    oracle优化-绑定执行计划coe脚本

    oracle优化-绑定执行计划coe脚本 。。。。

    Oracle+SQL性能优化40条.docx

    * 选择优化器:选择最优的执行计划 * 选择连接方式:选择最优的连接方式 * 选择连接顺序:选择最优的连接顺序 * 选择数据的搜索路径:选择最优的数据搜索路径 * 运行“执行计划”:执行生成的执行计划 二、选择适合...

    深入浅出Oracle: DBA入门、进阶与诊断案例.pdf

    《深入浅出Oracle:DBA入门、进阶与诊断案例》是一本专为数据库管理员(DBA)设计的Oracle技术指南。这本书详细介绍了Oracle数据库管理的基础知识,中级技能以及高级故障诊断技巧,旨在帮助读者从新手到专家逐步提升...

    Oracle优化器案例与原理分析(盖国强)

    Oracle优化器是Oracle数据库中一个重要的组件,负责在数据库执行SQL查询时,选择最有效的执行计划。理解Oracle优化器的工作原理和案例对于数据库管理员来说至关重要,可以帮助他们调整和优化SQL执行,从而提高数据库...

    Oracle优化器介绍(精简完善版).doc

    ### Oracle优化器深入解析 #### Oracle优化器概览 Oracle数据库优化器负责分析SQL语句并确定执行查询的最有效方式。它通过考虑多种因素,包括表和索引的统计数据,来选择最佳的执行计划。Oracle优化器经历了从基于...

Global site tag (gtag.js) - Google Analytics