专栏首页Nicky's blogOracle SQL调优记录

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

四、调优记录

4.1 强制索引

在加一些索引的过程,有时候会遇到索引失效的情况,这时候可以加强制索引试试

强制索引
/*+ 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方面的博客都放在:https://blog.csdn.net/u014427391/article/category/6112832

然后推荐一本oracle调优书籍《收获,不止SQL优化》一书

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL索引知识学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    SmileNicky
  • Oracle优化器基础知识

    本博客介绍一下属于oracle优化器范畴的一些基础知识,访问数据的方法,分为直接访问数据的方法和访问索引的方法两种,然后有了这些基础知识后,可以参考学习我的另外...

    SmileNicky
  • Oracle性能调优之虚拟索引用法简介

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014427391/article/details/...

    SmileNicky
  • 数据库索引

    数据库索引,在日常工作中会经常接触到,比如某一个 SQL 查询比较慢,分析原因后,经常会说 “给某个字段加个索引”,索引又是如何工作的?

    王小明_HIT
  • 数据库优化

    1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

    ellipse
  • [CodeIgniter4]讲解-lnmp配置

    LNMP1.4以上也可以直接使用/lnmp1.4/tools/目录下的./remove_open_basedir_restriction.sh进行移除。

    landv
  • Netty中的这些知识点,你需要知道!

    Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口。

    WindWant
  • openshift pod对外访问网络解析

    openshift封装了k8s,在网络上结合ovs实现了多租户隔离,对外提供服务时报文需要经过ovs的tun0接口。下面就如何通过tun0访问pod(172.3...

    charlieroro
  • 视觉三维建模

      既能准确计算进出人数,又能有效过滤掉干扰物体(如推车、行李箱、人员徘徊、拥挤及躯体重叠、人员经过未进入等,另外用户也需要有特殊应用,比如身高低于1.2米的儿...

    JNingWei
  • Node中的事件循环和异步API

    单线程编程会因阻塞I/O导致硬件资源得不到更优的使用。多线程编程也因为编程中的死锁、状态同步等问题让开发人员头痛。 Node在两者之间给出了它的解决方案:利用单...

    前端下午茶

扫码关注云+社区

领取腾讯云代金券