某日同事丢给我一个看上去复杂的查询(实际就涉及两张表,套来套去)说只是换了日期条件,但一个查询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. YSLOW法则中,为什么yahoo推荐用GET代替POST?
  2. Excel 2007 (Excel.Application) Workbooks.Add 出现内存不够的解决办法
  3. 生命真的源于宇宙吗?多名宇航员身体,都曾发生“不可逆”的变化
  4. R语言应用实战系列(四)-Apriori算法的相关内容(附案例源代码)
  5. 【Apache】 LXC 容器中重启 Apache 报错: Failed to set up mount namespacing: Permission denied
  6. c++:MFC _cstring.h库常用函数
  7. oracle oem 监控,DBA手记:OEM罪几何?-空间监控的性能问题
  8. 澳大利亚 计算机 博士,澳大利亚迪肯大学招收计算机博士
  9. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
  10. x264里的2pass指的是什么意思? x264源代码分析2.encode()
  11. 各个图标的意思_冬奥体育图标设计团队负责人林存真:每一个图标要画100稿以上...
  12. 软件测试msf模型,Visual Studio 2010 Ultimate中MSF过程模型的设计
  13. CFileDialog获取文件与文件夹路径
  14. 基于JAVA+SpringMVC+Mybatis+MYSQL的停车场管理系统
  15. java nginx 重启吗_Nginx的启动、停止、平滑重启
  16. VueTreeselect出现unknown解决方法
  17. 07-人脸识别-人脸矫正
  18. 读书笔记 | 财务会计理论(第7版 William R.Scott)(上)
  19. 监控系统-Prometheus(普罗米修斯)(三)Grafana可视化图形工具
  20. Android无法通过浏览器观看HLS直播的问题

热门文章

  1. mysql基本操作二
  2. element.onclick = fun与element onclick=fun()的区别
  3. Spring Boot 密码加密的 2 种姿势!
  4. 性能测试如何定位瓶颈?偶发超时?看高手如何快速排查问题
  5. 源码读不会,小白两行泪!
  6. 8 张图,看你是否理解 Java
  7. react如何通过shouldComponentUpdate来减少重复渲染
  8. Faas 和无服务器架构
  9. 看透 Spring MVC 源代码分析与实践 —— 俯视 Spring MVC
  10. 数据结构-树和二叉树01(定义、度、深度、有序树、森林)