SQLSERVER中如何忽略索引提示

当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样

SELECT  id,name from TB  with (index(IX_xttrace_bal)) where bal<100

当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时候这个索引提示可能会导致查询变慢

经过你的测试,发现确实是因为这个索引提示的关系导致查询变慢,但是SQL服务器已经缓存了这条SQL语句的执行计划,如果修改SQL语句的话可能会有影响

而且,可能不单只一条SQL语句用了索引提示,还有其他的SQL语句也用了索引提示,你不可能马上去修改这些SQL语句的时候可以使用SQLSERVER里面的一个trace flag

这个trace flag能忽略SQL语句里面的索引提示和存储过程里面的索引提示

不需要修改SQL语句,就可以进行性能排查

运行下面脚本创建数据库和相关索引

USE master
GO IF DB_ID('Trace8602') IS NOT NULL
DROP DATABASE Trace8602
GO CREATE DATABASE Trace8602
GO USE Trace8602
GO CREATE TABLE xttrace8602
(
id INT IDENTITY(1, 1)
PRIMARY KEY ,
bal INT ,
name VARCHAR(100)
)
GO CREATE NONCLUSTERED INDEX IX_xttrace8602_bal_name ON xttrace8602(bal,name)
GO
CREATE NONCLUSTERED INDEX IX_xttrace8602_bal ON xttrace8602(bal)
GO INSERT INTO xttrace8602
VALUES ( RAND() * 786, 'cnblogs.com/lyhabc' )
GO 10000 CREATE PROC uspFirst
AS
SELECT id ,
name
FROM xttrace8602 TF WITH ( INDEX ( IX_xttrace8602_bal ) )
WHERE bal < 100
GO

现在执行下面代码

--没有使用跟踪标志
EXEC uspFirst
GO

--使用了跟踪标志
DBCC TRACEON(8602,-1)
GO
DBCC FREEPROCCACHE
GO
EXEC uspFirst
GO

可以看到,打开TRACEON(8602,-1) 跟踪标志之后,SQLSERVER忽略了索引提示,利用复合索引IX_xttrace8602_bal_name 把数据查出来

而不需要额外的键查找

这个跟踪标志不需要你修改你的SQL语句就可以让SQLSERVER忽略索引提示

在使用这个8602跟踪标志之前记得先在开发环境测试好,确认是否需要忽略索引提示,以便做成性能问题

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

SQLSERVER中如何忽略索引提示的更多相关文章

  1. SQLServer中重建聚集索引之后会影响到非聚集索引的索引碎片吗

    本文出处:http://www.cnblogs.com/wy123/p/7650215.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  2. SQLSERVER中的鬼影索引

    SQLSERVER中的鬼影索引 看这篇文章之前可以先看一下鬼影记录 了解了解一下SQLSERVER里的鬼影记录关于鬼影记录的翻译一关于鬼影记录的翻译二 当删除表中的某一条记录的时候,索引页面的对应记录 ...

  3. 在SQLSERVER中创建聚集索引

    CREATE CLUSTERED INDEX CLUSTER_id ON TABLE_name(ID)------批量

  4. SQLServer中间接实现函数索引或者Hash索引

    本文出处:http://www.cnblogs.com/wy123/p/6617700.html SQLServer中没有函数索引,在某些场景下查询的时候要根据字段的某一部分做查询或者经过某种计算之后 ...

  5. Sqlserver中一直在用又经常被忽略的知识点一

    已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作...... 在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们 ...

  6. 解决“动软代码生成器在SqlServer中会将唯一索引识别为主键"的Bug

    动软代码生成器在SqlServer中,生成的代码会将唯一索引错误地识别为主键, 反编译源代码后,发现其中的SQL条件有误,现修复此Bug. 修复方法:将附件中的”Maticsoft.DbObjects ...

  7. SQLServer中在视图上使用索引(转载)

    在SQL Server中,视图是一个保存的T-SQL查询.视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全.但是,它并不占用数据库的任何空间.实际上,在你 ...

  8. MySQL中的索引提示Index Hint

    MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引.以下是可能需要用到INDEX HINT的情况 a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢. ...

  9. SqlServer中提示和报错信息的翻译

    有时候遇到SqlServer一些报错需要上网查找解决方法,一些比较生僻的问题汉语搜索往往得不到想要的,就要使用英文在外网搜索.之前都是自己尝试翻译,或者使用错误码,或者找个英文版的数据库重现问题.有时 ...

随机推荐

  1. jQuery的input 失去焦点之后,不能再获取到焦点

    今天写了一个字段唯一性校验功能,验证设备仪器编号唯一,当输入编号之后 ,点击其他,失去焦点后,后台验证唯一,有过此编号,就给出提示,重新填写. 当使用ie时候,获取焦点正常 ,但是使用火狐就获取不到焦 ...

  2. CSS布局(二)

    本节内容:position.float.clear.浮动布局例子.百分比宽度 position CSS中的position属性设置元素的位置.属性值:static.relative.fixed.abs ...

  3. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  4. rem字体响应式布局

    引用js,自动算字体大小,响应式布局 <script> var iScale = 1; iScale = iScale / window.devicePixelRatio; documen ...

  5. HTML 判断手机的类型(苹果手机安卓手机)

    function isJudege_PlatForm() { var version = navigator.appVersion; var platName = navigator.userAgen ...

  6. 图表插件使用汇总(echarts,highchairts)

    1.echarts之饼图显示数字 option={ title: { text: '某站点用户访问来源', subtext: '纯属虚构', x: 'center' }, tooltip: { tri ...

  7. 第四章 使用Docker镜像和仓库

    第4章 使用Docker镜像和仓库 回顾: 回顾如何使用 docker run 创建最基本的容器 $sudo docker run -i -t --name another_container_mum ...

  8. Maven + Eclipse + Tomcat - 开启项目调试之旅(转)

    本文的读者需要拥有一些Maven基础知识和实践,如果没有,请直接绕过或者先看一些关于Maven教程,比如Juven翻译的<Maven权威指南>,google一下便知. 开门见山,首先抛出一 ...

  9. the fifth class

      1.实际比背景长,怎么做到的? 2个父级一个做头背景一个做尾背景 2.2层,每次自带背景上下是覆盖关系,如何做到 2层?,子浮动 3.标签 4.border可覆盖:margin-bottom 为负 ...

  10. 大数据通过PHP快速插入MYSQL的方法

    如果您的mysql是通过brew安装的,那么请 vi /usr/local/Cellar/mysql/5.6.23/my.cnf 将 max_allowed_packet = 64M 写入保存并重启m ...