Tsql 转换为可搜索查询

Tsql 转换为可搜索查询,tsql,indexing,sql-server-2008-r2,query-performance,Tsql,Indexing,Sql Server 2008 R2,Query Performance,我想写一个查询来搜索表中包含的字符串 表: 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 10

我想写一个查询来搜索表中包含的字符串

表:

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
实际执行计划:


如何强制查询处理器在大型数据集上使用索引搜索而不是表/索引扫描?

根据定义,您发布的所有查询都是不可搜索的,例如,“…%”的使用会自动强制查询引擎进行扫描,另一种情况是使用函数(如charindex或patindex)在谓词中的列内部

以下是一些帖子:


Kimberly Tripp写了非常有趣的文章,如果您必须使用通配符执行此类查询,那么可能值得检查一下使用FullTextSearch功能的可能性。我的观点是,或者你的限制,在你的查询中做一个精确的谓词,或者你将不得不改变策略,几乎忘记,不要试图用暗示强制使用Seek,我看不出这种药会比疾病更好。

搜索参数,简称SARG,是一个过滤器谓词,使优化器能够依赖它 索引顺序。筛选器谓词使用以下形式(或带有两个分隔符的变量) 范围,或操作数位置翻转时): 其中

如果出现以下情况,则该过滤器是可搜索的:

  • 您不会对筛选列应用操作

  • 运算符标识索引中连续范围的符合条件的行。这就是问题所在
    对于像=、>、>=这样的运算符,这些查询都不是可搜索的,因为前导通配符意味着“正常”索引是无用的。
    (n)(var)char
    数据类型上的索引按照从左到右的排序顺序对字母进行排序。如果您正在查找包含字符串
    'ee'
    的值,则排序不会对您有所帮助。如果您需要执行这样的查询,则需要考虑全文索引。其他选项而不是全文索引?如果您只需要搜索“代码> > %EE%”/代码>,则创建一个持久化的计算列。否则,您唯一的另一个选择就是在每次要进行前导通配符搜索时进行表扫描。