给PLSQL插上飞翔的翅膀-PLSQL优化

时间:2022-09-26 18:20:40

60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的SQL语句!

以此一文来总结笔者近10多年来的工作经验并基于最基本的也是最有效的对于Oracle数据库中的RBO、CBO、索引、WHERE条件进行讲解同时配以大量案例来帮助读者从此文中学到的相关的理论知识快速的运用到其正在从事的生产环境中的优化过程中去。

优化的理论基础

给PLSQL插上飞翔的翅膀-PLSQL优化

通过Select Count(?)进入优化之旅

不看百度或者GOOGLE说出下面3者的区别?

SELECT COUNT (*)

SELECT COUNT(1)

SELECT COUNT(字段名)

SELECT Count(?)的知识

给PLSQL插上飞翔的翅膀-PLSQL优化

ORACLE的优化器

要说PLSQL优化,我们先需要来好好说一下Oracle优化器的知识:

给PLSQL插上飞翔的翅膀-PLSQL优化

优化器的优化模式

给PLSQL插上飞翔的翅膀-PLSQL优化

CBO模式

给PLSQL插上飞翔的翅膀-PLSQL优化

RBO模式

给PLSQL插上飞翔的翅膀-PLSQL优化

一起来看看oracle优化器的发展历程

给PLSQL插上飞翔的翅膀-PLSQL优化

所以,我们知道ORACLE10后开始默认使用CBO,在CBO时ORACLE会自动来选择最优的执行计划,有时我们会认为:这个应该走索引更好啊,但是对于CBO来说,一个FULL TABLE ACCESS反而比索引更有效。

因此,在CBO的模式下,我们需要做的就是:

  1. 做好数据库信息的相关统计
  2. 合理建设我们的索引
  3. 优化我们的SQL

让我们从索引的基本知识下手吧

索引是不需要修改SQL最直接带来性能提升的利器,何时该建索引,怎么建?怎么样让你的索引更合理?

索引按内部结构分类

给PLSQL插上飞翔的翅膀-PLSQL优化

索引按功能分类

给PLSQL插上飞翔的翅膀-PLSQL优化

索引按索引对象分类

给PLSQL插上飞翔的翅膀-PLSQL优化

建立索引的方法论

上面介绍了这么多索引的分类,下面来讲讲建立索引的方法论吧,大家可能较关心这个,因为这个是经验总结也是实战有用的利器哈。

给PLSQL插上飞翔的翅膀-PLSQL优化

给PLSQL插上飞翔的翅膀-PLSQL优化

不建议建立索引的情况

索引很神奇,可是索引不是万能,有时你建了索引也等于没用或者是白建、作无用功,为什么呢?我们看下去。

给PLSQL插上飞翔的翅膀-PLSQL优化

给PLSQL插上飞翔的翅膀-PLSQL优化

索引不会生效的情况

所以索引不要乱建,有时建了也是白建,为什么呢?来看看下面的案例分析吧:

给PLSQL插上飞翔的翅膀-PLSQL优化

以案例来说明

PLSQL优化>一个不走索引的优化案例

给PLSQL插上飞翔的翅膀-PLSQL优化

这个例子说明了,如果你有一字参于WHERE条件查询的字段,但是它参于了运算符,因此它在ORACLE的内部执行计划中是不会走索引的,因此我们做了一个小小的变化,效率提升了多少倍?5.3倍,530%,呵呵!

以上例我们可以为建立索引作一个总结。

建立索引的总结

给PLSQL插上飞翔的翅膀-PLSQL优化

Table Analyze

给PLSQL插上飞翔的翅膀-PLSQL优化

Analyze Table VS DBMS_STATS

给PLSQL插上飞翔的翅膀-PLSQL优化

Import & Export

说到Import & Export命令,大家会说。。。哎,这个不是很简单,就是:imp username/pwd@oraid file=path 吗?嘿嘿。。。试想:

  1. 你需要导入一个8GB左右的.dmp文件进入数据库
  2. 你需要将一个库,其中含有至少30张表并且每张表都超过1200万条记录的数据进入一个.dmp文件
然后你去试试看这个耗时。

Import的常规做法

这是一个真实的案例,我们在CCC即世界著名车险公司项目中,我们定期会和CCC芝加哥总部同步一个8GB左右的.dmp文件进入我们的数据库,由于安全原因因此需要依靠.dmp交换文件的形式于零晨同步至中国的数据库,并且在T+1第二天早晨的8:00前完成同步。
于是,我们的DBA开始来了。。。。。。
给PLSQL插上飞翔的翅膀-PLSQL优化
从零晨到第二天早上8:00,硬是没有导完,一查,数据库中session已经超时了,连续2天还是这样。
于是,我们把原有的语句稍稍作了一下变化:
只是把原来的一句imp折成了2条:
  • 第一条,只导数据,不导索引,并且设置成10000条数据一次commit,同时设置了一个缓冲池
  • 第二条,只导索引,不导数据,并且设置成10000条数据一次commit,同时设置了一个缓冲池
