如果找不到搜索词,SQL查询将继续运行很长时间

前端之家收集整理的这篇文章主要介绍了如果找不到搜索词,SQL查询将继续运行很长时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的Azure托管的ASP.NET核心站点中,我有一个用户表,我实现了如下搜索
  1. var inner = from user in db.Users
  2. select new
  3. {
  4. Name = user.Name,Verified = user.Verified,PhotoURL = user.PhotoURL,UserID = user.Id,Subdomain = user.Subdomain,Deleted=user.Deleted,AppearInSearch = user.AppearInSearch
  5. };
  6. return await inner.Where(u=>u.Name.Contains(name)&& !u.Deleted && u.AppearInSearch)
  7. .OrderByDescending(u => u.Verified)
  8. .Skip(page * recordsInPage)
  9. .Take(recordsInPage)
  10. .Select(u => new UserSearchResult()
  11. {
  12. Name = u.Name,Verified = u.Verified,PhotoURL = u.PhotoURL,UserID = u.UserID,Subdomain = u.Subdomain
  13. }).ToListAsync();

这转换为类似于以下内容sql语句:

  1. SELECT [t].[Name],[t].[Verified],[t].[PhotoURL],[t].[Id],[t].[Subdomain],[t].[Deleted],[t].[AppearInSearch]
  2. FROM (
  3. SELECT [user0].[Name],[user0].[Verified],[user0].[PhotoURL],[user0].[Id],[user0].[Subdomain],[user0].[Deleted],[user0].[AppearInSearch]
  4. FROM [AspNetUsers] AS [user0]
  5. WHERE (((CHARINDEX('khaled',[user0].[Name]) > 0) OR ('khaled' = N''))
  6. AND ([user0].[Deleted] = 0))
  7. AND ([user0].[AppearInSearch] = 1)
  8. ORDER BY [user0].[Verified] DESC
  9. OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY ) AS [t]

如果搜索项在数据库中可用,则结果将在不到一秒的时间内获得.
但是,如果没有找到该查询运行很长时间(我已经看到它一次达到48秒).

当我们将此功能发布到互联网时,这会极大地影响性能.

你能否提出解决这个问题的方法

谢谢

更新:此问题在此处继续:Empty Login Name When Showing sys.processes

解决方法

您已经可以像这样简化查询;):
  1. int start=page * recordsInPage;
  2.  
  3. var inner = (from user in db.Users
  4. where user.Name.Contains(name) && !user.Deleted && user.AppearInSearch
  5. orderby user.Verified descending
  6. select new
  7. {
  8. Name = user.Name,AppearInSearch = user.AppearInSearch
  9. }
  10. ).Skip(start).Take(recordsInPage);
  11.  
  12. return await inner.ToListAsync();

如果遇到性能问题,请尝试使用sql创建存储过程并将其与实体框架一起使用.

猜你在找的MsSQL相关文章