我的编程空间,编程开发者的网络收藏夹
学习永远不晚

oracle性能优化(项目中的一个sql优化的简单记录)

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

oracle性能优化(项目中的一个sql优化的简单记录)

在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性。其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了。本文主要记录在实际项目中,一个需要查询很慢的sql的优化过程,如果有更好的方案,请在下面留言交流。

很多文章都有关于sql优化的方法,这里就不一一陈述了。如果有需要可以查看博客:https://blog.csdn.net/linhaiyun_ytdx/article/details/79101122

 

SELECT T.YHBH,
       (SELECT NAME FROM DIM_REGION WHERE CODE = SUBSTR(T.GDDWBM, 0, 4)) GDDWMC,
       (SELECT NAME FROM DIM_REGION WHERE CODE = T.GDDWBM) FJMC,
       T.DFNY,
       T.YHMC,
       T.YDDZ,
       (SELECT NAME FROM DIM_ELECTRICITY_TYPE WHERE CODE = T.YHLBDM) YDLBMC
  FROM (SELECT DISTINCT T.YHBH,
                        DECODE(T.GDDWBM,
                               NULL,
                               "0000",
                               DECODE(T.GDDWBM, "09", "0000", T.GDDWBM)) AS GDDWBM,
                        T.BBNY AS DFNY,
                        T.YHLBDM AS YHLBDM,
                        T.YHMC,
                        T2.YDDZ
          FROM V_TEMP_TABLE_JHCBHSTJ_HISTORY T, TMP_KH_YDKH T2
         WHERE T.YHBH = T2.YHBH(+)
           AND NOT EXISTS (SELECT 1
                  FROM DJHJSL_LSB_FZ_HISTORY B
                 WHERE B.BBNY = T.BBNY
                   AND B.YHBH = T.YHBH
                   AND B.GDDWBM = T.GDDWBM
                   AND B.YHLBDM = T.YHLBDM
                   AND B.ZDCBZHS <> "0")
) T 
WHERE SUBSTR(T.GDDWBM, 0, 4) = "0946" 
  AND T.DFNY = "201911"

这个是我的sql脚本。其实这个脚本一点都不复杂。其中V_TEMP_TABLE_JHCBHSTJ_HISTORYDJHJSL_LSB_FZ_HISTORY每个月增加330万,目前有1960多万, TMP_KH_YDKH表有330多万。DIM_REGION DIM_ELECTRICITY_TYPE 是两个数据字典项表。

在没有索引的情况下,这个脚本执行需要30s,看到执行过程,现在都是全表扫描的。接下来开始优化。

1.修改脚本的查询,将外层的查询条件放到里面,减少数据量。

SELECT T.YHBH,
       (SELECT NAME FROM DIM_REGION WHERE CODE = SUBSTR(T.GDDWBM, 0, 4)) GDDWMC,
       (SELECT NAME FROM DIM_REGION WHERE CODE = T.GDDWBM) FJMC,
       T.DFNY,
       T.YHMC,
       T.YDDZ,
       (SELECT NAME FROM DIM_ELECTRICITY_TYPE WHERE CODE = T.YHLBDM) YDLBMC
  FROM (SELECT DISTINCT T.YHBH,
                        DECODE(T.GDDWBM,
                               NULL,
                               "0000",
                               DECODE(T.GDDWBM, "09", "0000", T.GDDWBM)) AS GDDWBM,
                        T.BBNY AS DFNY,
                        T.YHLBDM AS YHLBDM,
                        T.YHMC,
                        T2.YDDZ
          FROM V_TEMP_TABLE_JHCBHSTJ_HISTORY T, TMP_KH_YDKH T2
         WHERE T.YHBH = T2.YHBH(+)
           AND NOT EXISTS (SELECT 1
                  FROM DJHJSL_LSB_FZ_HISTORY B
                 WHERE B.BBNY = T.BBNY
                   AND B.YHBH = T.YHBH
                   AND B.GDDWBM = T.GDDWBM
                   AND B.YHLBDM = T.YHLBDM
                   AND B.ZDCBZHS <> "0")
            AND SUBSTR(T.GDDWBM, 0, 4) = "0946" 
            AND T.BBNY = "201911"
) T 

2.对三个表都建上索引

V_TEMP_TABLE_JHCBHSTJ_HISTORY根据DFNYSUBSTR(T.GDDWBM, 0, 4)建上联合索引。

CREATE INDEX IDX_TMP_JHCBHSTJ_HISTORY_UNION ON V_TEMP_TABLE_JHCBHSTJ_HISTORY(BBNY,SUBSTR(GDDWBM, 0, 4));

TMP_KH_YDKH表,使用了关联,所以需要对yhbh建个索引

create index IDX_YHBH_KH on TMP_KH_YDKH (YHBH);

对于DJHJSL_LSB_FZ_HISTORY表,在not EXISTS里面,会全表扫描这个表,现在对他建立联合索引试试。

CREATE INDEX IDX_DJHJSL_FZ_HISTORY_UNION ON V_TEMP_TABLE_JHCBHSTJ_HISTORY(BBNY,YHBH,GDDWBM,YHLBDM);

查看oracle的执行计划,建立联合索引,并没有让这个表走索引,还是在全表扫描的,但是查询已经提升到9s了。

接下来对分别对这四个字段建立索引:

