sch*_*ner 24 sql sql-server select
我们有一个查询运行一个相当大的表,不幸的是需要在几个varchar字段上使用LIKE'%ABC%',以便用户可以搜索部分名称等.SQL Server 2005
在使用LIKE时,在这些varchar字段上添加索引是否有助于选择查询性能,还是基本上忽略索引并在这些情况下执行完整扫描?
使用LIKE时提高性能的其他任何可能方法?
aha*_*ins 12
您可以通过添加索引来看到性能改进,它在很大程度上取决于细节:)
行的总大小中有多少是您的谓词列?您希望匹配多少行?您是否需要返回与谓词匹配的所有行,或者只返回前1行或前n行?
如果要搜索具有高选择性/唯一性的值(返回的行数很少),并且谓词列是整个行大小的一小部分,则索引可能非常有用.它仍然是一个扫描,但您的索引每页应该比源表更多的行.
下面是一个示例,其中总行大小远大于要搜索的列大小:
create table t1 (v1 varchar(100), b1 varbinary(8000))
go
--add 10k rows of filler
insert t1 values ('abc123def', cast(replicate('a', 8000) as varbinary(8000)))
go 10000
--add 1 row to find
insert t1 values ('abc456def', cast(replicate('a', 8000) as varbinary(8000)))
go
set statistics io on
go
select * from t1 where v1 like '%456%'
--shows 10001 logical reads
--create index that only contains the column(s) to search across
create index t1i1 on t1(v1)
go
select * from t1 where v1 like '%456%'
--or can force to
--shows 37 logical reads
Run Code Online (Sandbox Code Playgroud)
如果查看实际的执行计划,您可以看到引擎扫描了索引并在匹配的行上进行了书签查找.或者你可以告诉优化器直接使用索引,如果它没有决定自己使用这个计划:select*from t1 with(index(t1i1))其中v1喜欢'%456%'
如果您有一堆列只能搜索一些具有高度选择性的列,则可以创建多个索引并使用缩减方法.例如,首先从您的高选择性索引中确定一组ID(或您的PK是什么),然后使用针对该一小组PK的过滤器搜索较不具有选择性的列.
如果您总是需要返回大量行,那么使用表扫描几乎肯定会更好.
因此,可能的优化很大程度上取决于表定义的具体情况和数据的选择性.
HTH!-Adrian
除了使用全文索引之外,唯一可以提高性能的方法是使用"LIKE ABC%" - 不要在搜索词的两端添加通配符 - 在这种情况下,索引可以正常工作.
如果您的要求必须在搜索字词的两端都有通配符,那么您就不幸了......
渣
| 归档时间: |
|
| 查看次数: |
20003 次 |
| 最近记录: |