最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

SQLSERVER中忽略索引提示_MySQL

来源:懂视网 责编:小采 时间:2020-11-09 19:38:13
文档

SQLSERVER中忽略索引提示_MySQL

SQLSERVER中忽略索引提示_MySQL:当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 代码如下:SELECT id,name from TB with (index(IX_xttrace_bal)) where bal 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时
推荐度:
导读SQLSERVER中忽略索引提示_MySQL:当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 代码如下:SELECT id,name from TB with (index(IX_xttrace_bal)) where bal 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时
当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样

代码如下:

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

SQLSERVER中忽略索引提示_MySQL

SQLSERVER中忽略索引提示_MySQL:当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 代码如下:SELECT id,name from TB with (index(IX_xttrace_bal)) where bal 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时
推荐度:
标签: sql mysql sqlserver
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top