Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FF009-一个索引拯救了一个exadata

FF009-一个索引拯救了一个exadata

作者头像
老虎刘
发布于 2024-07-19 11:01:59
发布于 2024-07-19 11:01:59
12300
代码可运行
举报
运行总次数:0
代码可运行

这是一个非常典型的索引优化案例,我在2021年06月15日<优化的故事及大型生产系统性能优化实战>培训 中的故事篇里面提到过, 一个SQL占了一个exadata高级硬件环境的绝大部分资源, 平均执行时间51秒. 今天我再详细分析一下这个案例.

下面截取的是AWR按执行时间排名的top SQL:

下面截取的是分别按CPU,磁盘读,逻辑读排名的Top SQL,:

从上面的截图可见, 该系统的一个Top SQL消耗的一多半的系统资源.

SQL比较简单, 就是一个单表查询, 表不算太大, 370多万记录, 占用空间13G,一个贷款业务, 历史数据不能清理.

用户也尝试建了一个3字段索引, 但是用不上, 执行计划还是全表扫描. sql_text及索引如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM CUSTOM_APPLY_xxx
WHERE (
       (TO_DATE(:1 , 'YYYYMMDDHH24MISS') >= TO_DATE(CREATE_TIME, 'YYYYMMDDHH24MISS')  
          AND PUSH_CREDIT_FLAG = 'I')
       OR 
       (PUSH_CREDIT_FLAG = 'F'  AND PUSH_CREDIT_COUNT > 3)
       )
  AND (CREDIT_REPORT_TYPE = '1'  or  CREDIT_REPORT_TYPE is null);

--创建的索引如下:
CREATE INDEX "IDX_CUSTOM_APPLY_xxx" ON "CUSTOM_APPLY_xxx" 
("CREATE_TIME", "PUSH_CREDIT_COUNT", "PUSH_CREDIT_FLAG");

看到这里, 不知道各位读者有什么优化思路?

有优化经验的人可能一眼就看到了一个问题: create_time字段上使用了to_date函数, 导致索引失效.

TO_DATE(:1 , 'YYYYMMDDHH24MISS') >= TO_DATE(CREATE_TIME, 'YYYYMMDDHH24MISS') 这个写法确实不够规范, 也是我在给很多的开发人员培训时多次强调的.

