前段时间遇到很多例统计信息更新不及时导致执行计划较差引发性能问题的情况,现在总结分析下,与各位分享。

问题描述:

订单表用于存放用户订单信息,其中有字段DT存放订单的创建时间,PID存放用户编号,根据业务需求,我们分别创建在列DT上索引IDX_DT,在PID上创建索引IDX_PID,我们通常会在业务低峰期进行索引维护和统计更新,在双11期间,订单暴增而统计信息没有得到及时更新,部分查询选用了不合适的索引,导致性能较差。

问题演示:

首先我们生成100W的数据,并将统计更新到最新。

DROP TABLE TB001
GO
CREATE TABLE TB001
(ID INT IDENTITY(1,1) PRIMARY KEY,PID INT DEFAULT 0,DT DATETIME DEFAULT GETDATE(),CT CHAR(500) DEFAULT '0'
)
GO
--导入100W数据
INSERT INTO TB001(CT)
SELECT TOP(20000) T2.name FROM sys.all_columns T2
CROSS JOIN sys.all_objects T1
GO 50
--更新DT字段
UPDATE TB001
SET DT=DATEADD(MINUTE,ID,GETDATE()),PID=ID%100000
GO--创建索引
CREATE INDEX IDX_PID
ON TB001(PID)CREATE INDEX IDX_DT
ON TB001(DT)
GO

查看PID上统计信息

DBCC SHOW_STATISTICS('TB001','IDX_PID')

查看DT上的统计信息

DBCC SHOW_STATISTICS('TB001','IDX_DT')

然后模拟新增15W数据,新增的数据的创建时间均大于统计生成的时间。

INSERT INTO TB001(PID,DT,CT)
SELECT
RID%100000,
DATEADD(MINUTE,1000000+RID,GETDATE()),
name
FROM(
SELECT
ROW_NUMBER()OVER(ORDER BY name) AS RID,
name
FROM (SELECT TOP(150000) T2.name FROM sys.all_columns T2CROSS JOIN sys.all_objects T1
) AS T3
) AS T4

查看最后5w订单的时间

SELECT MAX(DT) AS MAX_DT,
MIN(DT) AS MIN_DT
FROM
(
SELECT TOP(50000) *
FROM TB001
ORDER BY id DESC
) AS T1

虽然在订单表中新增了15W订单呢,但是这15万订单被平均分摊,每个用户只新增1.5个订单,每个用户平均有11.5个订单,因此如果要查询2016-09-29 14:39:52.973到2016-11-03 07:58:52.973期间某个用户的订单的话,走IDX_PID会是最佳选择,但执行计划选择了IDX_DT的索引。

--表 'TB001'。扫描计数 1,逻辑读取 150109 次,物理读取 0 次,预读 0 次,
--lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SELECT * FROM TB001
WHERE DT>'2017-01-11 19:03:46.460'
AND DT<'2017-02-15 12:22:46.460'
AND PID=10

如果我们强制执行计划走索引:

--表 'TB001'。扫描计数 1,逻辑读取 324 次,物理读取 0 次,预读 0 次,
--lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SELECT * FROM TB001 WITH(INDEX=IDX_PID)
WHERE DT>'2017-01-11 19:03:46.460'
AND DT<'2017-02-15 12:22:46.460'
AND PID=10

或修改查询,避免使用索引IDX_DT:

--表 'TB001'。扫描计数 1,逻辑读取 324 次,物理读取 0 次,预读 0 次,
--lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SELECT * FROM TB001 WITH(INDEX=IDX_PID)
WHERE DT+0>'2017-01-11 19:03:46.460'
AND DT+0<'2017-02-15 12:22:46.460'
AND PID=10

--=====================================================================

在SQL SERVER 2014之前版本中,对于超出统计信息范围的参数,基数评估认为其不存在,评估行数为1。在Demo中,由于DT的两个参数均不在统计信息IDX_DT的直方图范围内,认为满足DT条件的数据为1,因此认定为使用IDX_DT索引为最优。

此类问题针对的是递增类型的数据,如自增ID,创建时间,货物批号等,随着时间推移,新增的数据总是超出统计信息的范围,当查询这些新增数据并且执行计划重新生成时,就可能导致执行计划出现问题,这也是我们常说的“统计信息未及时更新导致执行计划问题”。

--=====================================================================

解决办法:

1. 对递增类数据提高统计的更新频率(更新频率过快也是问题啊)

2. 升级到2014版本(在CdinalityEstimationModeVersion=120下,会采用新的预估算法,不过谁无事玩升级啊)

3. 使用查询提示强制使用索引(是个办法,一般也不这么玩)

4. 修改SQL(我目前采用的办法,使查询无法使用索引IDX_DT)

--====================================================================

