译: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 ...
随机推荐
- PowerShell 批量修改AD属性
环境:win 2008 R2 在管理工具中打开用于 windows powershell 的ActiveDirectory模块命令行窗口或打开命令提示符窗口输入PowerShell回车再输入impor ...
- java中静态代码块,构造代码块,以及构造方法的执行顺序
写了许久的代码,却把一些基础的东西都给忘了,今天无聊就顺手写了个,然后测试下,发现跟我记忆中的竟然有些出入,作为一个两年的开发,我感觉自己很失败啊. 父类pojo: public class Pojo ...
- [Noi2014]魔法森林( 动态mst lct)
以前一直觉得lct特别难写,自从学了丽洁姐的lct之后,觉得lct居然能这么短,这个主程序能40行左右解决~~~~ 这道嘛~~虽说能用spfa解决,但还是写下lct吧 把边按a值排序后一条一条插入并维 ...
- linux oracle 10g 安装时 .bash_profile的设置
export ORACLE_BASE=/home/oracle/oracle10g export ORACLE_SID=ccpbs export ORACLE_HOME=$ORACLE_BASE/pr ...
- 开始了大概三四天的Rails学习之路
最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...
- extundelete教程(完整版)
作者:蒋张裕 Extundelete是在Linux下,基于开源的数据恢复工具.使用阿里云的云服务器 ECS,您可以方便地安装,及时还原误删除的重要文件. extundelete不仅能够通过在文件系统的 ...
- 寻找与疾病相关的SNP位点——R语言从SNPedia批量提取搜索数据
是单核苷酸多态性,人的基因是相似的,有些位点上存在差异,这种某个位点的核苷酸差异就做单核苷酸多态性,它影响着生物的性状,影响着对某些疾病的易感性.SNPedia是一个SNP调査百科,它引用各种已经发布 ...
- 基于vue的多引擎搜索及关键字提示
关键代码: <div class="header-search"> <form id="form" action="http://m ...
- Selenium 上传文件失败,解决办法一
昨个改程序遇到一个问题,UI上面有需要上传文件的地方.但是我不知道怎么让Selenium完成 点击上传文件按钮->在弹出的文件选择窗口中选择路径和文件,点确定. 要知道弹出窗口属于window的 ...
- ASP日期格式化函数
Public Function GetFormatDate(DateAndTime, para)On Error Resume NextDim y, m, d, h, mi, s, strDateTi ...