场景

  最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟

JOB执行流程分析

  首先,对于JOB流程进行分析,查看是否是JOB设计上的问题

  通过对流程的分析,发现每次获取的需要同步的数据最多只有一万条,不存在大数据写入导致超时的问题。

  那么在对获取详细信息这个过程进行分析,发现关联的表中最多的数据已经上亿了,可能是这里导致了整体SQL执行变慢的原因。这里能算可疑点一。

  再接着往下一个流程看与表B对比重复数据时,随着循环执行表B的数据会越来越多,那么会不会这里是导致循环执行下执行时间称线性增长的主要原因呢。

逐一排除问题

  之前我们通过分析JOB执行流程,发现了两个可疑点,那么现在具体分析SQL的问题

CREATE TABLE #TableTemp (
字段A int null,
字段B int null,
字段C int null
) INSERT INTO #TableTemp(
字段A,
字段B
)SELECT
a.字段A,
字段B
FROM ServerA.dbo.TableB a WITH(NOLOCK)
LEFT JOIN dbo.TableA b WITH(NOLOCK) a.Id = b.Id UPDATE a
SET a.字段C = b.字段D
FROM #TableTemp a
LEFT JOIN dbo.TableC b WITH(NOLOCK) ON a.字段A =b.id INSERT INTO dbo.目标TableA(
字段A,
字段B
)
SELECT
字段A,
字段B
FROM #TableTemp WITH(NOLOCK) INSERT INTO dbo.目标TableB(
字段A,
字段B,
字段C
)
SELECT DISTINCT
a.字段A,
a.字段B,
a.字段C
FROM #TableTemp a WITH(NOLOCK)
LEFT JOIN dbo.目标TableB b ON a.字段A = b.字段A AND a.字段B = b.字段B
WHERE a.PK IS NULL

  先来查看可疑点一,是不是这里出了问题。因为表TableC数据已经是几亿的量,但单独将该SQL执行发现,因为索引的存在发现执行并不是特别慢,所以可以排除掉该问题

  那么来看看可疑点二呢

INSERT INTO dbo.目标TableB(
字段A,
字段B,
字段C
)
SELECT DISTINCT
a.字段A,
a.字段B,
a.字段C
FROM #TableTemp a WITH(NOLOCK)
LEFT JOIN dbo.目标TableB b ON a.字段A = b.字段A AND a.字段B = b.字段B
WHERE a.PK IS NULL

   可以看到该SQL插入的同时还查询了自身是否存在条件下相同的数据,查看表目标TableB发现,该表没有主键也没有索引,再通过DBA那边提供的SQL分析发现,这句SQL对于dbo.目标TableB进行了全表扫描,再加上插入的1W条数据,相当于对于dbo.目标TableB全表扫描了1w次,随着循环的执行该表数据越来越多,执行时间也就越来越长,看来这里就是导致执行时间线性增长的主要原因了。

解决问题

  根据上面问题的排除,我们已经得知问题的关键所在就是进行了1w次的全表扫描,导致了SQL执行时间过长,那么解决问题的关键所在就是避免这么多次的全表扫描。那么最直接的解决方法,就是建立索引避免全表扫描

  1.通过使用临时表代替表变量

    先来看看,表变量与临时表的区别,可以看到表变量是无法使用索引的,所以我们使用索引避免全表扫描的话必须要代替掉表变量,然后在临时表的字段A上我们创建索引

  2.修改目标TableB的写入逻辑

    现有写入逻辑会先判断是否在目标TableB中是否存在,不存在时则写入表中,保持业务的情况下,我们稍微修改下逻辑,再写入之前先排除掉与目标TableB中的数据,将剩余数据写入表中,就能避免循环1W次的目标TableB表查询了

  通过这两处修改后,再执行该JOB发现问题得到了完美的解决。

记一次,因表变量导致SQL执行效率变慢的更多相关文章

  1. 【转】导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  2. 导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  3. 在java.ext.dirs中使用环境变量导致crontab执行不成功的问题及解决

    在java.ext.dirs中使用环境变量导致crontab执行不成功的问题及解决 Table of Contents 1. java.ext.dirs的使用和环境变量 2. 问题:在crontab中 ...

  4. SQl 执行效率总结

    SQL执行效率总结 1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2 ...

  5. in和exists的区别与SQL执行效率

    in和exists的区别与SQL执行效率最近很多论坛又开始讨论in和exists的区别与SQL执行效率的问题,本文特整理一些in和exists的区别与SQL执行效率分析 SQL中in可以分为三类: 1 ...

  6. in和exists的区别与SQL执行效率分析

    可总结为:当子查询表比主查询表大时,用Exists:当子查询表比主查询表小时,用in SQL中in可以分为三类: 1.形如select * from t1 where f1 in ('a','b'), ...

  7. 巧用getdate()测试你的sql执行效率

    在开发项目的过程中,我们会遇到各种各样的问题,有时候由于业务逻辑复杂,我们写的sql语句会很长很长,甚至会嵌套很多层,这个时候我就会担心sql执行时间会不会太长了?会不会有什么问题导致执行效率变慢?经 ...

  8. hint不当索引,影响多表连接方式,最终导致SQL执行缓慢

    需求:一个SQL执行特别慢,无法返回结果,需要进行优化,最终返回结果即可. 一.SQL分析 二.尝试执行,观测执行计划 三.修改SQL 四.问题总结 一.SQL分析 )SQL文本,执行时间,执行用户 ...

  9. SQL执行效率总结

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

随机推荐

  1. Java基础系列(2)- Java开发环境搭建

    JDK下载与安装 安装JDK 1.百度搜素JDK8,找到下载地址 2.下载电脑对应的版本 3.双击安装JDK 4.记住安装的路径,可以自定义,默认路径如图 卸载JDK 删除Java安装目录 删除环境变 ...

  2. postgres 基础SQL语句 增删改

    查看已创建的数据库:select datname from pg_database; 查看所有数据库的详细信息:select * from pg_database 创建数据库:create datab ...

  3. php 常用算法与函数

    1.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  4. django 模版-标签-视图-csrf-token-模版继承-HTML过滤器

    """ ******模版****** --定义模版-- **变量** 视图传递给模版的数据 注意1:要遵守标识符规则 语法:{{var(即变量)}} 如果使用的变量不存在 ...

  5. 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02

    百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  6. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  7. 手动实现 shared_ptr

    面试写了一个基础的 scoped_ptr,被面试官要求写 shared_ptr,一时语塞.面试官不断提示我说在现有的基础上实现 shared_ptr 很简单,真的很简单,宛如在不断暗示我 1+1 就是 ...

  8. STAR-CCM+使用教程(开坑)

    前言: 之前在项目中经常使用STAR-CCM+做数值模拟,中间也陆陆续续折腾过许久,踩过一些坑.未来考虑转行,以后可能也会不再用到这CFD软件,所以正好趁这个机会在这做一个教程.记录下自己STAR-C ...

  9. Asp.Net Core 中的HTTP协议详解

    1.前言 好久没写博客了,最近虽然没什么假期,但是却比以前还忙!工作.工作.工作,就像赶集似的,聚在一起.对于Web开发人员来说,深入了解HTTP有助于我们开发出更好.更高的Web应用程序.当应用程序 ...

  10. 利用Jackson序列化实现数据脱敏

    几天前使用了Jackson对数据的自定义序列化.突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录. 核心思想是利用Jackson的StdSerializer,@JsonSerialize, ...