SQL 动态搜索的服务器和性能

SQL Server and performance for dynamic searches

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

值:“912345678”

select * from AllData
where Number like '%912345678%' 

值:"Michael"

select * from AllData
where Name like '%Michael%' 

值:"Street number 10"

select * from AllData
where Address like '%Street number 10%' 

这种方法有点慢,因为如果没有像这样的 %,搜索具有 9 位数字的数字会更快

select * from AllData
where Number like '912345678' 

我使用 EDMX 在 C# 中连接到外部数据库,如下所示:

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();

如何提高性能?

如果使用 LIKEPATINDEX 没有得到您需要的性能,那么您可能应该编写将使用 FTS 的 sp。

varchar/nvarchar 字段上的此类通配符搜索将或多或少地遍历每个字符以查找满足条件的记录。

此类搜索的一个很好(而且很快!)的选择是:

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

您提到要寻找可靠的来源,here 是一本好书。

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

var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) ||
x => x.Number.ToString().Contains(Value) ||
x => x.Address.Contains(Value)).Take(50).ToList();

但是使用这种搜索您永远不会取得好的效果。 您需要更改在数据库中搜索或存储数据的方式。 例如,如果您确定用户正在寻找姓名,则您只能在 'name' 列中搜索。