Oracle SQL优化进阶学习
引言
对于下面的Oracle分页如何优化该段语句:
SELECT *
FROM (SELECT A.*, ROWNUM RN
FROM (SELECT * FROM task_log order
by taskid desc) A
WHERE
ROWNUM <= 40)
WHERE RN >= 21;
第一部分:
判断并获取问题SQL?
问题sql主要有以下两个表象
系统级别表象:
- CPU消耗严重
- IO等待严重
- 页面相应时间过长
SQL语句表象:
- 冗长
- 执行时间过长
- 从全表扫描获取数据
- PLAN的cost很大
第二部分:
SQL优化-基础篇
数据库设计的技巧:
- 主键设计
所有的表都应该有主键
主键尽量为单例
主键尽量采用INT类型
尽量避免使用字符、UUID作为主键
- 数据类型设计
尽量使用数字类型而非字符类型
尽量使用日期类型而非字符类型
定长字符可以考虑使用char类型
尽量选择最小的空间来存储数据
- 数据分割设计
采用垂直分割将热数据和冷数据拆分
采用水平分割或者分区实现减少表大小
- 减少递归查询的设计
避免connect by语法以join替代
采用存储过程实现connect by特性
- 范式化设计和反范式化设计
范式化设计优点:数据精简、DML效率高
范式化设计缺点:join时查询效率稍差
范式化设计适用环境:在线交易系统、需要严格事务支持的环境
反范式化设计优点:查询效率高,避免join
反范式化设计缺点:数据冗余、DML代价大
反范式化设计适用环境:数据仓库环境、无需事务支持的环境
- 对象放置设计
适合大型数据库设计
热数据冷数据分开存放
不同业务需求数据分开存放-成本考虑
在线交易及仓库数据分开存放
- 列位置设计
常用的列放在前面
列数量要尽可能少
SQL编写的技巧
- 合理使用索引
概念学习:
选择率的概念:重复值少的称之为选择率高;重复值多的称之为选择率低
索引层级的概念:索引越大,可能层级越多;索引层级越大,效率越低
Oracle索引扫描的类型:
-index unique scan
-index range scan
-index skip scan
-index fast full scan
-index full scan
使用建议:
选择率高且被where频繁引用需要建立B树索引
大表的join列需要建立索引
复杂文档类型查询采用全文索引效率更好
索引的建立要在查询和DML性能之间取得平衡
复合索引用法就是上一条的具体思考
第一步优化:
对于前面的那个优化的例子,在未建立索引之前,执行计划如下所示(主要关注红色箭头的位置)

尝试在排序字段建立索引:
drop
index idx1;create
index idx1 on task_log(taskid desc);exec dbms_stats.gather_schema_stats(ownname =>'SCOTT',options => 'GATHER',estimate_percent => null,method_opt=>'for all indexed columns',cascade=>true,degree=> 4 );
执行效果如下:

- 使用UNION ALL替代UNION
- 避免select *写法
- JOIN字段建议建立索引
- 避免复杂SQL语句
- 避免where 1=1写法
- 避免order by rand()类似写法
初步了解执行计划
Cost的概念:
成本表示优化器对执行语句所用时间的最优估计;
优化器主要分2种,CBO和RBO,对于新版本数据库,RBO已经基本淘汰。
CBO(基于代价的优化器)是RBO(基于规则的优化器)的替代品,从9i开始oracle就建议用户使用RBO来进行SQL的优化;
CBO大概的优化原理很简单,他通过对象上的统计信息来计算各个执行计划的代价,然后选择代价较小的执行计划来运行
对于CBO来说对象(比如表,索引)上的统计信息就显得十分的重要,不仅要有统计信息,还要保证统计信息是准确的,不准确的统计信息可能会带来灾难性的结果。
SQL优化-进阶篇
深入理解执行计划
了解执行计划的并行操作
了解执行计划的各种类型JOIN
了解执行计划的子查询相关
了解数据库参数对执行计划影响
10046事件跟踪
索引进阶使用技巧
位图索引
IOT
函数索引
聚簇因子
固化数据的技巧
物化视图和查询重写
全局临时表
with语句固化数据
使用分区修剪来优化查询
查询指定分区
查询不指定分区
固定执行计划
profile
outline
baseline
优化join方式
HASH JOIN
NEST LOOP JOIN
Sort merge join
STAR JOIN
使用HINT优化
first rows对分页SQL进行优化
index HINT强制使用INDEX
use_hash、use_nj改变join方法
并行hint/+*parallel(t 4)*/
第二步优化:尝试使用HINT
SELECT
/*+ first_rows(20)*/*
FROM (SELECT A.*, ROWNUM RN
FROM (SELECT * FROM task_log order
by taskid desc) A
WHERE
ROWNUM <= 40)
WHERE RN >= 21;

