走在专家的路上,每天一条SQL优化(3)

本系列分享的SQL优化实例,并不一定适用于所有相似SQL或所有场景。我们只是介绍一种方法,当你再次遇到类似SQL,可以根据真实场景,选择最适合的方案。另外,有疑问的时候,最好的办法就是测试,动手才能找到最佳答案!

SQL文本如下:


SELECT NVL(SUM(SRE), 0) HRJE
  FROM MD3U.CARD_INCOME A
 WHERE YLGRZHH = '371081110630214389'
   AND DDQCSRH IS NULL
   AND ZDLSH IS NOT NULL
   AND NVL(CGBZ, '0') = '1'
   AND NOTEXISTS (SELECT 'x'
         FROM MD3U.BILL_MID B
        WHERE B.ZDLSH = A.ZDLSH
          AND B.DM = 'hbry'
          AND B.C = '2')
   AND NOTEXISTS (SELECT 'x'
         FROM MD3U.BILL_MID C
        WHERE C.ZDLSH = A.ZDLSH
          AND C.DM = 'hrzh'
          AND C.C = '2');

执行计划如下:

SQL统计信息如下:

索引相关信息如下:

从上面可以看到,该SQL的总执行时间为111,452,436毫秒(ms)大概30.95小时(h),总执行次数为295,420次,平均一天执行26856次,从而可以判定也是一个使用非常频繁的SQL查询。因为执行次数比较多,所以总时间也非常大,但是单次执行时间并不是很长,只有大概0.37秒(s)。这个SQL还可以进行优化。

优化前,文本执行后的执行计划:

建议创建索引的SQL如下:


CREATE INDEX MD3U.idx_KC20_01 ON MD3U.KC20(AAE072,BKE021,BKE004) ONLINE;
CREATE INDEX  MD3u.idx_KZ03_01 ON
MD3U.KZ03(AAZ905,BKE163) GLOBAL ONLINE  ;

创建索引后,文本执行后的执行计划:

可以看到优化后,执行时间从原来的0.01秒(s)变为0.01秒(s),逻辑读从原来的82变为17,执行时间上性能没有提高,但是逻辑读减少大概4.8多倍。

原文发布时间为:2017-09-27
作者: 云和恩墨
本文来自合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

时间: 2024-09-16 01:22:50

走在专家的路上,每天一条SQL优化(3)的相关文章

走在专家的路上,每天一条SQL优化(2)

每天坚持进步一点点,让优秀成为一种习惯. SQL文本如下: INSERT INTO BPZONE.EI_ADDITION (EID,ROOTPIID, ANCESTOREID, CREATETIME) SELECT E.ID_, E.PROC_INST_ID_, '.' || E.ID_ || '.' ANCESTOREID, SYSDATE FROM ACTIVITI.ACT_RU_EXECUTION E WHERE E.ID_ = E.PROC_INST_ID_ AND E.PARENT_I

走在专家的路上,每天优化一条SQL

本文讲的走在专家的路上,每天优化一条SQL,为了让大家更好地理解索引的常见和使用,我们拣选了工程师在客户现场做的一些真实的SQL优化,基于真实的业务场景,与大家分享. 每天一条SQL优化,帮你走在专家的路上. SQL文本: SELECT 'x' FROM MD3U.CARD_INFO A, MD3U.PERSON_INFO B WHERE GBRQ IS NULL AND NVL(KZT, '0') <> '0' AND FFDSX = 'F' AND A.RYID = B.RYID AND

[20170104]一条sql优化.txt

[20170104]一条sql优化.txt --生产系统不明原因重启,看了1下,顺便看了前后的awr报表,发现一条语句,其实问题没什么,只不过这种现象在开发很普遍,做一点点记录. 1.环境: xxxxxx> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -----------------------------------

MySQL数据库21条最佳性能优化经验_Mysql

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被M

见微知著:一条 SQL 性能问题引发的核心系统悲剧

黄廷忠(网名:认真就输) 云和恩墨技术专家 个人博客:http://www.htz.pw/ 本篇整理内容是黄廷忠在"云和恩墨大讲堂"微信分享中的讲解案例,SQL 优化及 SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习 SQL 开发技能,从而为解决性能问题打下根基. 第一篇为:性能为王:SQL标量子查询的优化案例分析 第二篇为:SQL审核:OR展开与子查询优化案例详解 本篇为系列案例之三:IN子查询返回结果集很小 这是不久前在一个客户现场遇到的

Power9问世又怎样,一条SQL就把最牛小型机搞瘫了(有彩蛋)

  看惯了各种深入原理.细致入微的分析,今天写一个简单.轻松的话题,但愿不会耽误你的时间.好吧,标题是有点夸张,放心,这不是一个标题党就完事的文章,毕竟我还希望你能持续看我的后续文章呢. ◆  ◆  ◆  ◆  ◆      说到史上最强的小型机,我想,应该是IBM Power880了吧:     不用想,读者诸君,虽然POWER9的芯片本月已经发布了,但Power880你肯定还没有用过,因为在国内暂时还没有上架呢.   今天我说的是上面这孩子的叔叔,Power780,用的是POWER7的CPU

[20151209]一条sql语句的优化(续).txt

[20151209]一条sql语句的优化(续).txt http://blog.itpub.net/267265/viewspace-1852195/ --上次提到其中1条sql语句: 1.环境: SYSTEM@192.168.99.105:1521/dbcn> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------

[20130319]一条sql语句的优化.txt

[20130319]一条sql语句的优化.txt 生产系统,遇到这样一条语句:SELECT MAX (LENGTH (pe_id)) FROM pe_master_index WHERE SUBSTR (pe_id, 1, 2) = 'TJ'; --真不知道开发人员如何想的,写出这样的语句.字段pe_id是主键.--数据库版本 SQL> select * from v$version where rownum BANNER                                     

一条sql语句的建议调优分析

前几天开发的同事问我一个sql的问题,目前在测试环境中发现这条sql语句执行时间很长,希望我们能够给一些建议,能够尽快做一些改进.sql语句类似下面的形式.SELECT /*+ INDEX(ACCOUNT,ACCOUNT_PK)INDEX(ACCOUNT_EXT ACCOUNT_EXT_PK) */ ACCOUNT.ACCOUNT_ID, ACCOUNT.BE, ACCOUNT.CUSTOMER_NO, ACCOUNT.AR_BALANCE, ACCOUNT_EXT.CYCLE_CODE, AC