某日同事丢给我一个看上去复杂的查询(实际就涉及两张表,套来套去)说只是换了日期条件,但一个查询5秒出数据,一个根本查不出来。现在整理下解决过程,及涉及的知识点。

  若有不正之处,请多多谅解并欢迎批评指正,不甚感激。

  请尊重作者劳动成果,转载请标明原文链接:

  http://www.cnblogs.com/zzry/p/5857751.html

一.问题描述


环境:sqlserver 2008r2

现象:

查询涉及到两张表

ODS_TABLE_A     每日数据700万现在总计60多亿。   已建立索引+分区

MID_TABLE_B      每日数据20万 总计3000万。         已建立索引未分区

当etldate为 '2016-08-12' 及以前的时间时,本查询5秒出数据,

当etldate为 '2016-08-16' 及以后的时间时,本查询出不来数据。

贴上问题sql:做过数据字段处理,针对本篇主题注意点放在查询因为日期的选择不同导致查询时间变的超级慢,而不是改变sql写法比如用临时表,强制索引上。

----------《代码开始》

select COUNT(distinct(case when COL_USERID3 is null then COL_USERID6 end)) as 'aa',COUNT(distinct(case when COL_USERID3 is null and COL_USERID7 is not null then COL_USERID6 end)) as 'bb',COUNT(distinct(case when COL_USERID3 is not null then COL_USERID6 end)) as 'cc',COUNT(distinct(case when COL_USERID3 is not null and COL_USERID7 is not null then COL_USERID6 end)) as 'dd',SUM(case when COL_USERID3 IS not null then ee end) as 'ee'from(select c.COL_USERID3,c.ee,g.COL_USERID6from(select  b.COL_USERID2 as COL_USERID3,COUNT(b.COL_USERID2) as eefrom(select COL_USERID as COL_USERID1,min(EventTime) as time1from ODS_TABLE_A    where  EtlDate = '2016-08-12'and colid LIKE 'heihei%'group by COL_USERID)as ajoin(select COL_USERID as COL_USERID2,eventtime as time2from ODS_TABLE_A  where EtlDate = '2016-08-12'and ItemId = '1111111111101'and colid like 'haha-%'and colid not like 'haha-skill%'and colid not like 'haha-fine%')as b on a.COL_USERID1 = b.COL_USERID2 and  a.time1 > b.time2group by b.COL_USERID2)as cright join(select  DISTINCT d.COL_USERID4 as COL_USERID6from(        select distinct COL_USERID as COL_USERID4from MID_TABLE_B     where etldate = '2016-08-12' )as djoin(select COL_USERID AS COL_USERID5from ODS_TABLE_A  where  EtlDate = '2016-08-12'and colid LIKE 'heihei%')as f on d.COL_USERID4 = f.COL_USERID5)as gon c.COL_USERID3 = g.COL_USERID6)as ileft join
(select COL_USERID as COL_USERID7from MID_TABLE_Bwhere EtlDate = '2016-08-12' and IsTodayPay = '1')as hon i.COL_USERID6 = h.COL_USERID7

----------《代码结束》

二。解决过程


 1.先看了下上述代码的执行计划如下图初看上去需要用索引的地方都用到了。应该没啥大问题。

可能你注意到系统提示的缺少索引信息,加上去一样效果,不能解决‘2016-08-16’ 查询慢的问题。

2.在修改下日期 ,就是把 【所有】  etldate=‘2016-08-12’  的改成  etldate=‘2016-08-16’
看下执行计划:
对不起跑了半个小时没出来,查看估计的执行执行和上面的图类似。
减少涉及到数据集的量 加top 1 我再看执行计划:
不贴图了 结果就是比上面的图少了个 【并行度】
初步以为是优化器因为估计行数等不准的原因没选择并行度,赶紧找代码让它强行这样走。
找到一篇宋大师的:强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
http://www.cnblogs.com/CareySon/p/3851113.html
二话不说加关键字
OPTION(querytraceon 8649)
可是应用到实际发现查询效率无任何改善,久久不出结果。后来问宋大师(感谢宋大神)。他说有些操作是没法并行的,更新统计信息试试先。
一击命中!一击命中!一击命中!
执行如下代码:
update STATISTICS ODS_TABLE_A  --(把ODS_TABLE_A  这个大表统计信息更新)
 
默认情况下,查询优化器已根据需要更新统计信息以改进查询计划;但在某些情况下,你可以通过使用 UPDATE STATISTICS 或存储过程 sp_updatestats 来比默认更新更频繁地更新统计信息,提高查询性能。针对文中此种情况新插入的数据没统计信息,大表自动更新统计信息触发自动更新机制频率不够,最好定期更新。
关于update STATISTICS 就不累述了 :给出相关技术贴连接
更新统计相关知识点传送门:https://msdn.microsoft.com/zh-cn/library/ms187348.aspx
至此问题解决。

