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语句的条件是从右 ...
随机推荐
- POJ3320 尺取法的正确使用法
一.前言及题意: 最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书.蓝书,似乎都有些不尽如人意.这两天看到了日本人的白书,重新 ...
- Kubernetes添加带Quota限额的CephFS StorageClass
1. 在Ceph上为Kubernetes创建一个文件系统 # ceph osd pool create cephfs_data # ceph osd pool create cephfs_metada ...
- Linux服务器管理员必备Linux命令TOP5
Linux桌面环境的界面友好度.图形性能及附件工具已经大幅进化,然而Linux服务器却还没有能达到这一步. 作为系统管理员必须熟练掌握Linux命令.Linux命令的内容很多,其中的一些TOP命令对于 ...
- 码农与UI沟通的日常
事情是这样的,这是一个兴趣群组的效果图. 我看了一眼没有帖子时的提示,觉得这样的提示 不走心 不能展现出我们团队对于人生及世界的深度理解和高尚的品格. 于是,我选择了表达内心的真实感受. 我觉得这完美 ...
- IOS开发---菜鸟学习之路--(十四)-将BASE64图片转换成Image
本文基本全部都是代码 首先是.H文件 #import <Foundation/Foundation.h> @interface Base64AndImageHelp : NSObject ...
- 62、在app遇到全局异常时避免直接退出,如何让app接管异常处理?
1.创建一个类为CrashHandler import android.content.Context; import android.os.Looper; import android.util.L ...
- MySQL出现错误1045,用户无法连接
1.root用户可以登陆进去 假设新建了个sqlin用户,但是无法用此用户连接MySQL 这个时候root用户可以登录吧,root用户登录进去,重新修改该用户的密码,执行语句 use mysql; u ...
- Python-S9-Day122-Python爬虫
11 初识爬虫 11 初识爬虫 12 今日作业 11.1 初识黄页: 11.2 互联网就是一张大的蜘蛛网: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...
- json对象中根据主键判断是否有重复数据
function funCheckRepeat() { var ids = $(gridId).jqGrid('getGridParam', 'selarrrow'); if (ids.length ...
- location.replace()和location.href=进行跳转的区别
location.href 通常被用来跳转到指定页面地址;location.replace 方法则可以实现用新的文档替换当前文档;location.replace 方法不会在 history 对象中生 ...