SQL Server和动态搜索的性能

时间:2015-06-19 11:17:35

标签: c# sql-server performance asp.net-web-api edmx

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

价值:" 912345678"

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

价值:"迈克尔"

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

值:"街道号码10"

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

这个approuches有点慢,因为搜索一个有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();

我如何提高表现?

3 个答案:

答案 0 :(得分:13)

varchar / nvarchar字段中的通配符搜索会对符合条件的记录或多或少地迭代每个字符。

这类搜索的优秀(快速!)选项是:

  1. 制作全文目录以存储全文索引。
  2. 在您需要搜索的每个表格中的列上放置fulltext index
  3. 搜索时使用CONTAINS关键字而不是通配符。
  4. 你提到寻找可靠的消息来源,here是一个很好的阅读。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

要在EF中使用“赞”进行搜索,您可以使用包含()

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

但是通过这种搜索,你永远无法获得良好的表现。 您需要更改在数据库中搜索或存储数据的方式。 例如,如果您确定用户正在查找名称,则只能在“名称”列中搜索。