SQL优化技能培养
个人:深入学习特定RDBMS
个人:熟能生巧
制度:重视数据库设计,从源头避免很多问题
制度:完善并遵循SQL编写规范
Oracle SQL优化进阶学习的更多相关文章
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
- Oracle SQL 优化规则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习
<高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...
- Oracle SQl优化总结
对数据库技术的热爱是我唯一的安慰,毕竟这是自己喜欢的事情,还可以做下去. 因为客户项目的需要,我又开始接触Oracle,大部分工作在工作流的优化和业务数据的排查上.为了更好的做这份工作,我有参考过or ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
- oracle sql优化
整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...
- Oracle SQL优化一(常见方法)
1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...
- oracle sql优化笔记
oracle优化一般分为:1.sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的) A.oracle的sql语句的条件是从右 ...
随机推荐
- cut(树形DP)
Description F大爷热爱切树.今天他找到一棵黑白树,不到两秒钟,F大爷就把这棵树切掉了.已知原先树上共n个点,每个点都是黑点或者白点,F大爷切去若干条边后,分成的若干个连通子树中每块恰有一个 ...
- mysql-不恰当的update语句使用主键和索引导致mysql死锁
背景知识:MySQL有三种锁的级别:页级.表级.行级. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level ...
- sql中over的用法
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用.其参数:over(partition by columnname1 order by c ...
- P3805 【模版】manacher算法(manacher)
P3805 [模版]manacher算法 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a ...
- Python 命令总结
本章内容 pip pip install -r requirement.py(里面写入需要安装的包的名字) pip install django==1.9 #需要安装那个版本 P ...
- 图说不为人知的IT传奇故事-5-小型机之王
此系列文章为“图说不为人知的IT传奇故事”,各位大忙人可以在一分钟甚至几秒内了解把握整个内容,真可谓“大忙人的福利”呀!!希望各位IT界的朋友在钻研技术的同时,也能在文学.历史上有所把握.了解这些故事 ...
- IOS开发学习笔记030-xib实现淘宝界面
使用xib文件实现界面,然后通过模型更新数据. 1.使得控制器继承自UITableViewController 2.创建xib文件,实现界面如下:一个UIImageView,两个lable 3.新建一 ...
- Windows网络编程笔记3 ---- 邮槽和命名管道
邮槽和命名管道的使用方法也很简单,只需几个有限的函数就可以实现双方的通信. 第三.邮槽 邮槽----进程间通信机制. 通过邮槽客户进程可以将消息通过广播给一个或多个服务进程.这是一个单向通信机制,缺点 ...
- windows下使用grunt
grunt官网:http://www.gruntjs.org/ 一.安装grunt 先安装node,在http://www.nodejs.org/可以下载安装包直接安装.在命令行下运行: npm in ...
- Android 数据存储-文件读写操作
本来已经写了一部分,后来发现这篇博客写的比我的好,就直接引用一下: https://www.cnblogs.com/LiHuiGe8/p/5604725.html