恒生技术之眼 作者 林景忠

大家对于一个业务系统的运行关心有如下几个方面:功能性、稳定性、效率、安全性。而一个系统的性能有包含了网络性能、应用性能、中间件性能、数据库性能等等。

今天从数据库性能的角度,浅谈Oracle性能优化的一些看法。

首先对于性能问题,大家先接触的一般都是某个业务功能慢,速度客户无法接受。那对于系统的性能无非如下图所示:

当一个性能问题出现时,很多人都会猜测问题各个方面的原因。
今天主要谈数据库的性能问题,就问题而言,我们针对问题经过数据库性能分析,发现数据库性能存在问题,那么就需要对数据库性能问题进行优化解决。

从性能优化角度看,每个人都希望经过优化数据库系统运行的速度越快越好。但是希望终归是希望,系统优化最终能到达什么程度和数据库系统的很多方面有关系。

从优化的角度看,数据库的性能问题基本可以分为几类问题:操作系统性能问题、IO性能问题、数据库系统性能问题、SQL性能问题、网络性能问题等等。

而根据实际结果统计,数据库性能问题80%以上都是SQL性能问题引起。下面谈SQL性能问题之前,介绍一个经常遇见的一个系统配置问题:接到客户电话说“今天做交易系统的历史数据归档,做完历史数据归档后,原来历史放了3年的历史数据,现在历史表只有1年不到的数据,但是查历史的菜单比原来慢了很多,看了SQL执行计划比较,原来是走索引的,现在走的是全表扫描,该怎么处理?”

针对该问题,根据经验:
▪ 首先确认历史表是分区表
▪ 然后让客户检查数据库参数optimizer_index_cost_adj,根据标准参数配置optimizer_index_cost_adj=10,建议客户把这个参数设置成5试一下,客户根据建议改了之后,这个问题解决了。

这个问题看似SQL问题,但是通过数据库参数得到解决,说明数据库的很多问题都是互相关联和影响的。

既然数据库性能问题80%以上都是SQL性能问题引起,接下来聊聊对SQL优化的个人一些看法。

说个人看法之前,网上或者面试的时候,大部分人对SQL优化的一致解决方法都是“先从awr报告找出有性能问题的SQL(awr中top sql中耗时长的、消耗逻辑读、物理读的sql)、看sql的执行计划,看sql的执行计划的时候,关注有没有全表扫描、有没有cost很大的操作,然后尝试新建索引、调整索引、调整表的访问顺序、再执行SQL试试看。”

这个步骤其实也没有太大的问题,80%到90%的SQL问题也基本能解决,个人存在的问题是优化的效果具有不确定性。

我的看法是对于SQL优化应该可以通过优化方法,让SQL优化的效果有比较好的确定性,因为有很多的环境是不能让我们这样调整下试试看的。

我的看法是这样的,在SQL优化的时候,首先我们要像解读程序一样先解读SQL,如这个SQL的主要作用是什么,有没有特殊的操作如group by、order by、sum、分页查询等,涉及了几张表、表的数据规模怎么样,表的条件有哪些,这些条件对于表的数据的选择性怎么样。了解这些信息之后,基本也可以确定这个SQL最优的执行计划该是什么样的,再查看执行计划的时候就很容易发现执行计划的问题并知道该如何修正。如果没有了解以上信息,查看执行计划的时候会相对比较盲目。

查看执行计划的时候关注那些方面,主要有如下几点:
▪ 访问了哪些表
▪ 表的访问方式(表的访问顺序、表是索引扫描还是全表扫描、)
▪ 表的连接方式 (nest loop join、hash join、sort merge join、连接是否存在笛卡尔积)
▪ 字段条件的选择性是否合理(相关字段索引情况、索引的选择性是否合理)
▪ 排序方法(根据什么样的字段排序)
▪ 数据获取方式(返回一个结果集的大小)

确认了以上几个方面之后,经过优化之后再确认上面的执行计划信息就基本可以确认优化的效果是怎么样的。SQL优化的目的是减少SQL的系统资源的消耗,在SQL执行计划中也要关注减少表的访问次数,如A表如果在SQL中访问一次即可,不要多次访问。

