oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描
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函数引发的大表全表扫描相关推荐
- Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用
/*+parallel(t,4)*/在SQL调优中的重要作用! 2013年11月17日 12:59:24 雾里看花5566 阅读数:5422更多 个人分类: 数据库-oracle 谈谈HINT /*+ ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解
<高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...
- /*+parallel(t,4)*/在SQL调优中的重要作用!
谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用! /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果, 基于并行查询要启动并行进程.分配任务与系统资源 ...
- oracle sql 分区查询语句_Oracle SQL调优之分区表
一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...
- oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain
1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...
- Oracle SQL调优系列之no_unnest和unnest用法简介
Oracle调优之no_unnest和unnest用法简介 本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即/*+no_unnest */和/*+ unnest*/,介绍Oracle ...
- Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全
该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...
- oracle避免回表,请教大家: 经常在sql调优过程中提到避免“回表”,具体是指什么意思???3Q...
你的位置: 问答吧 -> Oracle -> 问题详情 请教大家: 经常在sql调优过程中提到避免"回表",具体是指什么意思???3Q 如题,不甚感激!!!! [ 本帖 ...
- SQL调优与报表的性能优化
原文链接:https://www.iteye.com/blog/shensy-1664549 作者:shensy 一.SQL调优: 1.提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到 ...
最新文章
- 2016年,你该如何在 Facebook 上做营销?
- tomcat jsvc 调优及JMX监控
- 【转】NHibernate入门教程
- 步进电机红外遥控C语言程序,单片机红外遥控+步进电机+1602液晶显示c语言源程序...
- asp.net core 3.0 gRPC框架小试
- Spring Boot –适合您的靴子!
- Window10 Tensorflow 2.1 GPU 安装和测试
- node mysql查询回调_nodejs 数据库查询回调问题
- tomcat7安装以及环境变量配置
- ArcGIS连接pg数据库
- 【STM32 基础实验矩阵按键】
- MaxCompute创建TableStore外表
- TestCenter测试管理工具介绍和环境配置(A)
- BLE 怎样添加 Characteristic
- 如何html5将文字插入图片,如何在文字中加入图片?
- HTML知识点学习(二)
- 【优化】seo之提升网站流量的四种方法
- 一文读懂GPU服务器
- 中国传媒大学GPA算法
- 解决Playbook不能充电的问题