恒生技术之眼 作者 林景忠

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

今天从数据库性能的角度,浅谈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. JPEG 图

    多媒体教程 - JPEG 图 JPEG 是在 Web 上使用的主要图像格式之一. 本文讲解 JPEG 图像的概念和特性. 理解图像格式 无论是 HTML 还是 XHTML 都没有规定图像的官方格式.然 ...

  2. jquery”ScriptResourceMapping

    要“jquery”ScriptResourceMapping.请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping.”的解决办法. 1.先将aspnet.scri ...

  3. 【转载】介绍“Razor”— ASP.NET的一个新视图引擎

    最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...

  4. 线性回顾-generalize issue

    Ein的平均,Eout的平均 用这个平均来justify linear regresssion能够用的很好 noise level 资料里有多少的杂讯 等一下要证明的事情 predictions + ...

  5. 由C到C++的学习 ----Essential C++

    一.array[] 与 vector<int> vector1 1 array[] <- 此中要填写数组的大小,而且array[]自己是不知道自己的大小的 2.1 vector< ...

  6. C++单元测试2

    这里再对上一篇<C++单元测试>进行技巧补充. 我们知道对动态链接库(lib和dll)的测试是比较简单的,我这里主要对需要注意的地方说明一下. 1.建议单独创建单元测试解决方案(不是创建项 ...

  7. php文件锁(转)

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  8. Memcached认知[分布式]

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. Memcached的服务器客户端通信使用简单的基于文本行的协议. Memcached基于一个存储键/值对的 ...

  9. Eclipse Git和sourceTree用法

    Eclipse Git和sourceTree用法 Eclipse Git: 提交代码到git: 1.team->Repository->pull 若没有冲突: 2.team->com ...

  10. jQuery提供的小方法

    jQuery提供的小方法: 1.选择器 + 事件 + 函数 = 复杂的交互 2.循环处理与选择器匹配的各个元素:each() $("#").each(function(){     ...