create index IDX_DJHJSL_FZ_HISTORY_BBNY on DJHJSL_LSB_FZ_HISTORY (BBNY);
create index IDX_DJHJSL_FZ_HISTORY_YHBH on DJHJSL_LSB_FZ_HISTORY (YHBH);
create index IDX_DJHJSL_FZ_HISTORY_GDDWBM on DJHJSL_LSB_FZ_HISTORY (GDDWBM);
create index IDX_DJHJSL_FZ_HISTORY_YHLBDM on DJHJSL_LSB_FZ_HISTORY (YHLBDM);

 从执行计划来看,oracle只走了IDX_DJHJSL_FZ_HISTORY_BBNY这个索引,现在最快已经到1.95s了。

虽然现在已经满足了查询3s内的要求,但是考虑到以后,每个月的数据增长,数据量有5000万,一亿这样的大数据量的时候还是会很慢。

其实我在正式环境测试的时候,NOT EXISTS 里面的这个表,建立单个索引是没有用的,建立联合索引才会使这个表走索引,可能是因为电脑的cpu不同等因素影响的。

 

上面的优化方法当然不能满足项目的需求,接下来结合业务进行优化。作为一个监控系统,数据是T+1的,不需要追求实时性,这些数据,都是使用etl抽取工具每天定时抽取的。而且每个月300万数据,用户只关注的只有几千条。所以结合业务,我们在使用etl抽取完数据后,将用户关注的数据插入到另一张表中,这样,每个月只有几千条数据,这样的话,一年也才几万条数据,对oracle来说决定是零压力的。

 

如果大家还有其他的方式优化,请在下方留言交流。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

oracle性能优化(项目中的一个sql优化的简单记录)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle性能优化(项目中的一个sql优化的简单记录)

在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性。其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了。本文主要记录在实际项目中,一个需要查询很慢的sql的优化过程,如果有更好的方案,请在下面留
oracle性能优化(项目中的一个sql优化的简单记录)
2015-11-21

CSS 性能优化的五个简单步骤

一个经常被忽视的网站性能瓶颈发生在处理级联样式表和随后在网页的文档对象模型中应用 CSS 选择器。

记录一个超长sql的优化,从4s到0.0015s SELECT

废话不多说,直入正题,先来看看我所说的超长sql:SELECTmy.id,my.date,my.business_date AS businessDate,my.CODE,my.customer_id AS customerId,cc.NAME AS cust
记录一个超长sql的优化,从4s到0.0015s SELECT
2020-07-14

Spring Boot 项目中的性能优化技巧

在开发Spring Boot应用时,性能优化是一个至关重要的环节。本文将探讨Spring Boot项目中的性能优化技巧,并提供相应的例子代码。
数据库Spring2024-11-29

优化 C# 项目中的 Excel 导出性能

本文将详细探讨如何优化 C# 项目中的 Excel 导出性能,包括数据库查询优化、数据处理优化、Excel 库的选择、异步处理、分页导出等多个方面,并提供具体的示例代码。
C#Excel开发2024-11-29

一个提升本地索引性能的 SQL 优化案例

SQL 无法做分区裁剪时,使用了高效的唯一索引,当索引是全局索引时效率最高;当索引是本地索引时,需要访问所有的索引分区,性能会下降。
SQL优化索引2024-11-30

SQL优化很难怎么办?给你一个简单暴力的办法

今天给大家带来一个比较简单SQL优化案例,来分析一下开发人员经常感到不解一个问题——视图合并导致的SQL变慢 例如: 一个运维人员(这里的运维指的是,在现有的系统上,进行稍微修改) 因为业务上的改变,在原有的SQL上添加了一个条件,结果原来运行很快的SQL有可
SQL优化很难怎么办?给你一个简单暴力的办法
2022-04-27

VUE Nuxt.js中间件性能优化指南:如何提升你的项目性能

VUE Nuxt.js中间件是实现项目性能的关键,遵循优化指南可显著提高项目性能,本文深入分析了中间件性能的优化策略,并提供详细的演示代码,帮助开发者轻松提升项目性能。
VUE Nuxt.js中间件性能优化指南:如何提升你的项目性能
2024-02-04

MySQL性能优化之一条SQL在MySQL中执行的过程详解

天天和数据库打交道,一天能写上几十条SQL语句,但你知道系统是如何和数据库交互的吗?下面这篇文章主要给大家介绍了关于MySQL性能优化之一条SQL在MySQL中执行的过程的相关资料,需要的朋友可以参考下
2023-02-02

ORPO偏好优化:性能和DPO一样好并且更简单的对齐方法

现在有许多方法可以使大型语言模型(LLM)与人类偏好保持一致。以人类反馈为基础的强化学习(RLHF)是最早的方法之一,并促成了ChatGPT的诞生,但RLHF的成本非常高。与RLHF相比,DPO、IPO和KTO的成本明显更低,因为它们不需要

性能优化中的拆分与合并:你一定想不到这两个操作竟然可以这样玩

随着科技的发展,高性能计算已经成为了许多行业的关键需求。无论是游戏、金融、医疗还是其他领域,高性能计算都扮演着举足轻重的角色。然而,实现高性能并非易事。为了满足用户对速度和效率的需求,我们需要不断地进行性能优化。在这篇文章中,我们将为您介绍

如何在MySQL中设计一个性能优化的会计系统表结构以提高查询和报表生成速度?

如何在MySQL中设计一个性能优化的会计系统表结构以提高查询和报表生成速度?在现代企业的会计系统中,数据量庞大且复杂,频繁的查询和报表生成是常见的需求。为了提高系统的性能和响应速度,设计一个优化的数据库表结构是至关重要的。规范化数据库表结构
如何在MySQL中设计一个性能优化的会计系统表结构以提高查询和报表生成速度?
2023-10-31

编程热搜

目录