川川找我优化SQL,逻辑读达到398,000,安排一下。

SQL和执行计划:

SELECT t1.*, t3.bed_number, t3.patient_name, t4.name
FROM odw_checkrecipe_result t1
left join lenovo_his.ip_patient_regis t3
on t3.ip_number = t1.visit_id
left join hd_advice t4
on t4.advice_id = t1.order_id
WHERE NOT EXISTS
(select *
from odw_checkrecipe_result t2
WHERE t1.DETAIL_ID = t2.DETAIL_ID
AND t1.AUDIT_TIME < t2.AUDIT_TIME)
and t1.detail_id in (select advice_main_id
from hd_advice
where create_id = '70013'
and status = 1
and advice_type in (11, 12, 13)
group by advice_main_id); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 9mmh1q6bxznxj, child number 0
-------------------------------------
SELECT t1.*, t3.bed_number, t3.patient_name, t4.name FROM
odw_checkrecipe_result t1 left join lenovo_his.ip_patient_regis t3
on t3.ip_number = t1.visit_id left join hd_advice t4 on
t4.advice_id = t1.order_id WHERE NOT EXISTS (select * from
odw_checkrecipe_result t2 WHERE t1.DETAIL_ID = t2.DETAIL_ID
AND t1.AUDIT_TIME < t2.AUDIT_TIME) and t1.detail_id in
(select advice_main_id from hd_advice
where create_id = '70013'
and status = 1 and advice_type in (11, 12,
13) group by advice_main_id) Plan hash value: 3849450906 -------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.85 | 398K| | | |
| 1 | HASH GROUP BY | | 1 | 93 | 0 |00:00:00.85 | 398K| 760K| 760K| |
| 2 | NESTED LOOPS OUTER | | 1 | 93 | 0 |00:00:00.85 | 398K| | | |
| 3 | NESTED LOOPS OUTER | | 1 | 93 | 0 |00:00:00.85 | 398K| | | |
| 4 | NESTED LOOPS | | 1 | 93 | 0 |00:00:00.85 | 398K| | | |
|* 5 | HASH JOIN RIGHT ANTI | | 1 | 1372 | 135K|00:00:00.22 | 3268 | 9702K| 3788K| 8770K (0)|
| 6 | TABLE ACCESS FULL | ODW_CHECKRECIPE_RESULT | 1 | 137K| 141K|00:00:00.02 | 1634 | | | |
| 7 | TABLE ACCESS FULL | ODW_CHECKRECIPE_RESULT | 1 | 137K| 141K|00:00:00.05 | 1634 | | | |
|* 8 | TABLE ACCESS BY INDEX ROWID| HD_ADVICE | 135K| 1 | 0 |00:00:00.61 | 394K| | | |
|* 9 | INDEX RANGE SCAN | IDX_HD_ADVICE_MAIN_ID | 135K| 1 | 180K|00:00:00.31 | 260K| | | |
| 10 | TABLE ACCESS BY INDEX ROWID | IP_PATIENT_REGIS | 0 | 1 | 0 |00:00:00.01 | 0 | | | |
|* 11 | INDEX RANGE SCAN | IDX_IP_PATIENT_REGIS_NUM | 0 | 1 | 0 |00:00:00.01 | 0 | | | |
| 12 | TABLE ACCESS BY INDEX ROWID | HD_ADVICE | 0 | 1 | 0 |00:00:00.01 | 0 | | | |
|* 13 | INDEX UNIQUE SCAN | HD_ADVICE_PK | 0 | 1 | 0 |00:00:00.01 | 0 | | | |
------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 5 - access("T1"."DETAIL_ID"="T2"."DETAIL_ID")
filter("T1"."AUDIT_TIME"<"T2"."AUDIT_TIME")
8 - filter(("STATUS"=1 AND "CREATE_ID"='70013' AND (TO_NUMBER("ADVICE_TYPE")=11 OR TO_NUMBER("ADVICE_TYPE")=12 OR
TO_NUMBER("ADVICE_TYPE")=13)))
9 - access("ADVICE_MAIN_ID"=TO_NUMBER("T1"."DETAIL_ID"))
11 - access("T3"."IP_NUMBER"="T1"."VISIT_ID")
13 - access("T4"."ADVICE_ID"=TO_NUMBER("T1"."ORDER_ID")) 45 rows selected.

这条SQL比较简单,我其实就喵了一眼执行计划就看到问题,hd_advice表有700W行数据,通过谓词信息了解到 第9行 access("ADVICE_MAIN_ID"=TO_NUMBER("T1"."DETAIL_ID")) t1 表和 hd_advice 表关联访问是用到索引的,

但是执行到第8行 filter(("STATUS"=1 AND "CREATE_ID"='70013' AND (TO_NUMBER("ADVICE_TYPE")=11 OR TO_NUMBER("ADVICE_TYPE")=12 OR TO_NUMBER("ADVICE_TYPE")=13))) 这段条件过滤时候又进行了回表扫描,

