设为首页 加入收藏

TOP

SQL强制指定索引加快查询速度
2015-11-21 01:57:45 来源: 作者: 【 】 浏览:0
Tags:SQL 强制 指定 索引 加快 查询 速度

今天遇到一个查询问题,多加了一个查询参数导致查询超时报黄,经过公司DBA改进,涨姿势了。现在发出来跟大家分享一下!~

?

SELECT m.* FROM TB_UserSiteGroup u WITH(NOLOCK),Message.dbo.View_Message_8 m WITH(NOLOCK)
WHERE  m.FromUserID = u.UserID   AND u.AdminID =880982 and m.state=1  and m.touserID=0 AND u.siteid = 8
ORDER BY  m.time DESC

这是原始SQL,多加了u.AdminID =880982 参数后导致查询超时。

?

查询后跟WITH(NOLOCK) 理论上可以加快查询速度的33%,但有可能造成脏读(百度一下,你就知道)

这是改进后的SQL:

?

SELECT  m.*
FROM    TB_UserSiteGroup u WITH ( NOLOCK,INDEX=IX_TB_UserSiteGroup_SiteID )
  JOIN       Message.dbo.View_Message_8 m WITH ( NOLOCK )
ON    m.FromUserID = u.UserID
        AND m.state = 1
        AND m.touserID = 0
        AND u.siteid = 8
        AND u.AdminID = 880982
ORDER BY m.time DESC

由之前查询时间2分多变成现在秒出。。。新建了IX_TB_UserSiteGroup_SiteID索引,并强制指定查询索引。

?

由之前逗号连接(不知道叫啥)改为JOIN连接形式。

问了DBA,DBA说JOIN连接会自动搜索最优、最匹配索引进行查找,而逗号连接则是根据where 条件进行匹配查找。之间存在功能损耗。

这些是我模糊记得的东西,DBA说的具体都记不清了,可能不准确,欢迎各位同学补充探讨。

?

SELECT m.* FROM TB_UserSiteGroup u WITH(NOLOCK,INDEX=IX_TB_UserSiteGroup_SiteID),Message.dbo.View_Message_8 m WITH(NOLOCK)
WHERE  m.FromUserID = u.UserID   AND u.AdminID =880982 and m.state=1  and m.touserID=0 AND u.siteid = 8
ORDER BY  m.time DESC

这段SQL是原始SQL加了指定索引后的结果。
查询耗时也是秒出。。。
从数据量和时间来看,暂时还看不出JOIN连接和逗号连接的本质区别。之后会跟进学习。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据库触发器DB2和SQLServer的异同 下一篇sql学习笔记(21)-----------触..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: