共计 1328 个字符,预计需要花费 4 分钟才能阅读完成。
今天就跟大家聊聊有关 SQLSERVER 中怎么忽略索引提示,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样
复制代码 代码如下:
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 masterGOIF DB_ID(Trace8602) IS NOT NULL DROP DATABASE Trace8602GOCREATE DATABASE Trace8602GOUSE Trace8602GOCREATE TABLE xttrace8602 (id INT IDENTITY(1, 1) PRIMARY KEY , bal INT , name VARCHAR(100) )GOCREATE NONCLUSTERED INDEX IX_xttrace8602_bal_name ON xttrace8602(bal,name)GOCREATE NONCLUSTERED INDEX IX_xttrace8602_bal ON xttrace8602(bal)GOINSERT INTO xttrace8602VALUES (RAND() * 786, cnblogs.com/lyhabc )GO 10000CREATE PROC uspFirstAS SELECT id , name FROM xttrace8602 TF WITH (INDEX ( IX_xttrace8602_bal) ) WHERE bal 100GO
现在执行下面代码
复制代码 代码如下:
– 没有使用跟踪标致 EXEC uspFirst GO
复制代码 代码如下:
– 使用了跟踪标志 DBCC TRACEON(8602,-1)GODBCC FREEPROCCACHEGOEXEC uspFirst GO
可以看到,打开 TRACEON(8602,-1) 跟踪标志之后,SQLSERVER 忽略了索引提示,利用复合索引 IX_xttrace8602_bal_name 把数据查出来
而不需要额外的键查找
这个跟踪标志不需要你修改你的 SQL 语句就可以让 SQLSERVER 忽略索引提示
在使用这个 8602 跟踪标志之前记得先在开发环境测试好,确认是否需要忽略索引提示,以便做成性能问题
看完上述内容,你们对 SQLSERVER 中怎么忽略索引提示有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。