SQLSERVER中如何忽略索引提示

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文:SQLSERVER中如何忽略索引提示SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 SELECT id,name from TB with (index(IX_xttrace_bal)) where ba...
原文: SQLSERVER中如何忽略索引提示

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语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
22 0
|
1月前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
86 11
|
5天前
|
SQL 存储 数据库
SQL 撤销索引、撤销表以及撤销数据库
SQL 撤销索引、撤销表以及撤销数据库
17 4
|
3天前
|
SQL 存储 关系型数据库
不懂索引,简历上都不敢写自己熟悉SQL优化
大家好,我是考哥。今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握还重要,索引是优化SQL的前提和基础,我们一步步来先打好地基。当MySQL表数据量不大时,缺少索引对查询性能的影响都不会太大,可能都是0.0几秒;但当表数据量逐日递增时,建立一个合适且优雅的索引就至关重要了。
691 0
不懂索引,简历上都不敢写自己熟悉SQL优化
|
5天前
|
SQL 存储 关系型数据库
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
|
16天前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
16 2
|
16天前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)
MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)
18 2
|
2天前
|
SQL 存储 数据库
sql索引详解
sql索引详解
|
16天前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
17 0
|
1月前
|
SQL 存储 关系型数据库
【MySQL系列】一条SQL,我怎么知道它有没使用到索引?
哈希索引会为所有的索引列计算一个哈希码,在哈希表中保存哈希码和指向每个数据行的指针,这种结构对。的B-Tree上找到主键值,再从聚簇索引建立的B-Tree找到行数据。知道的,我了解的提高行数据查询的主要有B树索引、哈希索引。好了,今天的分享就先到这,我们下期《MySQL系列》继续。,值都存储叶子节点同时形成双向链表,很适合范围查询。,如哪些索引可以被命中、哪些索引实际被命中。有的,索引失效一般是这个SQL查询破坏了。,整棵B-Tree的高度变得矮胖,可以。索引覆盖,直接通过索引就可以查询到数据。
101 6
【MySQL系列】一条SQL,我怎么知道它有没使用到索引?