好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLSERVER中如何忽略索引提示

SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 SELECT id,name from TB with ( index (IX_xttrace_bal)) where bal 100 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再

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测试数据/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中如何忽略索引提示的详细内容...

  阅读:45次