结果让人惊叹。。。发觉最后只用了40分钟不到,两条语句全部执行完毕,完成了导入。。。其实这个原因我可以用下面2个例子来说明:
  1. 一个含有8GB文件内容的目录,用FTP客户端下载,你会发觉似乎永远等不到头,几小时就这样耗着,然后你改成先把这个目录打成一个压缩包,然后再用FTP客户端 下载,几十分钟就能搞定。
  2. 你用JDBC写一个FOR循环插入100万条记录。。。结果是ORACLE直接爆掉,而你采用批量提交。。。结果是惊人的!
其实我们当时所做的折分,原理如同上述两个案例,是一样的道理,减少IO读写,设置缓冲,批量提交。如果你的事务太大。。。。。。
给PLSQL插上飞翔的翅膀-PLSQL优化

以案例来说明PLSQL的优化

PLSQL优化-SELECT IN 与SELECT EXISTS

给PLSQL插上飞翔的翅膀-PLSQL优化
这边提高了多少?光看IO就知道提高了多少了,呵 呵,很好玩吧?再来!

PLSQL优化-SELECT IN的几种优化

给PLSQL插上飞翔的翅膀-PLSQL优化

PLSQL优化-SELECT IN、OR、UNION的互转

给PLSQL插上飞翔的翅膀-PLSQL优化
看看3次修改,最后一次,提升了多少倍?11.2850-0.0261再除以0.0261=431.375,431.375倍。。。。。。一条SQL啊。。。在寸土寸金的互联网应用中,单条SQL提高了431.375倍。。。这是什么概念!!!
你好讨厌!!!再来!!!

PLSQL优化-分页语句中加入索引的优化

以下是一条分页语句,我们对created_date做一个索引,等。。。。。。等等等,这边的索引不是一般的索引,我们把图形化工具建的索引翻译成SQL:
create index IDX_WAREHOUSE_CT on T_WAREHOUSE(CREATED_DATE DESC);
我们这个表是一个含有1000万条记录的表,仅此一招,整个SQL查询提高了300%-340%
给PLSQL插上飞翔的翅膀-PLSQL优化

PLSQL优化-INNER JOIN VS WHERE

给PLSQL插上飞翔的翅膀-PLSQL优化

PLSQL优化-WHERE语句优化要点

注意下面这个例子,只是WHERE条件后的顺序上下颠倒一下,就提高了10倍的效率,呵呵。
给PLSQL插上飞翔的翅膀-PLSQL优化

WHERE语句中选择最有效的表名顺序

给PLSQL插上飞翔的翅膀-PLSQL优化
好玩吧!!!再来!!!
给PLSQL插上飞翔的翅膀-PLSQL优化
PLSQL优化-用UNION取代OR
看看下面这个例子吧:
给PLSQL插上飞翔的翅膀-PLSQL优化
是不是写SQL时稍微注意一下。。。这个效率。。。这个性能 。。。123%。。。123%的提高啊。

PLSQL优化>共享SQL

前面我们用好几个实例说了一下PLSQL中最基本的一些性能上可以带来的提升,这边我们需要提一下ORACLE自带的一个缓冲SQL结果集命中率的工具
给PLSQL插上飞翔的翅膀-PLSQL优化
所以,我们在写SQL时要用JAVA的PreparedStatement,要用:1这样的东西来做传值,因为ORACLE是自带SQL缓冲池的,另外在此要多说一句的是,虽然ORACLE10后开始带有ASM(自动内存管理),但有时ASM不是万能,对于一些大形网站,有时我们的DBA是需要手工去调整ORACLE的SGA,即:
给PLSQL插上飞翔的翅膀-PLSQL优化
因此,这对我们的ORACLE DBA来说提出了更高的要求。
PLSQL优化的基础掌握了上述几点,基本可以让你的系统性能提高2位数-3位数,后续感兴趣的读者还可以继续去看:
给PLSQL插上飞翔的翅膀-PLSQL优化

如何自学

对于ORACLE的PLSQL相关调优该如何自学呢?
给PLSQL插上飞翔的翅膀-PLSQL优化
是不是很自虐哈。。。
那我们就用著名的Opensource界的一句铭言:play by yourself, play with it。
用中文来说那就是:自虐着并快活着
要成为“东方不败。。。”-- 苍海。。。笑。。。涛涛两岸潮。。。呵呵。
给PLSQL插上飞翔的翅膀-PLSQL优化
笔者联系方式:
QQ:42948648
微信:
给PLSQL插上飞翔的翅膀-PLSQL优化

