架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7078|回复: 0

[交流] 淡sqlserver对like '%关键词%' 处理时的索引利用问题

[复制链接]
发表于 2014-11-26 15:52:19 | 显示全部楼层 |阅读模式

说法一:百分号%通配符前置会让SQL查询不走索引,改走全表扫描。这种说法很流行

结论是错误的

事实上这种说法不太准确 通配符%前置会让SQL查找索引时效率极速下降,但在大多数情况下还是会走索引(不需要全文索引,只要建一个普通的索引就可以了)

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名]
(
[db_title]  ASC
)

此时执行

SELECT top 10 [db_id],[db_Summary],[db_AddDate],[db_title]  FROM [库名].[dbo].[wkf_database]   where [db_title]like '%dba%'  order by 1 desc

查询计划显示得很清楚

201303260334295377.jpg

对比加索引之前:

201303260335146830.jpg


说一个例外,复杂查询查询优化器可能会抛弃索引改走全表扫描。这不仅是LIKE '%关键词%' 时会这样,跟查询复杂度有关




说法二:百分号%通配符前置会让SQL查询走索引不如不走索引

这种说法非常片面,走索引比不走索引99%的情况下都会减少IO从而提高效率,但是:索引查找完的键匹配动作也是有一部分性能消耗的。像上面两张图所示,如果关键字很容易就匹配到了,全表扫描很快就找齐了数据,而索引扫描节省的时间不足以弥补键匹配动作所消耗时间的时候这种情况就发生了(大部分线上查询不存在这问题)这时候优化就变得诡异了。
处理方法:
1.不去管它,多出来的性能消耗不是很大。而且不同的关键词有不同的消耗,只是部分关键词存在此问题,可以忽略
2.更好的方法,如果条件允许建覆盖索引(又叫INCLUDE索引)。前题条件:a存储空间充足,b不显著影响DML操作,c覆盖的索引中没有大字段

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名]
(
[db_title]  ASC
)
INCLUDE ( [db_id],[db_Summary],[db_AddDate])

此时执行查询计划如下,清爽多了吧

201303260335309488.jpg


以上就是我现在能想到的SQLSERVER处理SELECT *  FROM TABLENAME LIKE  '%关键词%'






上一篇:sqlserver事务复制在不重新初始化的情况下添加新表
下一篇:实用sql语句:日期的推算
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-5-8 12:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表