三。总结


  对于大表新插入的数据没及时更新统计信息,导致出现上面文中的现象,一个日期导致查询效率天壤之别的分水岭(查12号前5秒出数据,查12号后死活不出来。)

解决办法是大表自动更新统计信息触发自动更新机制频率不够,定期更新。

转载于:https://www.cnblogs.com/firstdream/p/7932265.html

SQL调优--记一次表统计信息未及时更新导致查询超级慢相关推荐

  1. 数据库性能调优之始: analyze统计信息

    摘要:本文简单介绍一下什么是统计信息.统计信息记录了什么.为什么要收集统计信息.怎么收集统计信息以及什么时候收集统计信息. 1 WHY:为什么需要统计信息 1.1 query执行流程 下图描述了Gau ...

  2. 统计信息自动更新导致查询超时

    数据库有个大的接口日志表InterfaceRecord,表中有XML字段保存了接口报文,每个月新增6000多万的数据(大约300多GB),数据库有个JOB每周日晚上定时把表中1个月前的数据归档到历史库 ...

  3. mysql报表统计 优化_关于SQL调优与报表的性能优化

    前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...

  4. 更新SQL Server实例所有数据库表统计信息

    引出问题 自从上次菜鸟为老鸟解决了<RDS SQL SERVER 解决中文乱码问题>问题,老鸟意犹未尽,决定再想个招来刁难刁难菜鸟:"我最近做T-SQL性能调优的时候,经常发现执 ...

  5. SQL调优与报表的性能优化

    原文链接:https://www.iteye.com/blog/shensy-1664549   作者:shensy 一.SQL调优: 1.提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到 ...

  6. Mysql排序添加名词_记面试中问到的MySQL的SQL调优问题

    目录 1.场景还原 2.名词解释 3.实践情况 4.个人观点 5.引申问题 1.场景还原 面试官:小伙子,听说你会SQL调优,那我这里有一条SQL,你来帮我调优一下.SQL如下: SELECT * F ...

  7. oracle避免回表,请教大家: 经常在sql调优过程中提到避免“回表”,具体是指什么意思???3Q...

    你的位置: 问答吧 -> Oracle -> 问题详情 请教大家: 经常在sql调优过程中提到避免"回表",具体是指什么意思???3Q 如题,不甚感激!!!! [ 本帖 ...

  8. 记面试中问到的MySQL的SQL调优问题

    目录 1.场景还原 2.名词解释 3.实践情况 4.个人观点 5.引申问题 1.场景还原 面试官:小伙子,听说你会SQL调优,那我这里有一条SQL,你来帮我调优一下.SQL如下: SELECT * F ...

  9. oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描

    2017年8月14日,一地市oracle相关的调度程序ETL抽取速度奇慢,sql语句每次执行平均时间要9秒左右,如果所示: 该调度过程涉及的sql语句如下: select count(*) from ...

最新文章

  1. A股暴跌,户均亏2万!刚写好的辞职信又撕了……
  2. linux怎么修改grub引导顺序,我如何更改GRUB引导顺序?
  3. HDU_1075 What Are You Talking About(Trie 树)
  4. Java对二叉树的操作
  5. Spring Boot笔记-JPA中自定义@Query分页查询
  6. 远离复杂公式推导,直接解决共线性
  7. 异常详细信息: System.UnauthorizedAccessException: 对路径“”的访问被拒绝。
  8. 厦大计算机学院2018夏令营6,2018年厦门大学建筑与土木工程学院保研夏令营通知...
  9. hive sql 添加字段以及修改字段
  10. sobol灵敏度分析matlab_灵敏度分析 使用MATLAB编写
  11. 有软件测试台式电脑电源供电不足吗,电脑主机等电源供电不足的症状
  12. 多帧点云数据拼接合并_点云拼接
  13. ALS算法介绍(协同过滤算法介绍)
  14. java 代码块 构造函数_Java学习笔记之------构造函数,静态关键字,静态代码块,构造代...
  15. 个人miniblog被迫备份至此
  16. gps网络对时Linux,gps网络时间对时服务器的功能简介
  17. 服务器租用哪家的机房好
  18. 【Shader】实验06——后处理实现色散效果
  19. HTTP/3: 性能改进(第2部分)
  20. R语言实现向量自回归VAR模型

热门文章

  1. 打造智慧城市 让市场成为主角
  2. SQL注入攻击的种类和防范手段
  3. overload和override的区别
  4. android下拉刷新和上拉加载的一个简单库
  5. 让fedora18桌面显示图标
  6. 一条简单的 SQL 执行超过1000ms,纳尼?
  7. 源代码遭泄露,大疆员工被罚20万,判刑半年。
  8. 我的编码习惯 —— API 接口定义
  9. Java 自定义 ClassLoader 实现 JVM 类加载
  10. redis缓存策略小结