给PLSQL插上飞翔的翅膀-PLSQL优化的更多相关文章

  1. 时序数据库(TSDB)-为万物互联插上一双翅膀

    本文由  网易云发布. 时序数据库(TSDB)是一种特定类型的数据库,主要用来存储时序数据.随着5G技术的不断成熟,物联网技术将会使得万物互联.物联网时代之前只有手机.电脑可以联网,以后所有设备都会联 ...

  2. 让Storm插上CEP的翅膀 - Siddhi调研和集成

    什么是 Siddhi? Siddhi 是一种 lightweight, easy-to-use, open source CEP(Complex Event Processing)引擎,由wso2公司 ...

  3. 插上腾飞的翅膀:为asp.net core添加protobuf支持

    没时间解释了,快上车. 通过NuGet获取Zaabee.AspNetCoreProtobuf Install-Package Zaabee.AspNetCoreProtobuf 在Startup.cs ...

  4. 让MEF插上AOP的翅膀

    什么是MEF Git:https://github.com/MicrosoftArchive/mef MEF也是一款ioc框架,貌似历史比较悠久了. 这里有一篇.net阵容里面主流ioc比较. htt ...

  5. 为Spring Cloud Config插上管理的翅膀

    最近一致在更新Spring Cloud Config的相关内容,主要也是为这篇埋个伏笔,相信不少调研过Spring Cloud Config的用户都会吐槽它的管理能力太弱.因此,就有了下面为讲推荐的这 ...

  6. 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)

    最近新安装了64位的Win7系统,工作中需要用oracle数据库,而数据库是公司IT的DBA进行管理和维护的. 我们只需要连接上去进行使用就可以了,于是我就在自己的机器上安装了oracle clien ...

  7. 插上翅膀,让Excel飞起来——xlwings(二)

    在上一篇插上翅膀,让Excel飞起来——xlwings(一)中提到利用xlwings模块,用python操作Excel有如下的优点: xlwings能够非常方便的读写Excel文件中的数据,并且能够进 ...

  8. Spring Boot (六): 为 JPA 插上翅膀的 QueryDSL

    在前面的文章中,我们介绍了 JPA 的基础使用方式,<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari>,本篇文章,我们由入门至进阶的介绍一下为 JPA 插上 ...

  9. plsql连接oralce数据的配置 PLSQL配置怎么连ORACLE plsql连接多个数据库设置 Oracle 服务命名&lpar;别名&rpar;的配置及原理,plsql连接用

    Oracle 服务命名(别名)的配置及原理,plsql连接用 Oracle 服务命名(别名)的配置及原理 连接数据库必须配置服务命名(别名,用于plsql的连接),不管是本地还是远程,服务命名即简单命 ...

随机推荐

  1. 网站通用登录模块代码 分类: ASP&period;NET 2014-12-06 10&colon;49 615人阅读 评论&lpar;0&rpar; 收藏

    1.HTML部分:     <form id="form1" runat="server">     <script src=".. ...

  2. sass安装 使用

    一 什么是sass      sass是一种css开发工具.提供了很多便利的写法,使得css开发变得简单  易维护       sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一 ...

  3. &lbrack;原创&rsqb;cocos2d-x研习录-第一阶 背景介绍 之 cocos2d家族史

    Cocos2D是一个2D开源游戏引擎,它最早是由Ricardo Quesada(阿根廷人,社区简称Riq)和他的朋友们用Python开发的,用于开发2D游戏和基于2D图形的任何应用.最早引擎的名字源自 ...

  4. SQL2008清空删除日志&colon;

    SQL2008清空删除日志: '在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. USE [master] GO ALTER DATABASE DNName SET ...

  5. PHP学习笔记--Php预定义超全局变量&dollar;&lowbar;GET

    Php中的许多预定义变量都是超全局的,无需使用global声明 超全局变量 不需要声明就可以直接使用 提供超全局变量(数组)为了让程序员更快捷的编程 $GLOBALS— 引用全局作用域中可用的全部变量 ...

  6. I2C与EEPROM

    一.基本概念 RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的.它在任何时候都可以读写,RAM 通常是作为操作系统或其他正在运 ...

  7. kafka原理和实践(五)spring-kafka配置详解

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  8. IDEA中安装ibatis插件

    若想在IDEA中使数据库的相关配置能够快速链接即Ctrl+单击跳转,则安装插件 效果如图,跳转成功

  9. 【计蒜客】是男人就过 8 题--Pony&period;AI 题 A&period; A String Game 后缀自动机&plus;SG函数

    [题目]A. A String Game [题意]给定目标串S和n个子串Ti,Alice和Bob轮流选择一个子串操作,必须且只能在子串末尾添加一个字符使得新串也是S的子串,不能操作即输,求胜利者.|S ...

  10. Android 调用系统相机拍照保存以及调用系统相册的方法

    系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new ...