注:

  本文译自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中的信息的更多相关文章

  1. 译:SQL Server的Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息

    注: 本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/ 原文作者 ...

  2. win7(32 bit) + IE8 环境,IE8无法弹窗(错误提示:“此网页上的错误可能会使它无法正确运行”),有关的系统注册信息损坏——解决方法

    错误截图如下:   IE有关的系统注册信息损坏,导致IE无法正常弹窗.   解决办法:重新注册与IE有关的DLL文件,具体如下: 1.以管理员身份运行附件脚本(新建txt文件,将下面代码复制到txt文 ...

  3. Unity strip engine code可能会使程序崩溃

    最近正在做新大厅的红包推荐口令快速领金币入口拍卖行之类的功能,同事把我的捕鱼整合到他的项目中时出现了闪退的问题,经排查是因为strip engine code选项. Strip engine code ...

  4. 将1、2、3、……、n这n个连续自然数分成g组,使每组的和相等。g组中个数最多的一组有几个?

    <style type="text/css"> #content { width: 600px; margin: 150px auto 0 auto; } dl dd ...

  5. Index statistics collected bug

    SQL运行引擎会从pg_stats.pg_class等相关系统字典表.视图获取生成最佳运行计划的数据,假设相关字典视图的数据不准确就没有办法生成良好的运行计划. 发现下面Bug一枚. 0. 插入数据之 ...

  6. 如何使你的Android应用记住曾经使用过的账户信息

    原文:http://android.eoe.cn/topic/android_sdk 当您记住他们的名字时,每个人都会很喜欢.最简单的一个例子,您能够做的,让您的应用更加受人喜爱的,最有效的方法是记住 ...

  7. index获取子DOM对象在父DOM对象的内位置索引值

    <script type="text/javascript">    $(function(){        var $p1=$('#id1 p:visible'); ...

  8. 学习日记3、投机取巧使两个表的数据同时在一个treeGrid中显示

    不多说了直接上代码, $('#List').treegrid({ url: '@Url.Action("GetList")', width: $(window).width() - ...

  9. Parameter index out of range(1 > number of parameters, which is 0)参数索引超出范围

    今天在写项目的过程中,有一个模块是做多选删除操作,通过servlet获得多选框的value组,然后执行sql操作.如下: 1 @RequestMapping( "/delteCouse.do ...

随机推荐

  1. java流和文件 保存字节级数据(写)

    重要的知识点: 流的概念:  从数据源到I/O类的输入流(in)    从I/O类到数据接收器的输出流(out) I/O包含子类较多的有四大家族:InputStream,OutputStream,Re ...

  2. 关于nodejs express4.X框架不支持layout模板的问题解决

    网上有有种方法是安装express-partials模块,然后在 app.set(‘view engine’, ‘ejs’); 这句后面加上app.use(partials());但是,经过我的反复尝 ...

  3. asp.net core mvc剖析:处理管道构建

    在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建.在来看一下代码: ...... //这个调用的就是Startup.cs类中的Config ...

  4. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法

    前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...

  5. 在vim中搜索单词

    基本的搜索: /pattern    向前搜索 ?pattern   向后搜索 n               向前重复搜索 N               向后重复搜索 搜索并替换 :%s/sear ...

  6. 浅谈css中一个元素如何在其父元素居中显示

    css如何垂直居中一个元素的问题已经是一个老生常谈的问题了.不管对于一个新手或者老手,在面试过程中是经常被问到的.前两天在看一个flex的视频教程,当中提到了有关元素的居中问题,所以今天小编就来扒一扒 ...

  7. java 抽象(abstract) 构造 静态(static) 总结--2017-03-02

    抽象类:不能实例化!子类继承抽象类, 实例化子类对象才可以调用, 多态的体现; 抽象方法:必须被重写才能被调用; 静态方法:类名直接调用,或者实例化对象调用; 构造方法:new后面的括号里面带参数,就 ...

  8. Boot Sector - Hello world

    1. code bits org 7c00h mov ax, cs mov ds, ax mov es, ax call DispStr jmp $ DispStr: mov ax, BootMess ...

  9. vuejs数据双向绑定原理(get & set)

    前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...

  10. 使用postfix在debian上配置邮件服务器

    如果debian中安装了exim4,先卸载exim4: apt-get remove exim4 安装postfix apt-get install postfix 安装完成后就可以测试下,PHP代码 ...