iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle性能优化(项目中的一个sql优化的简单记录)
  • 126
分享到

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

摘要

在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性。其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了。本文主要记录在实际项目中,一个需要查询很慢的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来说决定是零压力的。

 

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

 

您可能感兴趣的文档:

--结束END--

本文标题: oracle性能优化(项目中的一个sql优化的简单记录)

本文链接: https://www.lsjlt.com/news/2788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 一次vue项目优化的实际操作记录
    目录前言一、CDN引入二、gzip压缩三、路由懒加载,这种最简单的了就不多说了四、打包不生成map文件五、router上面使用props传参数,导致页面加载时间很长总结前言 项目前端...
    99+
    2024-04-02
  • 10种简单的Java性能优化
    最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网域?或者说如何确保全网域?扩展的不同方面全网域被炒作的最多的是扩展负载(Scaling load),...
    99+
    2023-05-30
    java 性能优化 ava
  • MySQL中的SQL优化实战记录
    这篇文章主要介绍“MySQL中的SQL优化实战记录”,在日常操作中,相信很多人在MySQL中的SQL优化实战记录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中的S...
    99+
    2024-04-02
  • Vue2.x 项目性能优化之代码优化的实现
    目录1 v-if 和 v-show 的使用 2 computed 和 watch 区分使用 3 v-for 遍历必须为 item 添加 key,且避免同时使用 v-if 4 纯显示长...
    99+
    2024-04-02
  • 如何解析MySQL性能优化中的SQL优化
    如何解析MySQL性能优化中的SQL优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注:以 MySQL 为背景,很多内容同时适用于其他关系型...
    99+
    2024-04-02
  • vue项目中一定会用到的性能优化技巧
    目录引言性能优化标准Lighthouse通用常规优化手段通用性能优化分析FCP(First Contentful Paint)LCP(Largest Contentful Paint...
    99+
    2024-04-02
  • SQL性能优化的示例
    小编给大家分享一下SQL性能优化的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL性能优化1、SELECT 语句...
    99+
    2024-04-02
  • 优化SQL SELECT语句性能的6个简单技巧分别是什么
    本篇文章给大家分享的是有关优化SQL SELECT语句性能的6个简单技巧分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SELECT语...
    99+
    2024-04-02
  • Vue项目性能优化的方法教程
    本篇内容主要讲解“Vue项目性能优化的方法教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目性能优化的方法教程”吧!一、代码层面的优化1.1、v-if...
    99+
    2024-04-02
  • vue项目打包优化的方法实战记录
    目录1.按需加载第三方库2.移除console.log3. Close SourceMap4. Externals && CDN5.路由懒加载的方式总结1.按需加载第...
    99+
    2024-04-02
  • Oracle SQL性能优化的方法有哪些
    本篇内容主要讲解“Oracle SQL性能优化的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle SQL性能优化的方法有哪些”吧!1. SQ...
    99+
    2024-04-02
  • 优化Go项目中的SQL查询操作
    一分耕耘,一分收获!既然打开了这篇文章《优化Go项目中的SQL查询操作》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新...
    99+
    2024-04-04
  • Bash 编程:如何优化 Laravel 项目的性能?
    Laravel 是一款流行的 PHP 开发框架,它在开发速度和易用性方面表现出色。但是在实际应用中,由于某些因素的影响,Laravel 的性能可能会受到影响。本文将介绍如何使用 Bash 编程来优化 Laravel 项目的性能。 使用 ...
    99+
    2023-08-02
    学习笔记 laravel bash
  • SQL拼接中的性能如何优化
    SQL拼接会影响查询性能,特别是在处理大量数据时。以下是一些优化SQL拼接性能的方法: 使用参数化查询:参数化查询可以避免SQL...
    99+
    2024-04-29
    SQL
  • 如何理解SQL Server SQL性能优化中的参数化
    如何理解SQL Server SQL性能优化中的参数化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库参数化的模式数据库的...
    99+
    2024-04-02
  • 优化MySQL数据库性能的十个参数简单介绍
    这篇文章主要介绍“优化MySQL数据库性能的十个参数简单介绍”,在日常操作中,相信很多人在优化MySQL数据库性能的十个参数简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 如何在 Django 项目中优化 Go 函数的性能?
    Django 是一个使用 Python 编写的 Web 框架,而 Go 是一种高性能的编程语言,两者可以很好地结合起来提高项目的性能。在 Django 项目中使用 Go 函数进行性能优化是一个不错的选择,本文将介绍如何在 Django 项目...
    99+
    2023-07-09
    函数 linux django
  • SQL Server查询优化中的两个选项
    本文中,我们将介绍两个SQL Server中的可用概念,它们是使用SQL Server时值得注意的技术。 1.       &nbs...
    99+
    2024-04-02
  • 性能优化指南:性能优化的一般性原则与方法
    【本文转自博客园 作者:xybaby 原文链接:https://www.cnblogs.com/xybaby/p/9055734.html】作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应...
    99+
    2023-06-05
  • 对MySQL性能优化的简单办法是怎样的
    对MySQL性能优化的简单办法是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 对拥有一个几十万行表的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作