2017年8月14日,一地市oracle相关的调度程序ETL抽取速度奇慢,sql语句每次执行平均时间要9秒左右,如果所示:

该调度过程涉及的sql语句如下:

select count(*) from (SELECT

rtrim(a.pid) PID,

a.item_type PTYPE,

‘‘ FEETYPE,

‘‘ HISDID,

a.item_date ITEM_DATE,

nvl(a.wjw_id,a.item_id) ITEM_ID,

a.item_name ITEM_NAME,

nvl(a.numbers, 0) NUMBERS,

nvl(a.price, 0) PRICE,

nvl(a.costs, 0) COSTS,

a.physician_id PHYSICIAN_ID,

a.physician_name PHYSICIAN_NAME,

a.dept_id DEPT_ID,

a.deptname DEPTNAME,

‘0‘ USAGE,

‘‘ FREQUENCY_INTERVAL,

a.specification USE_METHOD,

nvl(a.usage_days, 0) DAYS_OF_SUPPLY,

nvl(a.costs, 0) ELIGIBLE_AMOUNT,

‘‘ SELF_AMOUNT,

‘‘ PHYSICIAN_LEVEL,

‘‘ PHYSICIAN_AP,

‘‘ ApprovalNumber,

a.id PrescriptionNo,

‘‘ CostCategory,

‘‘ ITEM_NAME_HOSPITAL,

‘‘ ForLeave

from CLAIMDETAILHOSPITAL_temp a

where trim(a.pid)=‘42900500007915202‘);

sqlplus登录业务用户,执行并查看该sql的执行计划如下:

由sql执行计划发现,该sql语句执行了全表扫描,谓词是: 2 - filter(TRIM("A"."PID")=‘42900500007915202‘)

查看表CLAIMDETAILHOSPITAL_TEMP上的索引情况:

由此,可知表CLAIMDETAILHOSPITAL_TEMP上有针对pid的索引PID_INDEX,但是索引PID_INDEX的DDL语句是:

create index pid_index on claimdetailhospital_temp(pid);

到此,可以判断sql语句执行全表扫描的原因是:sql的where条件where trim(a.pid)=‘42900500007915202‘)对查询条件字段pid使用trim函数导致了参数转换,

使得索引pid_index无法使用而执行了全表扫描。处理方法很简单,删除索引PID_INDEX,创建基于trim的函数索引:

create index ind_pid on CLAIMDETAILHOSPITAL_TEMP(trim(pid));

函数索引创建成功后,SQL的执行速度有了质的提高,执行速度从9秒降低至100毫秒:

有一个问题值得思考:开发或测试为什么不在应用的前端对pid执行前后去空格的函数trim,反而非要放在数据库端执行,这样不但加重了数据库服务器的工作负担,

还很容易导致这种因函数使用不当引起大表的全表扫描而降低sql的执行速度;虽然,对pid字段创建基于trim的函数索引能提升sql的执行效率,但是相比普通的索引

基于trim的函数索引,一定会大大降低dml语句的执行效率;如果trim这种去空格的函数放在web前端进行,数据库则可免去这种不必要的性能损失。

本文出自 “清风艾艾” 博客,请务必保留此出处http://3596022.blog.51cto.com/3586022/1976249

ORACLE sql调优之记录一次trim函数引发的大表全表扫描

标签:oracle   trim   全表扫描   sql   调优

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://3596022.blog.51cto.com/3586022/1976249

oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描相关推荐

  1. Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用

    /*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...

  2. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解

    <高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...

  3. /*+parallel(t,4)*/在SQL调优中的重要作用!

    谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用! /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果, 基于并行查询要启动并行进程.分配任务与系统资源 ...

  4. oracle sql 分区查询语句_Oracle SQL调优之分区表

    一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...

  5. oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain

    1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...

  6. Oracle SQL调优系列之no_unnest和unnest用法简介

    Oracle调优之no_unnest和unnest用法简介 本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即/*+no_unnest */和/*+ unnest*/,介绍Oracle ...

  7. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  8. oracle避免回表,请教大家: 经常在sql调优过程中提到避免“回表”,具体是指什么意思???3Q...

    你的位置: 问答吧 -> Oracle -> 问题详情 请教大家: 经常在sql调优过程中提到避免"回表",具体是指什么意思???3Q 如题,不甚感激!!!! [ 本帖 ...

  9. SQL调优与报表的性能优化

    原文链接:https://www.iteye.com/blog/shensy-1664549   作者:shensy 一.SQL调优: 1.提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到 ...

最新文章

  1. 2016年,你该如何在 Facebook 上做营销?
  2. tomcat jsvc 调优及JMX监控
  3. 【转】NHibernate入门教程
  4. 步进电机红外遥控C语言程序,单片机红外遥控+步进电机+1602液晶显示c语言源程序...
  5. asp.net core 3.0 gRPC框架小试
  6. Spring Boot –适合您的靴子!
  7. Window10 Tensorflow 2.1 GPU 安装和测试
  8. node mysql查询回调_nodejs 数据库查询回调问题
  9. tomcat7安装以及环境变量配置
  10. ArcGIS连接pg数据库
  11. 【STM32 基础实验矩阵按键】
  12. MaxCompute创建TableStore外表
  13. TestCenter测试管理工具介绍和环境配置(A)
  14. BLE 怎样添加 Characteristic
  15. 如何html5将文字插入图片,如何在文字中加入图片?
  16. HTML知识点学习(二)
  17. 【优化】seo之提升网站流量的四种方法
  18. 一文读懂GPU服务器
  19. 中国传媒大学GPA算法
  20. 解决Playbook不能充电的问题

热门文章

  1. jpa查询异常InvalidDataAccessApiUsageException
  2. React与D3的结合
  3. img标签 轻松显示 base64格式的图片
  4. 【U8+】用友常用账的数据库表
  5. PYTHON对接验证码通知短信API
  6. html如何有立体效果,一段CSS代码让div盒子有立体效果
  7. Linux下WPS自主设置快捷键,WPS文字技巧—如何给特殊符号自定义快捷键
  8. android中电话归属地查询
  9. 还在用[CLS]?从BERT得到最强句子Embedding的打开方式!
  10. 点击按钮横向滚动左右滚动