给PLSQL插上飞翔的翅膀-PLSQL优化
60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的SQL语句!
以此一文来总结笔者近10多年来的工作经验并基于最基本的也是最有效的对于Oracle数据库中的RBO、CBO、索引、WHERE条件进行讲解同时配以大量案例来帮助读者从此文中学到的相关的理论知识快速的运用到其正在从事的生产环境中的优化过程中去。
优化的理论基础
通过Select Count(?)进入优化之旅
不看百度或者GOOGLE说出下面3者的区别?
SELECT COUNT (*)
SELECT COUNT(1)
SELECT COUNT(字段名)
SELECT Count(?)的知识
ORACLE的优化器
要说PLSQL优化,我们先需要来好好说一下Oracle优化器的知识:
优化器的优化模式
CBO模式
RBO模式
一起来看看oracle优化器的发展历程
所以,我们知道ORACLE10后开始默认使用CBO,在CBO时ORACLE会自动来选择最优的执行计划,有时我们会认为:这个应该走索引更好啊,但是对于CBO来说,一个FULL TABLE ACCESS反而比索引更有效。
因此,在CBO的模式下,我们需要做的就是:
- 做好数据库信息的相关统计
- 合理建设我们的索引
- 优化我们的SQL
让我们从索引的基本知识下手吧
索引按内部结构分类
索引按功能分类
索引按索引对象分类
建立索引的方法论
上面介绍了这么多索引的分类,下面来讲讲建立索引的方法论吧,大家可能较关心这个,因为这个是经验总结也是实战有用的利器哈。
不建议建立索引的情况
索引很神奇,可是索引不是万能,有时你建了索引也等于没用或者是白建、作无用功,为什么呢?我们看下去。
索引不会生效的情况
所以索引不要乱建,有时建了也是白建,为什么呢?来看看下面的案例分析吧:
以案例来说明
PLSQL优化>一个不走索引的优化案例
这个例子说明了,如果你有一字参于WHERE条件查询的字段,但是它参于了运算符,因此它在ORACLE的内部执行计划中是不会走索引的,因此我们做了一个小小的变化,效率提升了多少倍?5.3倍,530%,呵呵!
以上例我们可以为建立索引作一个总结。
建立索引的总结
Table Analyze
Analyze Table VS DBMS_STATS
Import & Export
说到Import & Export命令,大家会说。。。哎,这个不是很简单,就是:imp username/pwd@oraid file=path 吗?嘿嘿。。。试想:
- 你需要导入一个8GB左右的.dmp文件进入数据库
- 你需要将一个库,其中含有至少30张表并且每张表都超过1200万条记录的数据进入一个.dmp文件
Import的常规做法
- 第一条,只导数据,不导索引,并且设置成10000条数据一次commit,同时设置了一个缓冲池
- 第二条,只导索引,不导数据,并且设置成10000条数据一次commit,同时设置了一个缓冲池
- 一个含有8GB文件内容的目录,用FTP客户端下载,你会发觉似乎永远等不到头,几小时就这样耗着,然后你改成先把这个目录打成一个压缩包,然后再用FTP客户端 下载,几十分钟就能搞定。
- 你用JDBC写一个FOR循环插入100万条记录。。。结果是ORACLE直接爆掉,而你采用批量提交。。。结果是惊人的!
以案例来说明PLSQL的优化
PLSQL优化-SELECT IN 与SELECT EXISTS
PLSQL优化-SELECT IN的几种优化
PLSQL优化-SELECT IN、OR、UNION的互转
PLSQL优化-分页语句中加入索引的优化
create index IDX_WAREHOUSE_CT on T_WAREHOUSE(CREATED_DATE DESC);
PLSQL优化-INNER JOIN VS WHERE
PLSQL优化-WHERE语句优化要点
WHERE语句中选择最有效的表名顺序
PLSQL优化>共享SQL
如何自学
给PLSQL插上飞翔的翅膀-PLSQL优化的更多相关文章
- 时序数据库(TSDB)-为万物互联插上一双翅膀
本文由 网易云发布. 时序数据库(TSDB)是一种特定类型的数据库,主要用来存储时序数据.随着5G技术的不断成熟,物联网技术将会使得万物互联.物联网时代之前只有手机.电脑可以联网,以后所有设备都会联 ...
- 让Storm插上CEP的翅膀 - Siddhi调研和集成
什么是 Siddhi? Siddhi 是一种 lightweight, easy-to-use, open source CEP(Complex Event Processing)引擎,由wso2公司 ...
- 插上腾飞的翅膀:为asp.net core添加protobuf支持
没时间解释了,快上车. 通过NuGet获取Zaabee.AspNetCoreProtobuf Install-Package Zaabee.AspNetCoreProtobuf 在Startup.cs ...
- 让MEF插上AOP的翅膀
什么是MEF Git:https://github.com/MicrosoftArchive/mef MEF也是一款ioc框架,貌似历史比较悠久了. 这里有一篇.net阵容里面主流ioc比较. htt ...
- 为Spring Cloud Config插上管理的翅膀
最近一致在更新Spring Cloud Config的相关内容,主要也是为这篇埋个伏笔,相信不少调研过Spring Cloud Config的用户都会吐槽它的管理能力太弱.因此,就有了下面为讲推荐的这 ...
- 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)
最近新安装了64位的Win7系统,工作中需要用oracle数据库,而数据库是公司IT的DBA进行管理和维护的. 我们只需要连接上去进行使用就可以了,于是我就在自己的机器上安装了oracle clien ...
- 插上翅膀,让Excel飞起来——xlwings(二)
在上一篇插上翅膀,让Excel飞起来——xlwings(一)中提到利用xlwings模块,用python操作Excel有如下的优点: xlwings能够非常方便的读写Excel文件中的数据,并且能够进 ...
- Spring Boot (六): 为 JPA 插上翅膀的 QueryDSL
在前面的文章中,我们介绍了 JPA 的基础使用方式,<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari>,本篇文章,我们由入门至进阶的介绍一下为 JPA 插上 ...
- plsql连接oralce数据的配置 PLSQL配置怎么连ORACLE plsql连接多个数据库设置 Oracle 服务命名(别名)的配置及原理,plsql连接用
Oracle 服务命名(别名)的配置及原理,plsql连接用 Oracle 服务命名(别名)的配置及原理 连接数据库必须配置服务命名(别名,用于plsql的连接),不管是本地还是远程,服务命名即简单命 ...
随机推荐
- else语句的搭配
1.else语句搭配if 要么怎样,要么怎样 2.else语句搭配for和while 干完循环之后执行else,干不完或者break就不执行 3.else与异常处理 没有问题的话就执行else吧
- requests+正则爬取豆瓣图书
#requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...
- angularJs-route路由详解
本篇基于ng-route来讲下angular中的路由,路由功能主要是 $routeProvider服务 与 ng-view 实现. ng-view的实现原理,是根据路由的切换,动态编译html模板-- ...
- jquery楼层效果
- MySQL中的字符串函数
使用字符串数据 当使用字符串数据时,可以使用下面的字符数据类型. CHAR 固定长度.不足部分使用空格填充的字符串. varchar 变长字符串. text(MySQL和SQL Server)或CLO ...
- MyBatis基础学习笔记--摘录
1.MyBatis是什么? MyBatis源自于IBatis,是一个持久层框架,封装了jdbc操作数据库的过程,使得开发者只用关心sql语句,无需关心驱动加载.连接,创建statement,手动设置参 ...
- java.lang.Class类
第一次接触Class类是在学习 jdbc中.Class.forName()是Class类的一个静态方法,用于手动加载一个类,例如数据库驱动. 其实每一个java类都拥有或者说对应一个Class的实例对 ...
- JavaScript初探之字符串与数组
一直在研究JS以至于忘记跟新博客... 字符串:// str.charAt(x); //获取下标为x的字符// str.indexOf(",",1); //获取",&qu ...
- [LeetCode] Cracking the Safe 破解密码
There is a box protected by a password. The password is n digits, where each letter can be one of th ...
- 用redis的订阅发布解决了扫码支付实时响应的问题
一.场景描述: PC收银台的浏览器展示了收款二维码,用户扫了支付二维码,支付完成后,浏览器需要实时响应支付结果. 二.问题描述: 扫码支付的支付结果一般通过服务端回调和主动查询来获取,显示二维码之后, ...