【发布时间】:2019-05-20 21:32:54
【问题描述】:
我想写一个查询来搜索表中包含的字符串。
表:
Create table tbl_sarg
(
colname varchar(100),
coladdres varchar(500)
);
注意:我只想使用 Index Seek 搜索 3 亿条记录。
索引:
create nonclustered index ncidx_colname on tbl_sarg(colname);
样本记录:
insert into tbl_sarg values('John A Mak','HNo 102 Street Road Uk');
insert into tbl_sarg values('Shawn A Meben','Church road USA');
insert into tbl_sarg values('Lee Decose','ShopNo 22 K Mark UK');
insert into tbl_sarg values('James Don','A Mall, 90 feet road UAE');
查询 1:
select * from tbl_sarg
where colname like '%ee%'
实际执行计划:
查询2:
select * from tbl_sarg
where charindex('ee',colname)>0
实际执行计划:
查询 3:
select * from tbl_sarg
where patindex('%ee%',colname)>0
实际执行计划:
如何强制查询处理器在大型数据集上使用索引查找而不是表/索引扫描?
【问题讨论】:
-
这些查询都不是 SARGable,因为前导通配符意味着“正常”索引是无用的。
(n)(var)char数据类型上的索引按从左到右的排序顺序对字母进行排序。如果您正在查找在值中的任何位置包含字符串'ee'的值,那么没有排序将帮助您。如果您需要执行这样的查询,则需要考虑全文索引。 -
除了全文索引还有其他选项吗?
-
如果您要搜索的只是
'%ee%',则创建一个持久计算列。否则,您唯一的其他选择就是每次要进行领先的通配符搜索时都进行一次表扫描。
标签: tsql indexing sql-server-2008-r2 query-performance