译: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 ...
随机推荐
- C++源码的调用图生成
前言 之前受知乎用户mailto1587启发,写了个C++源码的调用图生成器,可以以图示法显示C++函数的调用关系, 代码放在了github仓库里,仅供参考: CodeSnippet/python/S ...
- 学习笔记--jQuery基础
学习笔记也算总结知识点,有些示例可能没有具体到元素,直接给出的语法.大家有基本理解在看可能会好些. jQuery使用前提,需要安装jQuery库 jQuery 库是一个 JavaScript 文件,您 ...
- 【Zookeeper】源码分析之请求处理链(一)
一.前言 前面已经分析了Watcher机制的主要代码,现在接着分析Zookeeper中的请求处理链,其是Zookeeper的主要特点之一. 二.总体框图 对于请求处理链而言,所有请求处理器的父接口为R ...
- 使用SigbalR发送通知
微信商城使用支付宝支付的时候,需要有个过度页面提示用户用浏览器打开页面去支付,等用户在浏览器支付完之后再打开微信(微信此时依旧显示的是过度页面),过度页面需要跳转到订单详情页面.那么这个过度页面怎么知 ...
- 【开源】NodeJS仿WebApi路由
用过WebApi或Asp.net MVC的都知道微软的路由设计得非常好,十分方便,也十分灵活.虽然个人看来是有的太灵活了,team内的不同开发很容易使用不同的路由方式而显得有点混乱. 不过这不是重点, ...
- JS完成页面跳转并传参的方法|附加:循环遍历对象
此方法只能传递较少参数 方法如下: <a href='page/index.html'>跳转</a> 以上是正常写法,如果要传参按一下写法: <!--参数写在?后面,多个 ...
- laravel中的Database Notifications
创建Post and User模型 php artisan make:model Post php artisan make:model User 创建posts and users 表文件 ph ...
- CSS常用字体Unicode 编码
在 CSS 中设置字体名称,直接写中文是可以的.但是在文件编码(GB2312.UTF-8 等)不匹配时会产生乱码的错误. 为此,在 CSS 直接使用 Unicode 编码来写字体名称可以避免这些错误. ...
- HTML文档中使用JavaScript和css
HTML文档中使用JavaScript和css 引入css 内嵌式引入:将css代码写在HTML中的style标签里面 <!DOCTYPE html> <html> <h ...
- Oracle主键异常处理
Hibernate: insert into test1.WarnWeather (WAREA, wdate, WDAYS, WINFO, WTYPE, WNO) values (?, ?, ?, ? ...