Azure SQL查询执行极慢原因及优化方案咨询
优化带通配符LIKE查询的实战方案
兄弟,这问题我太熟了——带前置通配符的LIKE '%xxx%'简直就是普通B-tree索引的克星!你现在加的索引确实能帮你快速过滤出符合companyid和languagecode的行,但到了noos14 LIKE '%...%'这一步,数据库还是得把这些过滤后的行挨个扫描匹配,百万行里哪怕剩下几十万,也得花不少时间。给你几个针对性的优化方案,亲测有效:
1. 改用全文索引(最推荐,秒级出结果)
SQL Server的全文索引专门为文本包含式搜索设计,效率比LIKE '%xxx%'高几个数量级,尤其适合你这种百万行规模的表。
操作步骤:
- 先确认数据库开启了全文搜索(默认是开的,没开的话执行这个):
EXEC sp_fulltext_database 'enable'; - 创建全文目录:
CREATE FULLTEXT CATALOG ftCatalog_TillBasicData AS DEFAULT; - 给表创建全文索引(记得替换成你的主键索引名):
CREATE FULLTEXT INDEX ON dbo.TillBasicData(noos14) KEY INDEX PK_TillBasicData; -- 这里填你的表的主键索引名称 - 最后把查询改成用
CONTAINS:
这个查询基本能秒出结果,因为全文索引会对文本做分词和倒排索引,直接定位包含目标字符串的行,不用挨个扫描。SELECT * FROM TillBasicData WHERE companyid = 'BE_AA' AND languagecode = 'eng' AND CONTAINS(noos14, '"09258384374953"');
2. 优化现有索引,提升过滤效率
先搞清楚companyid = 'BE_AA' AND languagecode = 'eng'能过滤掉多少行——如果过滤后剩下的行数还是很多(比如几十万),那现有索引的价值就有限了。先跑个查询看看:
SELECT COUNT(*) FROM TillBasicData WHERE companyid = 'BE_AA' AND languagecode = 'eng';
如果结果超过几万行,可以试试这两个优化:
- 改成覆盖索引:把查询需要的所有列都包含到索引里,这样数据库不用回表查原数据,直接从索引里拿结果,能提速不少:
注意:覆盖索引会增大索引体积,要根据实际情况权衡。CREATE INDEX IX_TillBasicData_Covering ON dbo.tillbasicdata (companyid DESC, languagecode DESC) INCLUDE (noos14, [列1], [列2], ...); -- 把SELECT *需要的其他列都列在这里 - 检查统计信息:过时的统计信息会让SQL Server生成糟糕的查询计划,比如没用到你的索引。更新一下试试:
UPDATE STATISTICS dbo.TillBasicData WITH FULLSCAN;
3. 特殊场景:如果是后缀匹配(可选)
如果你实际需求是找noos14以09258384374953结尾的行(而不是任意位置包含),可以用反向索引的技巧:
- 添加计算列存储反向的
noos14:ALTER TABLE dbo.TillBasicData ADD noos14_reversed AS REVERSE(noos14); - 给计算列建索引:
CREATE INDEX IX_TillBasicData_Reverse ON dbo.tillbasicdata (companyid DESC, languagecode DESC, noos14_reversed DESC); - 查询时反向搜索字符串:
这个方法只适合后缀匹配,要是你确实是任意位置包含,还是用全文索引最靠谱。SELECT * FROM TillBasicData WHERE companyid = 'BE_AA' AND languagecode = 'eng' AND noos14_reversed LIKE REVERSE('09258384374953') + '%';
内容的提问来源于stack exchange,提问作者Matt Douhan
相关产品推荐
相关产品推荐