说明现有的索引不合适这个谓词过滤条件,索引块获取不到相关的记录,需要再次回表扫描,产生大量的逻辑读。

创建联合索引进行优化规避回表扫描:

create index idx_hd_advice_1_2_3_4 on hd_advice(create_id,status,advice_type,advice_main_id);

创建完索引后逻辑读应该就能降下来了,川川也提供了验证,buffer 降到3,这条SQL到此已经完成优化。

最后总结:

   ORACLE调优慢SQL的步骤如下:

    1、先尝试创建索引或者修改数据库参数看看能否达到调优目的。

    2、上面手段无效果尝试通过HINT干预执行计划进行调优,如果有效果使用sqlprofile绑定新的执行计划。

    3、如果上述手段均无办法调优SQL,只能通过SQL等价改写、升级硬件设备、业务代码重构等方式进行优化。

ORACLE SQL语句逻辑读高优化案例的更多相关文章

  1. oracle管理优化必备语句以及oracle SQL语句性能调整

    本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...

  2. Oracle SQL语句性能优化方法大全

    Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...

  3. Oracle sql语句执行顺序

    sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...

  4. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...

  5. Oracle SQL语句执行步骤

    转自:http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762345.html Oracle中SQL语句执行过程中,Oracle内部解析原理如下 ...

  6. Oracle SQL语句追踪

    Oracle SQL语句追踪 1   SQL语句追踪 追踪SQL语句的执行过程需要在Oracle服务器端进行,Oracle服务器端会检测并记录访问进程所执行的所有SQL语句.下面使用的命令都是在命令行 ...

  7. Oracle SQL语句执行过程

    前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...

  8. [转]关于oracle sql语句查询时表名和字段名要加双引号的问题

    oracle初学者一般会遇到这个问题.   用navicat可视化创建了表,可是就是不能查到!   后来发现②语句可以查询到 ①select * from user; 但是,我们如果给user加上双引 ...

  9. oracle: sql语句报ora-01461/ora-00911错误

    oracle: sql语句报ora-01461/ora-00911错误 ora-00911:sql语句中可能含有特殊字符,或者sql语句中不能用";"分号结尾. sql语句报ora ...

  10. 简单的oracle sql语句练习

    简单的oracle sql语句练习 求每个部门的平均薪水 select deptno,avg(sal) from emp group by deptno 每个部门同一个职位的最大工资 select d ...

随机推荐

  1. 订单逆向履约系统的建模与 PaaS 化落地实践

    导读 本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践,京东零售快退平台承接了零售几乎所有售前逆向拦截和退款业务,并在长期的业务和技术探索中沉淀了丰富的业务场景设计方案.架构设计经验,既 ...

  2. Mariadb取24小时数据--九五小庞

    Mariadb是一种常用的关系型数据库管理系统.在进行实时数据处理时,我们常常需要查询最近24小时的数据来进行分析和处理.下面我们将介绍如何使用MySQL查询最近24小时的数据. SELECT * F ...

  3. Go的函数定义

    格式: 1 func function_name( [parameter list] ) [return_types] { 2 函数体 3 } 注释: func:函数由 func 开始声明 funct ...

  4. 【高并发】SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)

    大家好,我是冰河~~ 首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 提起SimpleDateF ...

  5. 注意!JAVA中的值传递

    前言:今天在解决一个问题时,程序总是不能输出正确值,分析逻辑思路没问题后,发现原来是由于函数传递导致了这个情况. LeetCode 113 问题:给你二叉树的根节点root和一个整数目标和target ...

  6. 快手Java一面11问(附参考答案)

    现在已经到了面试招聘比较火热的时候,后续会分享一些面试真题供大家复习参考.准备面试的过程中,一定要多看面经,多自测! 今天分享的是一位贵州大学的同学分享的快手一面面经. 快手一面主要会问一些基础问题, ...

  7. ETL之apache hop系列1-ETL概念与hop简介

    ETL 简单介绍 ETL概念 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的 ...

  8. Laf & 中大猫谱:让每一只流浪猫都有家

    猫谱简介 中大猫谱是一款辅助校园流浪猫救助的开源小程序项目,服务端使用 Laf 云开发. 猫谱主要功能包括:猫咪信息登记.照片分享.拍照识猫.公告和留言等.项目创立的初衷,是解决校园猫猫交流群里的一个 ...

  9. KRpano项目微信出现"关于潜在的违法或违规内容"

    最近,部分小伙伴反应某些KRPano项目在微信中,出现"关于潜在的未发或违规内容"而无法播放的问题,会看到下图中的提示: 出现原因 这个问题是由于KRPano项目中的webvr.j ...

  10. ionic4请求skynet服务器的资源跨域问题

    最近在做一个后台接口, 顺便用ionic4写了个简单的管理后台, 本来skynet管理后台监听的端口是6666, 但是发现chrome默认对一些接口不友善, 虽然可以通过设置启动参数来解决, 但是还是 ...