有人会说,有些SQL很长,可能一个SQL里面就有20张表的访问,如果遇到这样的SQL,就需要根据SQL的结构对SQL进行拆解,然后再逐步优化,就能比较准确地进行SQL优化。
对于SQL优化,希望大家要像看算法一样去解读SQL,总结出属于自己的SQL优化方法!

我眼中的 Oracle 性能优化的更多相关文章

  1. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

  2. 降低磁盘IO使Oracle性能优化(转)

    文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...

  3. oracle性能优化之awr分析

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

  4. Oracle性能优化1-总体思路和误区

    最近在看梁敬彬老师关于Oracle性能优化的一些案例,在这里做一些简单的总结 1.COUNT(*)与COUNT(列)哪个更快 drop table t purge; create table t as ...

  5. Oracle 性能优化的基本方法

    Oracle 性能优化的基本方法概述 1)设立合理的性能优化目标. 2)测量并记录当前性能. 3)确定当前Oracle性能瓶颈(Oracle等待什么.哪些SQL语句是该等待事件的成分). 4)把等待事 ...

  6. Oracle性能优化小结

    Oracle性能优化小结 原则一.注意where子句中的连接顺序 Oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须卸载其他where条件之前,哪些可以滤掉最大数量记录的 ...

  7. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  8. 浅谈Oracle 性能优化

    基于大型Oracle数据库应用开发已有6个年头了,经历了从最初零数据演变到目前上亿级的数据存储.在这个经历中,遇到各种各样的性能问题及各种性能优化. 在这里主要给大家分享一下数据库性能优化的一些方法和 ...

  9. Oracle性能优化之查询语句通用原则

    作者早期文章 Oracle优化 索引是表的一个概念部分 , 用来提高检索数据的效率, ORACLE 使用了一个复杂的自平衡 B-tree 结构 . 通常 , 通过索引查询数据比全表扫描要快 . 当 O ...

随机推荐

  1. JavaScript上下文和闭包

    "this" 上下文 上下文通常是取决于一个函数如何被调用.当函数作为对象的方法被调用时,this 被设置为调用方法的对象: var object = { foo: functio ...

  2. 从Bash漏洞学Shell脚本(冒号)

    前天,爆发了Bash安全漏洞,非常恐怖.在网络上开始飞速传播,附带了非常友好的检测工具. $ env x='() { :;}; echo vulnerable' bash -c "echo ...

  3. html5 拖拽的简要介绍

    1,首先,你要告诉计算机那个元素可以拖动,或者是一张图,或者是一个盒子,在标签里面加上 draggable="true"  2,然后,监听该元素被拖动的函数 ondragstart ...

  4. cygwin 扩展

    1.使用setup,然后一路安装到select package,选择需要的包即可,然后一路next. 2.setup.exe -q -P 包名, 详细用法如下: Command Line Option ...

  5. js 高级函数 之示例

    js 高级函数作用域安全构造函数 function Person(name, age)    {        this.name = name;        this.age = age;     ...

  6. wordpress4.0.1源码学习和摘录--函数

    1.根据类型获取当前时间 function current_time( $type, $gmt = 0 ) { switch ( $type ) { case 'mysql': return ( $g ...

  7. PHPCMS栏目调用2

    {php $j=1;}                {loop subcat(50) $v}                {php if($v['type']!=0) continue;}     ...

  8. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  9. [BZOJ 1045] [HAOI2008] 糖果传递

    题目链接:BZOJ 1045 Attention:数据范围中 n <= 10^5 ,实际数据范围比这要大,将数组开到 10^6 就没有问题了. 我们先来看一下下面的这个问题. 若 n 个人坐成一 ...

  10. Let's go home

    hdu1824:http://acm.hdu.edu.cn/showproblem.php?pid=1824 题意:中文题. 题解:这一题建边要考虑两个限制条件,一个是队伍内部的,就是假如说 a,b, ...