很早拜读过群里一位大神Fanr_Zh的博客《SQL Server 2014新特性——基数评估(白皮书阅读笔记)》,感悟颇多,结合最近遇到的一些性能问题,弄个Demo与各位看官一起学习下!再次拜谢下Fanr。

--====================================================================

转载于:https://www.cnblogs.com/TeyGao/p/4154803.html

杂谈--从基数评估来看问题1相关推荐

  1. SQL Server 2014新特性——基数评估(白皮书阅读笔记)

    基数评估 目录 基数评估 说明 基数评估准确的重要性 模型假设 启用新的基数评估 验证基数评估的版本 在迁移到新的基数评估前要测试 校验基数评估 偏差问题 需要手动处理的变化 避免因为新的CE造成性能 ...

  2. 沈阳市政府 第三方社会评估总体报告

            沈阳市政府 第三方社会评估总体报告         沈阳通和明市场研究有限公司 二零壹八年一月 一.   背景与目的 为贯彻科学发展观,完成"两个不低于"任务,实现 ...

  3. 音频转换器评估:将音乐文件转换成MP3格式的最佳工具

    音频转换器是一种非常有用的工具,可以将音乐文件转换为不同的格式,例如MP3.有许多音频转换器可供选择,但是要选择最佳的工具需要考虑多个因素,例如易用性.音质.速度.功能等.在本文中,我们将对一些最佳的 ...

  4. 2020大学计算机学科评估,2020年第五次学科评估大预测:华科将会交出一份怎样的答卷...

    弹指一挥间,2020年即将过去一半.而我国高等教育的重大事件--第五轮学科评估正在如火如荼地进行.而这备受各大高校和考生关注的第五轮学科评估,最终将会碰出怎样的结果,我们拭目以待. 而在我们翘首以盼的 ...

  5. BigData-‘基于代价优化’究竟是怎么一回事?

    本文由  网易云 发布. 本文具体讨论了Join基础算法的一种优化方案  – Runtime Filter,在本文最后还引申地聊了聊谓词 下推技术.同时,在本文文章开头,笔者引出了两个问题,SQL执行 ...

  6. “兴趣社区2.0”俘获年轻人

    文|螳螂观察 作者| 青月 根据国家统计局数据,我国年新增人口数由1995年的2063万降低至2009年的1615万,因此,估算Z世代人口规模约2.64亿,占2019年底总人口比重约18.86%. 在 ...

  7. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  8. SQL中基于代价的优化

    还记得笔者在上篇文章无意中挖的一个坑么?如若不知,强烈建议看官先行阅读前面两文-<SparkSQL Join原理>和<Join中竟然也有谓词下推?> 第一篇文章主要分析了大数据 ...

  9. 巴曙松:寻找可持续的经济复苏

    ??? ※这是新人兄推荐的文章,很不错的,就放在这里让朋友们分享. ??? 自我介绍: 巴曙松教授,博士,国务院发展研究中心金融研究所副所长,研究员,博士生导师,享受国务院特殊津贴. 巴曙松教授在银行 ...

最新文章

  1. 绝对定位下margin的作用
  2. 麦克纳姆轮——机械部分
  3. linux上寻找并杀死僵尸进程
  4. docker 部署mysql服务之后,执行sql脚本
  5. 2016/09/12
  6. [Aaronyang] 写给自己的WPF4.5 笔记6[三巴掌-大数据加载与WPF4.5 验证体系详解 2/3]
  7. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
  8. java web课程题目_JavaWeb开发技术试题题目及答案,课程2020最新期末考试题库,章节测验答案...
  9. C# Winform 窗体美化(五、鼠标穿透)
  10. python的矩阵表示_Python 稀疏矩阵表示
  11. dll文件用什么语言编写_为什么Unix不用功能更强大的C++而是用C编写
  12. 自动外呼——设计思路整理篇
  13. matlab仿真函数,matlab自动控制仿真常见函数应用
  14. 加州理工学院公开课:机器学习与数据挖掘_学习问题(第一课)
  15. 决策引擎EngineX平台实践
  16. vue3生成二维码打印
  17. JZOJ3395. 【NOIP2013模拟】Freda的传呼机
  18. PCB工艺多层盲孔板+树脂塞孔工艺——深亚电子
  19. 钰泰半导体ETA4034爆款OVP+OCP+NTC+OTP+FAULT五合一方案, 兼容BQ24314
  20. 反超7-11!中国新的“便利店之王”即将诞生!

热门文章

  1. MATLAB 求图像的极大值极小值,平均值
  2. Mardown(或Latex)换行
  3. \00在python中
  4. Python画散点图(Knn中数据)
  5. Mysql data type
  6. 剑指offer 平衡二叉树
  7. 【复习】---【noip2009 普及】细胞问题 (1)
  8. QT开发(十二)——QT事件处理机制
  9. EUI库 - EXML
  10. 推荐一个妹子,播报汽车新闻