首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server和动态搜索的性能

SQL Server和动态搜索的性能
EN

Stack Overflow用户
提问于 2015-06-19 19:17:35
回答 3查看 491关注 0票数 16

我想知道在sql中使用动态值进行查询的最佳实践是什么,假设我有一个值(nvarchar(Max))

值:"912345678"

代码语言:javascript
复制
select * from AllData
where Number like '%912345678%' 

值:"Michael"

代码语言:javascript
复制
select * from AllData
where Name like '%Michael%' 

取值:“10号街”

代码语言:javascript
复制
select * from AllData
where Address like '%Street number 10%' 

这种方法有点慢,因为搜索一个有9位数字的数字会更快,没有这样的%

代码语言:javascript
复制
select * from AllData
where Number like '912345678' 

我使用EDMX与C#中的外部数据库建立连接,如下所示:

代码语言:javascript
复制
var Result = EDMXEntity.Entities.Where(x => 
(SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0)
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList();

如何提高性能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-22 19:14:48

像这样在varchar/nvarchar字段上的通配符搜索将遍历每个字符,或多或少地遍历符合条件的记录。

很棒(而且很快!)这类搜索的选项是:

  1. 创建全文目录以存储全文索引。
  2. fulltext index放在需要搜索的每个表中的列上。
  3. 在搜索时使用CONTAINS关键字,而不是通配符。

你提到寻找可靠的来源,here是一个很好的读物。

票数 13
EN

Stack Overflow用户

发布于 2015-06-19 19:35:26

如果使用LIKEPATINDEX不能获得所需的性能,那么您可能应该编写使用FTS的sp。

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 01:11:13

要在EF中使用'like‘进行搜索,您可以使用Contains()

代码语言:javascript
复制
var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) ||
x => x.Number.ToString().Contains(Value) ||
x => x.Address.Contains(Value)).Take(50).ToList();

但使用这种搜索方式,您永远不会获得良好的性能。您需要更改在数据库中搜索或存储数据的方式。例如,如果您确定用户正在查找姓名,则只能在“姓名”列中进行搜索。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30936825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档