把create_time字段上的to_date函数去掉,或者改成to_date函数索引就行了吗?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
生产sql调优之统计信息分析(89天)
今天凌晨,又被电话叫醒了,说是有1个sql,现在跑的很慢。问题已经挺严重了,想让我看看,能不能做点什么。 首先就是和他们确认最近有什么改动,他们说这个是用了很久的sql语句了,没有任何的改动,再听他们说,之前也没有任何的问题。 然后就和他们确认之前这个jobl处理大概多长时间,那个哥们说他也是最近才进的这个项目,可能数据量不同,他也不清楚。但是他肯定的说这个job会跑的很快,几个小时肯定能处理完。 大概了解了下,他们也确定具体的sql语句是什么,没有得到太多的信息,首先通过top命令来抓一下目前消耗资源比
jeanron100
2018/03/14
5540
生产sql调优之统计信息分析(89天)
生产系统调优之_毫秒级的改进 (92天)
生产中有一个sql语句,做了union-all操作,对于时间的要求是极其严格的,目前已经从2秒的改进调整到了1秒以内,在此基础上还想做进一步的调整,因为极其频繁的查询,如果一丁点的改进都会在时间上的飞跃,以下的sql语句目前时间控制在不到半秒的样子。 因为表SMALL_OFFER_PARAM 是一个数据字典表,查询的字段上没有相关的索引。目前采用了exisits来做关联。 SELECT DISTINCT 'K', AR.RESOURCE_VALUE,
jeanron100
2018/03/14
6950
job处理缓慢的性能问题排查与分析(r4笔记第18天)
昨天开发的同事找到我说,生产有个job处理数据的速度很慢,想让我帮忙看看是怎么回事,最近碰到这种问题相对比较多了,但是问题的原因也是五花八门。我还是大体找他们了解了下情况,说有一个Job是处理文件传输的,但是从目前的运行情况来看,处理速度很慢,基本没什么进展,我向他们确认这几天是否有数据变更的操作,他们说没有。得到这个确认查看问题的方向就有明显的不同,我还是照例查看了一下数据库负载,锁情况。但是么有发现什么信息。 从数据库的负载来看,负载倒不高。 Snap IdSnap TimeSessionsCurs
jeanron100
2018/03/15
6360
优化一个rownum=1的sql
,t1.TemplateID AS templateId ,t1.parameter AS parameter
老虎刘
2022/06/22
6060
优化一个rownum=1的sql
【DB笔试面试865】序列cache值过小导致CPU利用率过高
有一套数据库做测试的时候,CPU利用率很高,同事已经抓取了CPU和AWR的信息。发生问题的时间段是19点到23点,其中,nmon数据截图如下所示:
AiDBA宝典
2020/08/27
1K0
【DB笔试面试865】序列cache值过小导致CPU利用率过高
SQL之美- 通过SQL MONITOR解读并优化SQL
编辑手记:SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能,从而为解决性能问题打下根基。 本系列经典文章 之一:标量子查询优化 之二
数据和云
2018/03/07
1.1K0
SQL之美- 通过SQL MONITOR解读并优化SQL
通过shell定制ash脚本(r3笔记第33天)
ash是在10g以来一个很有用的特性,能够作为awr的补充,对于排查一些历史的问题能够提供更加详细和针对性的数据。 当然个人在使用ash的时候感觉最慢的地方就是在于输入时间戳了,每次输入侧时候都得一边看着样例,一边按照格式,一份ash的报告,至少20%以上的时间耗在这个时间戳上了。 有时候想查看几个时间点的数据,如果精确到分钟,那么运行ashrpt.sql就得一次又一次的输入时间戳,虽然报告生成的速度还是很快,但是老是感觉手工劳动的部分太多,毕竟有很多的选项我们并不需要。 所以使用了如下的脚本来定制ash,
jeanron100
2018/03/14
1.2K0
什么是Oracle的高版本游标(High Version Count)?如何排查?(持续更新)
一个父游标下对应的子游标个数被称为Version Count,每个子游标对应一个执行计划。对于一个特定的游标有多少个版本(Version Count)就属于高版本游标是没有明确定义的。对于不同的系统有不同的数量界定。High Version Count不仅产生的原因是多种多样的,而且会导致各种令人头痛的问题,轻则导致数据库的性能急剧下降,CPU利用率剧增,重则导致数据库挂起,触发ORA-04031或者其它BUG导致宕机。
AiDBA宝典
2024/04/18
1.1K0
什么是Oracle的高版本游标(High Version Count)?如何排查?(持续更新)
JAVA中Sql时间格式与util时间格式转换
  pst.setDate(1, ;//这里的Date是sql中的::得到的是日期
瑾诺学长
2018/09/21
3.8K0
一次慢查询暴露的隐蔽的问题
最近解决了一个生产 SQL 慢查询的问题,排查问题之后发现一些比较隐匿且容易忽略的问题。
andyxh
2019/09/10
5980
一次慢查询暴露的隐蔽的问题
项目从 MySQL 切换 PostgreSQL,踩了太多的坑!!!
由于我们要连接新的数据库,理所当然的要引入该数据库的驱动包,这与mysql驱动包类似
良月柒
2024/07/17
1.7K0
项目从 MySQL 切换 PostgreSQL,踩了太多的坑!!!
Oracle必知的100道问题
100.sql>startup pfile和ifile,spfiled有什么区别?
IT小马哥
2020/03/17
3.7K0
Oracle 分区索引
    分区索引(或索引分区)主要是针对分区表而言的。随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引。分区索引的好处是显而易见的。就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现。同时把分区放在不同的表空间可以提高分区的可用性和可靠性。本文主要描述了分区索引的相关特性并给出演示示例。
Leshami
2018/08/13
1.9K0
资源下载丨Oracle优化工程师常用的34个脚本
墨墨导读:本文分享Oracle驻场工程师常用的脚本,基本上包含了日常监控、维护、故障定位及处理、SQL性能优化大部分场景,有了这些脚本会让你的工作变得更轻松,文末附下载链接。
数据和云
2021/03/09
7500
通过索引提升SQL性能案例一则
最近有个应用,前端调用后台的一个逻辑很慢,请开发提供了对应逻辑使用的SQL,进行脱敏,示例如下,
bisal
2021/03/23
3200
避免WHERE子句中使用函数的索引优化策略
在日常数据库性能调优中,开发者常遇到这样的场景:明明已经建立了索引,但查询性能却未达预期。通过EXPLAIN命令分析执行计划时,会看到"Using where; Using filesort"的提示,这意味着数据库引擎未能有效利用索引。这种现象往往与WHERE子句中函数的使用密切相关。
Jimaks
2025/06/05
1930
避免WHERE子句中使用函数的索引优化策略
【开发日记】Oracle 常用操作及解决方案
此表分区是两个案例,根据某个字段的值的大小范围进行分区或者根据时间范围进行分区
全栈开发日记
2023/09/25
3720
【开发日记】Oracle 常用操作及解决方案
Oracle常用语句
INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名;
泰斗贤若如
2019/06/19
3K0
代码中误用select xxx from dual案例一则
SELECT TO_CHAR(:B1 / (60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
老虎刘
2022/06/22
7350
代码中误用select xxx from dual案例一则
Oracle基础维护02-表、主键、索引、表结构维护手册
注:新建表及其索引属于哪个表空间根据项目自己的规划自行判断。实际网优项目中用户自定义的表空间都是DBS_D开头的是存放数据,DBS_I开头的是存放索引。
Alfred Zhao
2019/05/24
6130
推荐阅读
相关推荐
生产sql调优之统计信息分析(89天)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档