Oracle SQL调优记录详解数据库
本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太多表。面对复杂的业务场景,确实有些情况是需要关联很多表的。当然有些情况是可以将业务实现放在Java代码里,有些情况可以不要关联很多表。
二、注意点对于SQL调优,不要马上就说加索引什么的,加索引不一定就能解决问题的,加错索引,反而会导致查询变慢,注意加索引的同时也会影响数据库写数据的速度。
三、Oracle执行计划对于SQL调优,可以通过Oracle的执行计划来分析。oracle的执行计划确实是对sql进行分析的一种很好的方法。
下面介绍一下oracle的执行计划。
oracle要使用执行计划的sql为:
explain plan for select 1 from 表格
不过如果是使用PLSQL的话,那就可以使用PLSQL提供的查询执行计划了,PLSQL安装有问题可以参数我以前写的博客:https://blog.csdn.net/u014427391/article/details/56479085
打开PLSQL
工具 - 首选项 - 窗口类型 - 计划窗口 ,在这里加入执行计划需要的参数
找个SQL,用PLSQL执行一下,这是plsql的简单使用
解释一下这些参数的意思:
基数(Rows):Oracle估计的当前步骤的返回结果集行数
字节(Bytes):执行SQL对应步骤返回的字节数
耗费(COST)、CPU耗费:Oracle估计的该步骤的执行耗费和CPU耗费
时间(Time):Oracle估计的执行sql对于步骤需要的时间
表访问的几种方法:
TABLE ACCESS FULL(全表扫描)
TABLE ACCESS BY ROWID(通过ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引扫描)
oracle执行计划其实就是看一下那些表是按索引扫描的,通过加一些索引实现,TABLE ACCESS BY INDEX SCAN(索引扫描)。
下面给出一篇很详细介绍oracle执行计划的博客
https://www.cnblogs.com/Dreamer-1/p/6076440.html
在加一些索引的过程,有时候会遇到索引失效的情况,这时候可以加强制索引试试
强制索引 /*+ index(表名别名 索引名称)*/
假如select *from 表格 a,然后加了个索引i,那么就是
/*+ index(a i)*/4.2 基数反馈机制
之前同事有遇到一种加了索引还是不起效的情况,后来听他说是是一种基数反馈机制导致的,解决方法是在sql加上,意思是关了基数反馈机制
基数反馈机制 /*+ opt_param(_optimizer_use_feedback,false)*/
比如
select /*+ opt_param(_optimizer_use_feedback,false)*/ a from 表格4.3 oracle开窗函数
用oracle开窗函数替换group by,oracle的group by有时候是很耗查询的,今天遇到一个sql查询很慢的问题,用oracle开窗函数进行替换group by提高速度。当然这些都是根据实践业务场景来调优的。我遇到的业务场景是适合的。因为关联的表数据量很大。
原来SQL,简单写一下,举个例子,实际的业务场景不是这么简单的sql
select max(to_number(aa.seq)) from t_info aa where aa.id = ? group by aa.seq
改造sql:
select seq from (select aa.seq, row_number() over(partition by aa.seq order by aa.date desc nulls last)rn from t_info aa ) where rn=1
然后推荐一本oracle调优书籍《收获,不止SQL优化》一书
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/5085.html
oracle相关文章
- Oracle数据库分页查询语句实现(oracle的分页语句)
- 管理管理Oracle数据库中的包(oracle包)
- Oracle中设置对象权限的方法(oracle对象权限设置)
- 连接高效完成Java面试:掌握Oracle连接知识(java面试oracle)
- 策略Oracle解除密码过期策略:自由没有界限(oracle取消密码过期)
- 应用Oracle,雇佣实施顾问吧(oracle实施顾问)
- 深入浅出Oracle字符转换函数(oracle字符转换函数)
- 使用Oracle触发器实现有效的数据库管理(oracle触发器类型)
- 深入浅出 Oracle 数据库原理(oracle原理)
- Oracle数据库技术深入浅出(oracle数据库精通)
- 快速学习:Oracle如何导出数据表(oracle如何导出表)
- MDB和Oracle:最佳数据库技术解决方案(mdb oracle)
- Oracle数据库的卓越之处:4194(oracle 4194)
- 解析Oracle数据库中结果集的连接方法(oracle连接结果集)
- Oracle数据库超出标准模式的新可能(oracle 其他模式)
- 快速配置Idea搭建Oracle数据库环境(idea配置oracle)
- GTA5的神秘Oracle的真相(gta5的oracle)
- Oracle数据库事务隔离级别设置(oracle事情隔离设置)
- 妙用Oracle伪列助你编程更轻松(oracle伪列使用)
- Oracle数据库中实现模糊查询的技巧(oracle中模糊查找)
- Oracle数据库中文显示编码技术研究(oracle中文显示 号)
- Oracle中实现换行的简单技巧(oracle 中回车换行)
- Oracle 优先级顺序指南做好排序准备(oracle中优先级顺序)
- 操作Oracle数据库多实例操作实战(oracle不同实例写)
- Oracle数据库上移功能的实现方式(oracle 上移功能)
- 媒体处理利用Oracle数据库做多媒体文件TXT处理(oracle txt做多)
- Oracle SLA实践中的经验剖析(oracle sla举例)
- Oracle888题库开启Oracle技术思维深耕之路(oracle888题库)