译:Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
注:
本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/
原文作者是在SQL Server 2008 SP1下面说的这个问题,本人在SQL Server 2014 SP2下测试仍有有这个问,因此记录了下来
本人原本打算利用missing index的DMV中的信息做创建索引使用,之前就一直怀疑SSMS中提示的索引是否有效,
通过这篇文章,让我们重新认识missing index的DMV中的信息。
本文出处:http://www.cnblogs.com/wy123/p/6635735.html
译文如下:
使用missing index DMVs时需要非常小心的原因(之一)
missing index DMVs有一个bug,最终可能会让你把你的头靠在一堵砖墙,质疑你的理智,我知道我曾经做过这样的事
这个bug就是:缺失索引代码可能会一次又一次建议创建一个已经存在的非聚集索引,也有可能建议一个没有对查询有实际帮助的索引
是的,我对这种现象也感到吃惊-就像是查询优化器里missing index code一样,
尽管如此,它依旧会继续建议你创建一个已经存在的索引,非常讨厌
这是一个鲜为人知的bug,已经在SQL11中修复(Connect item #416197),
但是之前的版本并没有修复(译者注:在SQLServer2014 SP2版本中测试,这个问题仍然存在)
本周末,我在SQL Server2008 SP1中遇到过这个问题,因此我想用博文记录下来,因此你们不用花时间去尝试解决这是怎么回事
这里来重现这种现象:
CREATE TABLE t1
(
c1 INT IDENTITY,
c2 AS c1 * 2,
c3 AS c1 + c1,
c4 CHAR (3000) DEFAULT 'a'
);
GO
CREATE UNIQUE CLUSTERED INDEX t1_clus ON t1 (c1);
GO SET NOCOUNT ON;
GO
INSERT INTO t1 DEFAULT VALUES;
GO 100000
这里创建了一张带有突出一行的表(每行中有一个字段很长),由于每一行都相当的大以至于表扫描的代价很大
现在来运行这个查询

这里我按照它的提示创建一个索引,这一切都很酷
CREATE NONCLUSTERED INDEX [_missing_c2_c3] ON [dbo].[t1] ([c2],[c3]);
GO
现在,如果我想做一些更加复杂的事情,在表上开启一个游标(不要说关于不使用游标的问题--他们在应用程序中到处都是,这对工程师来说是个很简单的例子)
DECLARE testcursor
CURSOR FOR
SELECT c1 FROM t1
WHERE
c2 BETWEEN 10 AND 1000
AND c3 > 1000;
DECLARE @var BIGINT;
OPEN testcursor;
FETCH NEXT FROM testcursor INTO @var;
WHILE (@@fetch_status <> -1)
BEGIN
-- empty body
FETCH NEXT FROM testcursor INTO @var;
END
CLOSE testcursor;
DEALLOCATE testcursor;
如果显示预估的执行计划,参考下图,

这个索引提示恰好是之前已经创建过的了(即使这里要求c1列被包含进来)
提示创建的这个索引实际上已经存在了,由于c1是聚集索引列,他已经被自动地包含在非聚集索引中了
(译者注:懵逼了一下,突然想起来非聚集索引将聚集索引键作为其行指针,这样c1自然在已经建立的索引中了)
尽管如此,为了证明我没有做什么狡猾的事,我继续按照他的提示来它想要的索引
CREATE NONCLUSTERED INDEX [_missing_c2_c3_inc_c1] ON [dbo].[t1] ([c2],[c3]) INCLUDE ([c1]);
GO
然而一切如故,你无法停止提示提示缺少索引的代码停下来

*Key Lookup* 在上面的执行计划中
但是(优化器)提示的缺少索引的代码认为这个索引是有用的并且建议创建它,
实际上这个索引并没有任何帮助,它确实已经存在了。
如果你使用一个查询统计missing index DMV,你的系统里有很多普通的查询将会被这个bug击中,
同时也会发现missing index DMV统计结果是被损坏了的。
因此这里要小心了。
译者注:
多次运行上面这个游标SQL之后,根据missing index DMV查询的结果,果然有这个坑爹的missing index

译:Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息的更多相关文章
- 译:SQL Server的Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
注: 本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/ 原文作者 ...
- win7(32 bit) + IE8 环境,IE8无法弹窗(错误提示:“此网页上的错误可能会使它无法正确运行”),有关的系统注册信息损坏——解决方法
错误截图如下: IE有关的系统注册信息损坏,导致IE无法正常弹窗. 解决办法:重新注册与IE有关的DLL文件,具体如下: 1.以管理员身份运行附件脚本(新建txt文件,将下面代码复制到txt文 ...
- Unity strip engine code可能会使程序崩溃
最近正在做新大厅的红包推荐口令快速领金币入口拍卖行之类的功能,同事把我的捕鱼整合到他的项目中时出现了闪退的问题,经排查是因为strip engine code选项. Strip engine code ...
- 将1、2、3、……、n这n个连续自然数分成g组,使每组的和相等。g组中个数最多的一组有几个?
<style type="text/css"> #content { width: 600px; margin: 150px auto 0 auto; } dl dd ...
- Index statistics collected bug
SQL运行引擎会从pg_stats.pg_class等相关系统字典表.视图获取生成最佳运行计划的数据,假设相关字典视图的数据不准确就没有办法生成良好的运行计划. 发现下面Bug一枚. 0. 插入数据之 ...
- 如何使你的Android应用记住曾经使用过的账户信息
原文:http://android.eoe.cn/topic/android_sdk 当您记住他们的名字时,每个人都会很喜欢.最简单的一个例子,您能够做的,让您的应用更加受人喜爱的,最有效的方法是记住 ...
- index获取子DOM对象在父DOM对象的内位置索引值
<script type="text/javascript"> $(function(){ var $p1=$('#id1 p:visible'); ...
- 学习日记3、投机取巧使两个表的数据同时在一个treeGrid中显示
不多说了直接上代码, $('#List').treegrid({ url: '@Url.Action("GetList")', width: $(window).width() - ...
- Parameter index out of range(1 > number of parameters, which is 0)参数索引超出范围
今天在写项目的过程中,有一个模块是做多选删除操作,通过servlet获得多选框的value组,然后执行sql操作.如下: 1 @RequestMapping( "/delteCouse.do ...
随机推荐
- (@WhiteTaken)设计模式学习——原型模式
有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的. 这时候我们可以用到原型模式,也就是克隆模式. 原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使 ...
- Java静态代理和动态代理总结
静态代理 第一种实现(基于接口): 1>接口 public interface Hello { void say(String msg);} 2>目标类,至少实现一个接口 public c ...
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for ( ...
- HFun.快速开发平台(二)=》自定义列表实例(请求参数的处理)
上编描述了自定义列表的基本实现功能,本此记录列表的请求过程. 个人比较喜欢对参数进行对象化,方便后续人维护及查看,先上代码: /************************************ ...
- Smarty模板的基础
对前后端进行分离 如果要用的话,要从网上把smarty文件下载下来,才能用 smarty的核心是一个类 建一个php文件,写一个类文件 <?php class smarty { public $ ...
- 对java数组的一些理解
刚开始学习Java的时候一直搞不清除获取数组的长度是用length()还是length,现在不妨来深入了解一下数组的真实面目. 我们不妨来看一下数组的源码,诶,数组的类名叫什么?我们声明一个int数组 ...
- 《深入理解Java虚拟机》学习笔记之内存回收
垃圾收集(Garbage Collection,GC)并不是Java语言的半生产物,事实上GC历史远比Java久远,真正使用内存动态分配和垃圾收集技术的语言是诞生于1960年的Lisp语言.经过半个世 ...
- Selenium 上传文件失败,解决办法一
昨个改程序遇到一个问题,UI上面有需要上传文件的地方.但是我不知道怎么让Selenium完成 点击上传文件按钮->在弹出的文件选择窗口中选择路径和文件,点确定. 要知道弹出窗口属于window的 ...
- 20ms Ac Code
Rectangle Aread C Code #include <stdio.h> int computeArea(int A,int B,int C,int D,int E,int F, ...
- 出现java.lang.reflect.UndeclaredThrowableException异常
解决方案:1.看导进来的项目是否有中文路径.2.看是否有get.set方法没写.3.和部署的环境有关.比如,是否写了构造函数.EJB需要.