SQLSERVER中忽略索引提示

 更新时间:2014年11月11日 11:50:33   投稿:hebedich  
这篇文章主要介绍了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

相关文章

  • 关于SQL表中drop table和delete table的区别

    关于SQL表中drop table和delete table的区别

    删表是一个比较危险的操作,这次给了个机会就想尝试下,记得在mysql表中有两种操作,drop与delete,但是在maxcompute产品中尝试时,该产品只支持drop操作。这里说下二者操作的区别,需要的朋友可以参考下
    2023-01-01
  • sqlserver 索引的一些总结

    sqlserver 索引的一些总结

    如果说要对数据库进行优化,我们主要可以通过以下五种方法,对数据库系统进行优化
    2012-08-08
  • sql server 自定义分割月功能详解及实现代码

    sql server 自定义分割月功能详解及实现代码

    这篇文章主要介绍了sql server 自定义分割月功能详解及实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • SQL Server 2008 清空删除日志文件(瞬间缩小日志到几M)

    SQL Server 2008 清空删除日志文件(瞬间缩小日志到几M)

    sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了。下面我们一起来学习一下如何清理这个日志吧
    2018-10-10
  • 卸载VS2011 Developer Preview后Sql Server2008 R2建立数据库关系图报“找不到指定的模块”错误的解决方法

    卸载VS2011 Developer Preview后Sql Server2008&nbs

    话说上回我为了尝尝螃蟹的味道而装了 VS2011 Developer Preview,但是装完后立马卸载掉了,原因是这家伙的安装目录位置没用,我设置到D盘的但是装完后D盘的文件夹只有一百多M,而足足8G+的空间是在C盘上消耗的。
    2011-11-11
  • SQL语句检测sp4补丁是否安装

    SQL语句检测sp4补丁是否安装

    如何查看sql2000 sp4补丁是否安装成功,本文给出实现sql语句,需要的朋友可以了解下
    2012-12-12
  • Sql学习第三天——SQL 关于with ties介绍

    Sql学习第三天——SQL 关于with ties介绍

    with ties一般是和Top , order by相结合使用的,会查询出最后一条数据额外的返回值,接下来将为大家详细介绍下,感兴趣的各位可以参考下哈
    2013-03-03
  • SQL Server将一列的多行内容拼接成一行的实现方法

    SQL Server将一列的多行内容拼接成一行的实现方法

    这篇文章主要介绍了SQL Server将一列的多行内容拼接成一行的实现方法,需要的朋友可以参考下
    2015-11-11
  • 使用SQL语句创建数据库与创建表操作指南

    使用SQL语句创建数据库与创建表操作指南

    这篇文章主要给大家介绍了关于使用SQL语句创建数据库与创建表操作的相关资料,创建数据库是数据库管理的第一步,而SQL语句是创建数据库的基本工具,需要的朋友可以参考下
    2023-08-08
  • SQLServer中的触发器基本语法与作用

    SQLServer中的触发器基本语法与作用

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。本文给大家介绍SQLServer中的触发器基本语法与作用,感兴趣的朋友一起学习吧
    2016-04-04

最新评论